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

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

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

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

Ответы

Ответ 1

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

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

  • Используйте \n вместо <br> и примените CSS соответственно (проще всего).

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

  • Соберите сообщения самостоятельно в List в bean и покажите их с помощью <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> компонент, который поддерживает атрибут escape.

    <o:messages escape="false" />
    

Ответ 2

Направляющие 5.3 поддерживают HTML на FacesMessages, просто устанавливая escape="false" в messages:

<p:messages escape="false"/>

Ответ 3

Я следил за этот блог.

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-теги отображаются в виде текста в диалоговом окне.