How do I add HTML code to JSF FacesMessage

gekrish picture gekrish · Jul 7, 2010 · Viewed 19.3k times · Source

By default, every JSF FacesMessage is presented in a single row. I would like to add a HTML line break <br /> to the message itself, so that the message is shown neatly. I tried it like below

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

However, it got escaped by JSF and is shown as literal text. How can I add HTML code to a FacesMessage without it getting escaped?

Answer

BalusC picture BalusC · Jul 7, 2010

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