Как добавить HTML-код в JSF FacesMessage
по умолчанию каждый JSF FacesMessage
представлена в одной строке. Я хотел бы добавить разрыв строки HTML <br />
к самому сообщению, так что сообщение отображается аккуратно. Я попробовал это, как ниже
message = new FacesMessage("test<br/>test");
однако он был экранирован JSF и показан как буквальный текст. Как добавить HTML-код в FacesMessage
без его побега?
4 ответов
теоретически, вы хотите на h:messages
компонент, как h:outputText
есть. Вы не единственный, кто этого хочет, это запрашивается раньше, чем часто, но это WONTFIX по словам парней JSF.
у вас есть несколько вариантов:
-
использовать
\n
вместо<br>
и применить CSS соответственно (самый простой).#messages td { white-space: pre; }
создать пользовательский рендерер которая расширяет
MessageRenderer
(немного сложнее, но приятно, если вы хотите покрыть больше HTML, чем только linebreaks).соберите сообщения самостоятельно в некоторых
List
в бобе и отображать их с помощью<t:dataList>
, или когда вы уже используете Facelets вместо JSP, используя<ui:repeat>
. Таким образом, вы можете использовать<h:outputText escape="false">
для отображения отдельных сообщений.-
или, когда вы уже на JSF 2.0, просто повторите
FacesContext#getMessageList()
себя. Каждый элемент дает вамFacesMessage
назад, который в свою очередь предлагает несколько геттеров. Затем вы можете отобразить сводку в<h:outputText escape"false" />
.<ul> <ui:repeat value="#{facesContext.messageList}" var="facesMessage"> <li> <h:outputText value="#{facesMessage.summary}" escape="false" /> </li> </ui:repeat> </ul>
-
или, когда вы используете служебную библиотеку JSF OmniFaces использовать
<o:messages>
компонент вместо этого, который имеет поддержку .<o:messages escape="false" />
Primefaces 5.3 поддержка HTML на FacesMessages, просто установка escape="false"
at messages
компоненты:
<p:messages escape="false"/>
на p:growl
поддерживает это тоже btw.
я следовал этой блог.
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);
ключ не пропустить <html>
и <body>
теги и закрытие их должным образом, как допустимый HTML. В противном случае HTML-теги отображаются в виде текста в диалоговом окне.