Пользовательские сообщения JSF 2.0 - PullRequest
6 голосов
/ 14 февраля 2011

Я использую JSF 2.0. Я использую

<h:messages>

тег для отображения сообщений об ошибках. Я могу немного использовать css для стилизации своих сообщений, но я создал составной компонент для рендеринга сообщений, которые можно закрыть, и добавления эффектов к ним с помощью некоторого Jquery.

Я видел учебные пособия по настройке сообщений, но большинство из них основаны на css и настройке вывода текста, но я хочу создать конкретную разметку, что-то вроде

<myComp:fancyMessage text="etcetcetc error msg" type="error" />

вместо обычной разметки сообщений. Возможно ли это?

EDIT:

Я не хочу стилизовать сообщения jsf. Не добавляйте фон и не меняйте его стиль, а создайте собственную разметку html своего сообщения. Здесь:

http://balusc.blogspot.com/2010/07/using-html-in-jsf-messages.html

Я нашел, как добавить html в ваши сообщения. Я хочу заключить в капсулу все html в моем составном компоненте, а затем просто использовать составной компонент следующим образом:

<mycomp:messages/>

или

<mycomp:message for="componentID" />

где сообщение и сообщения создают собственную html-разметку

Ответы [ 3 ]

12 голосов
/ 18 февраля 2011

Использование FacesContext#getMessageList() внутри ui:repeat.Каждый элемент представляет собой FacesMessage с несколькими получателями.

<ui:repeat value="#{facesContext.messageList}" var="facesMessage">
    Severity: #{facesMessage.severity}<br />
    Summary: #{facesMessage.summary}<br />
    Detail: #{facesMessage.detail}<br />
    <br />
</ui:repeat>

Это позволяет более детально разметить HTML-разметку вокруг сообщений.


А также позволяет печатать их в формате HTML с помощью <h:outputText escape="false">.Возможно, мне рано или поздно придется расширить и отредактировать мою статью в блоге:)

2 голосов
/ 22 февраля 2011

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

Ваш компонент должен расширять HtmlBasicRenderer.

Затем вы можете добавить свой рендерер в Face-config.xml

<render-kit>
    <renderer>
        <component-family>javax.faces.Messages</component-family>
        <renderer-type>javax.faces.Messages</renderer-type>
        <renderer-class>com.mypackage.MessagesRenderer</renderer-class>
    </renderer>
</render-kit>
1 голос
/ 13 февраля 2013

Я знаю, что это было давно, но подумал поделиться этим альтернативным решением для пользы других.Для композитов создайте вспомогательный компонент с геттером, затем переберите сообщения лиц и вызовите remove () после сбора каждого сообщения.Это поможет вам обойти предупреждение «очередь сообщений» без взлома h: messages.

xhtml:

<composite:interface displayName="Messages Component"
    shortDescription="Messages Component" componentType="com.company.dept.commons.ui.messages.Messages">
    <composite:attribute name="styleClass" default="" type="java.lang.String" shortDescription="CSS style class for the component" />
</composite:interface>

<composite:implementation>
    <div id="messagesComponent" class="#{cc.attrs.styleClass}">
        <ui:repeat value="#{cc.messageList}" var="message">
            #{message.severity} - #{message.detail}<br/>            
        </ui:repeat>
    </div>
</composite:implementation>

Вспомогательный компонент:

@FacesComponent("com.company.dept.commons.ui.messages.Messages")
public class Messages extends UINamingContainer {

    private List<FacesMessage> messages;

    public List<FacesMessage> getMessageList() {
        //preserve messages in case getter is called multiple times
        if (messages == null) {
            messages = new ArrayList<FacesMessage>();
        }

        Iterator<FacesMessage> messageItr = getFacesContext().getMessages();
        while(messageItr.hasNext()) {
            FacesMessage message = messageItr.next();
            messages.add(message);
            messageItr.remove();
        }
        return messages;
    }       
}

Обратите внимание, что для componentType в xhtml в коде установлено значение FacesComponent.Кроме того, ссылка на cc.messageList вызовет вызов getMessageList ().

Надеюсь, это поможет.

...