2013-11-01 1 views
3

Я хотел бы создать настраиваемый визуализатор сообщений для рендеринга h: message как элемент 'p' html, а не как элемент 'span'. Это относится к следующему тегу сообщения:Render JSF h: сообщение с p-элементом вместо span

<h:message id="firstNameErrorMsg" for="firstname" class="error-msg" /> 

я написал закодировать внизу, но это только делает пустой элемент «р». Я полагаю, что мне нужно скопировать все атрибуты и текст из исходного компонента и записать его автору. Тем не менее, я не знаю, где найти все, и, похоже, это большая работа для замены бирки.

Есть ли лучший способ получить h: тег сообщения, отображаемый как элемент 'p'?

Код:

@FacesRenderer(componentFamily = "javax.faces.Message", rendererType = "javax.faces.Message") 
public class FoutmeldingRenderer extends Renderer { 

    @Override 
    public void encodeEnd(final FacesContext context, final UIComponent component) throws IOException { 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.startElement("p", component); 
     writer.endElement("p"); 

    } 
} 

ответ

4

Это не совсем "много работы". Это в основном вопрос расширения от стандартного средства отображения сообщений JSF, копирование его метода encodeEnd(), состоящего из 200 строк, а затем редактирование только 2 строк для замены "span" на "p". Это можно сделать менее чем за минуту.

Но да, я согласен, что это простой уродливый подход.

Вы можете рассмотреть следующие альтернативные варианты, которые не обязательно являются более легкими, но, по крайней мере, более чистым:

  1. Прежде всего, что значение использования <p> вместо <span> в данном конкретном случае semantic ? Честно говоря, я не вижу смысла в семантике. Поэтому я предлагаю просто оставить его <span>. Если единственное функциональное требование - дать ему , как <p>, то просто введите CSS. Например.

    .error-msg { 
        display: block; 
        margin: 1em 0; 
    } 
    

  2. Вы можете получить все сообщения для определенного идентификатора клиента непосредственно в EL следующим образом, если предположить, что родительская форма имеет идентификатор formId:

    #{facesContext.getMessageList('formId:firstName')} 
    

    Так, чтобы напечатать резюме и деталь первого сообщения, просто выполните:

    <c:set var="message" value="#{facesContext.getMessageList('formId:firstName')[0]}" /> 
    <p title="#{message.detail}">#{message.summary}</p> 
    

    Вы всегда можете скрыть это прочь в пользовательский файл тегов, как так:

    <my:message id="firstNameErrorMsg" for="firstname" class="error-msg" /> 
    

  3. Использование OmniFaces <o:messages>. Когда указан атрибут var, вы можете использовать его как <ui:repeat>.

    <o:messages for="firstNameErrorMsg" var="message"> 
        <p title="#{message.detail}">#{message.summary}</p> 
    </o:messages> 
    
+0

Привет BalusC, Спасибо за возможности для решения моей проблемы вы предложили. Я использовал первый, который вы передали, главным образом потому, что он был самым быстрым и, действительно, самым простым. Гигантские размеры различных таблиц стилей, за которые я вынужден работать, и нежелание владельцев позволить мне их изменить, также не позволяло мне перейти на вариант css. Кроме того, я уже использую какую-либо другую библиотеку тегов jsf, чем OmniFaces, поэтому не могу использовать опцию OmniFaces. Еще раз спасибо, Kees –

+0

OmniFaces - это не библиотека компонентов, а полезная библиотека и по существу совместимая с каждой библиотекой компонентов. Вы можете использовать его в сочетании с PrimeFaces, RichFaces, ICEFaces и т. Д. – BalusC