JSF 2.0自定义消息

时间:2011-02-14 00:32:51

标签: java jsf jsf-2 facelets message

我正在使用JSF 2.0。我正在使用

<h:messages>

标记以呈现错误消息。我可以使用css来设置我的消息的样式,但是我创建了一个复合组件来呈现可以关闭的消息,并使用一些Jquery为它们添加效果。

我见过有关如何自定义消息的教程,但大多数都依赖于CSS并自定义文本输出但我想要做的是生成特定的标记,如

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

而不是常规消息标记。 这可能吗?

编辑:

我不想设置jsf消息的样式。既不添加背景也不改变其风格,而是创建我自己的消息html标记。这里:

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

我找到了如何在邮件中添加html。我想要的是封装我的复合组件中的所有html,然后以这种方式使用我的复合组件:

<mycomp:messages/>

<mycomp:message for="componentID" />

其中消息和消息都创建自己的html标记

3 个答案:

答案 0 :(得分:12)

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标记。


它还允许您在<h:outputText escape="false">的帮助下将它们打印为HTML。我可能需要迟早扩展和修改我的博客文章:)

答案 1 :(得分:2)

回复如何将组件设置为消息渲染器:

您的组件需要扩展HtmlBasicRenderer。

然后,您可以将渲染器添加到faces-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>

答案 2 :(得分:1)

我知道已经有一段时间了,但我想为了别人的利益分享这个替代解决方案。对于复合,使用getter创建支持组件,然后迭代faces消息并在收集每条消息后调用remove()。这将使您在没有h:消息黑客的情况下绕过“消息排队”警告。

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;
    }       
}

请注意,xhtml中的componentType设置为代码中的FacesComponent值。此外,对cc.messageList的引用将触发对getMessageList()的调用。

希望这有帮助。