【问题标题】:How do I add HTML code to JSF FacesMessage如何将 HTML 代码添加到 JSF FacesMessage
【发布时间】:2011-03-12 20:11:23
【问题描述】:

默认情况下,每个 JSF FacesMessage 都显示在一行中。我想在消息本身中添加一个 HTML 换行符 <br />,以便整齐地显示消息。我试了如下

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

但是,它被 JSF 转义并显示为文字文本。如何将 HTML 代码添加到 FacesMessage 而不会被转义?

【问题讨论】:

标签: html jsf escaping message


【解决方案1】:

理论上,您需要h:messages 组件的escape 属性,就像h:outputText 一样。你不是唯一一个想要这个的人,这在以前经常被要求,但根据 JSF 的家伙,这是一个 WONTFIX。

您有多种选择:

  1. 使用 \n 而不是 &lt;br&gt; 并相应地应用 CSS(最简单)。

    #messages td { white-space: pre; }
    
  2. 创建一个扩展 MessageRenderercustom renderer(有点难,但如果你想覆盖更多的 HTML 而不仅仅是换行符,那就太好了)。

  3. 自己在 bean 中的一些 List 中收集消息并使用 &lt;t:dataList&gt; 显示它们,或者当您已经在使用 Facelets 而不是 JSP 时,使用 &lt;ui:repeat&gt;。这样您就可以使用&lt;h:outputText escape="false"&gt; 来显示各个消息。

  4. 或者,当您已经使用 JSF 2.0 时,只需自己迭代 FacesContext#getMessageList()。每个项目都会给你一个FacesMessage 背面,这反过来又提供了几个吸气剂。然后,您可以在 &lt;h:outputText escape"false" /&gt; 中显示摘要。

    <ul>
        <ui:repeat value="#{facesContext.messageList}" var="facesMessage">
            <li>
                <h:outputText value="#{facesMessage.summary}" escape="false" />
            </li>
        </ui:repeat>
    </ul>
    
  5. 或者,当您使用 JSF 实用程序库 OmniFaces 时,请改用支持 escape 属性的 &lt;o:messages&gt; component

    <o:messages escape="false" />
    

【讨论】:

  • 当您使用 JSF 2.0 时,您还可以使用带有 escape="false" 属性的 OmniFaces &lt;o:messages&gt; component
  • @BalusC 您是否要链接 WONTFIX 问题?我不确定。
【解决方案2】:

Primefaces 5.3 支持 FacesMessages 上的 HTML,只需将 escape="false" 设置为 messages 组件:

<p:messages escape="false"/>

p:growl 也支持这个。

【讨论】:

    【解决方案3】:

    我关注了this 博客。

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

    关键是不要错过&lt;html&gt;&lt;body&gt; 标签,并像有效的HTML 一样正确关闭它们。否则 HTML 标记会在对话框中显示为文本。

    【讨论】:

      【解决方案4】:

      使用 CSS 类来格式化消息,正如 BalusC 在上一个问题中告诉你的那样:

      Showing the JSF Error Messages

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 2015-07-05
        • 2018-01-07
        • 2011-05-16
        相关资源
        最近更新 更多