How do I add HTML code to JSF FacesMessage

In theory, you want an escape attribute for the h:messages component like the h:outputText has. You're not the only one who wants this, this is requested before more than often, but it's a WONTFIX according the JSF guys.

You have several options:

  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" />
    

Primefaces 5.3 support HTML on FacesMessages, just setting escape="false" at messages component:

<p:messages escape="false"/>

The p:growl supports this too btw.


I followed this blog.

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

The key is not to miss the <html> and <body> tags and closing them properly like a valid HTML. Otherwise HTML tags appear as text on the dialog.