Как добавить HTML-код в JSF FacesMessage

по умолчанию каждый JSF FacesMessage представлена в одной строке. Я хотел бы добавить разрыв строки HTML <br /> к самому сообщению, так что сообщение отображается аккуратно. Я попробовал это, как ниже

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

однако он был экранирован JSF и показан как буквальный текст. Как добавить HTML-код в FacesMessage без его побега?

4 ответов


теоретически, вы хотите на h:messages компонент, как h:outputText есть. Вы не единственный, кто этого хочет, это запрашивается раньше, чем часто, но это WONTFIX по словам парней JSF.

у вас есть несколько вариантов:

  1. использовать \n вместо <br> и применить CSS соответственно (самый простой).

    #messages td { white-space: pre; }
    
  2. создать пользовательский рендерер которая расширяет MessageRenderer (немного сложнее, но приятно, если вы хотите покрыть больше HTML, чем только linebreaks).

  3. соберите сообщения самостоятельно в некоторых List в бобе и отображать их с помощью <t:dataList>, или когда вы уже используете Facelets вместо JSP, используя <ui:repeat>. Таким образом, вы можете использовать <h:outputText escape="false"> для отображения отдельных сообщений.

  4. или, когда вы уже на 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>
    
  5. или, когда вы используете служебную библиотеку 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-теги отображаются в виде текста в диалоговом окне.


используйте класс CSS для форматирования сообщения, как BalusC сказал вам в предыдущем вопросе:

отображение сообщений об ошибках JSF