2010-07-07 1 views
13

Standardmäßig wird jeder JSF FacesMessage in einer einzelnen Zeile dargestellt. Ich möchte einen HTML-Zeilenumbruch <br /> zu der Nachricht selbst hinzufügen, so dass die Nachricht sauber angezeigt wird. Ich habe versucht, es wie untenWie füge ich HTML-Code zu JSF hinzu FacesMessage

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

aber es wurde von JSF entkommen und wird als normaler Text angezeigt. Wie kann ich HTML-Code zu einem FacesMessage hinzufügen, ohne dass es entkommen kann?

+0

Ist das nicht die gleiche Frage wie in http://stackoverflow.com/questions/3186659/showing-the-jsf-error-messages? – pakore

Antwort

25

Theoretisch Sie wollen ein escape Attribut für die h:messages Komponente wie die h:outputText hat. Du bist nicht der Einzige, der das will, das ist mehr als oft gefragt, aber es ist ein WONTFIX nach den Jungs von JSF.

Sie haben mehrere Möglichkeiten:

  1. Verwenden \n statt <br> und anwenden CSS entsprechend (am einfachsten).

    #messages td { white-space: pre; } 
    
  2. Erstellen einer custom renderer die MessageRenderer erstreckt (härter wenig, aber schön, wenn Sie HTML mehr abdecken wollen als nur Zeilenumbrüche).

  3. Sammeln Sie die Nachrichten selbst in einigen List in einer Bohne und zeigt sie <t:dataList> benutzen, oder wenn Sie bereits Facelets statt JSP verwenden, mit <ui:repeat>. Auf diese Weise können Sie die einzelnen Nachrichten mit <h:outputText escape="false"> anzeigen.

  4. Oder, wenn Sie bereits auf JSF 2.0 sind, iterieren Sie einfach über FacesContext#getMessageList() selbst. Jeder Artikel gibt Ihnen eine FacesMessage zurück, die wiederum mehrere Getter bietet. Sie können dann die Zusammenfassung in einem <h:outputText escape"false" /> anzeigen.

    <ul> 
        <ui:repeat value="#{facesContext.messageList}" var="facesMessage"> 
         <li> 
          <h:outputText value="#{facesMessage.summary}" escape="false" /> 
         </li> 
        </ui:repeat> 
    </ul> 
    
  5. Oder wenn Sie JSF-Utility-Bibliothek OmniFaces verwenden, verwenden seine <o:messages> component stattdessen die Unterstützung für escape Attribut hat.

    <o:messages escape="false" /> 
    
+1

Wenn Sie auf JSF 2 sind.0, können Sie auch die Komponente OmniFaces [''] (http://showcase.omnifaces.org/components/messages) mit dem Attribut 'escape =" false "' verwenden. – Adam

+0

@BalusC Möchten Sie das WONTFIX-Problem verknüpfen oder nicht? Ich bin mir nicht sicher. – alexander

3

Primefaces 5.3 Unterstützung HTML auf FacesMessages, nur escape="false" bei messages Komponente Einstellung:

<p:messages escape="false"/> 
2

folgte ich 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); 

Der Schlüssel ist nicht die <html> und <body> Tags zu verpassen und sie richtig wie ein valides HTML schließen. Andernfalls werden HTML-Tags als Text im Dialogfeld angezeigt.