默认情况下,每个JSF FacesMessage
都是在单行中显示的。我想在消息本身中添加一个HTML换行符<br />
,以便消息可以整齐地显示。我已经尝试了以下方式:
message = new FacesMessage("test<br/>test");
然而,它被JSF转义并显示为文字。我该如何将HTML代码添加到FacesMessage
中而不会被转义?
默认情况下,每个JSF FacesMessage
都是在单行中显示的。我想在消息本身中添加一个HTML换行符<br />
,以便消息可以整齐地显示。我已经尝试了以下方式:
message = new FacesMessage("test<br/>test");
然而,它被JSF转义并显示为文字。我该如何将HTML代码添加到FacesMessage
中而不会被转义?
理论上,你希望 h:messages
组件拥有一个类似于 h:outputText
的 escape
属性。你并不是唯一一个这样希望的人,这个请求经常被提出,但JSF团队认为这是不会修复的。
你有几种选择:
Use \n
instead of <br>
and apply CSS accordingly (easiest).
#messages td { white-space: pre; }
Create a custom renderer which extends MessageRenderer
(bit harder, but nice if you want to cover more HTML than only linebreaks).
Gather the messages yourself in some List
in a bean and display them using <t:dataList>
, or when you're already using Facelets instead of JSP, using <ui:repeat>
. This way you can use <h:outputText escape="false">
to display the individual messages.
Or, when you're already on JSF 2.0, just iterate over FacesContext#getMessageList()
yourself. Each item gives you a FacesMessage
back which in turn offers several getters. You could then display the summary in a <h:outputText escape"false" />
.
<ul>
<ui:repeat value="#{facesContext.messageList}" var="facesMessage">
<li>
<h:outputText value="#{facesMessage.summary}" escape="false" />
</li>
</ui:repeat>
</ul>
Or, when you're using JSF utility library OmniFaces, use its <o:messages>
component instead which has support for escape
attribute.
<o:messages escape="false" />
Primefaces 5.3支持FacesMessages上的HTML,只需在messages
组件中设置escape="false"
即可:
<p:messages escape="false"/>
p:growl
也支持这个功能。
我按照这篇博客的步骤操作。
StringBuilder sb = new StringBuilder("<html><body>");
sb.append("<p>A list of messages are:</p>");
for(String str : listMessages){
sb.append("Message: ").append(str).append("<br/>");
}
sb.append("</body></html>");
FacesMessage message = new FacesMessage(sb.toString());
message.setSeverity(FacesMessage.SEVERITY_INFO);
FacesContext.getCurrentInstance().addMessage("", message);
<html>
和<body>
标签,并正确关闭它们,就像有效的HTML一样。否则,HTML标记将出现在对话框中作为文本。