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?
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:
Use \n
instead of <br>
and apply CSS accordingly (easiest).
#messages td { white-space: pre; }
Create a custom renderer which extends MessageRenderer
(bit harder, but nice if you want to cover more HTML than only linebreaks).
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.
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>
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With