如何将HTML代码添加到JSF FacesMessage

19

默认情况下,每个JSF FacesMessage 都是在单行中显示的。我想在消息本身中添加一个HTML换行符<br />,以便消息可以整齐地显示。我已经尝试了以下方式:

message = new FacesMessage("test<br/>test");

然而,它被JSF转义并显示为文字。我该如何将HTML代码添加到FacesMessage中而不会被转义?


这不是与 https://dev59.com/uk7Sa4cB1Zd3GeqP7eE4 相同的问题吗? - pakore
4个回答

32

理论上,你希望 h:messages 组件拥有一个类似于 h:outputText escape 属性。你并不是唯一一个这样希望的人,这个请求经常被提出,但JSF团队认为这是不会修复的。

你有几种选择:

  1. Use \n instead of <br> and apply CSS accordingly (easiest).

    #messages td { white-space: pre; }
    
  2. Create a custom renderer which extends MessageRenderer (bit harder, but nice if you want to cover more HTML than only linebreaks).

  3. 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.

  4. 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>
    
  5. 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" />
    

1
当您使用JSF 2.0时,您还可以使用OmniFaces <o:messages>组件,并带有escape="false"属性。 - Adam
@BalusC,你想要链接WONTFIX问题吗?我不确定。 - alexander

4

Primefaces 5.3支持FacesMessages上的HTML,只需在messages组件中设置escape="false"即可:

<p:messages escape="false"/>

p:growl 也支持这个功能。


2

我按照这篇博客的步骤操作。

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标记将出现在对话框中作为文本。

0
使用CSS类来格式化消息,就像BalusC在你之前的问题中告诉你的那样:

显示JSF错误消息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接