gekrish gekrish - 1 year ago 128
HTML Question

How do I add HTML code to JSF FacesMessage

By default, every JSF

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
without it getting escaped?

Answer Source

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

        <ui:repeat value="#{facesContext.messageList}" var="facesMessage">
                <h:outputText value="#{facesMessage.summary}" escape="false" />
  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" />