我正在使用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标记
答案 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()的调用。
希望这有帮助。