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

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

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

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


person gekrish    schedule 07.07.2010    source источник
comment
Разве это не тот же вопрос, что и в stackoverflow.com/ вопросы/3186659/ ?   -  person pakore    schedule 07.07.2010


Ответы (4)


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

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

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

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

  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> component, который поддерживает атрибут escape.

    <o:messages escape="false" />
    
person BalusC    schedule 07.07.2010
comment
Если вы используете JSF 2.0, вы также можете использовать компонент OmniFaces <o:messages> с атрибутом escape="false". - person Adam; 16.01.2015
comment
@BalusC Вы хотите связать проблему WONTFIX или нет? Я не уверен. - person alexander; 23.02.2016

Primefaces 5.3 поддерживает HTML в FacesMessages, просто установив escape="false" в компоненте messages:

<p:messages escape="false"/>

Кстати, p:growl тоже поддерживает это.

person Frédéric Chopin    schedule 02.11.2015

Я подписался на этот блог .

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

person uutsav    schedule 18.11.2016

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

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

person pakore    schedule 07.07.2010