it-swarm.com.de

h: outputText bricht \ r \ n Zeichen nicht in neue Zeilen

Ich habe Text in einer String -Variablen, die Zeilenumbrüche und neue Zeilen enthält \r\n.

text = "Text1\r\nText2\r\nText3";

Ich präsentiere es mit einem <h:outputtext>.

<h:outputText value="#{bean.text}" />

Die neuen Zeilenzeichen werden jedoch nicht erkannt und im Webbrowser wie unten dargestellt angezeigt.

Text1 Text2 Text3

Warum bricht der <h:outputText>\n Nicht in neue Zeilen auf?

Was sollte ich tun? Muss ich \n Durch <br /> Ersetzen?

48
Pellizon

Zeilenumbrüche in HTML werden durch das Element <br /> Dargestellt, nicht durch das Zeichen \n. Öffnen Sie außerdem den durchschnittlichen HTML-Quellcode, indem Sie mit der rechten Maustaste auf klicken. Zeigen Sie den Quellcode im Browser an, und Sie werden \n Überall sehen . Sie werden jedoch in der endgültigen HTML-Präsentation nicht als solche dargestellt. Nur der <br /> Wird.

Also, ja, Sie müssen sie durch <br /> Ersetzen.

<h:outputText value="#{fn:replace(bean.text,'\n','&lt;br/&gt;')}" escape="false" />

Hinweis: Wenn Sie Apache EL anstelle von Oracle EL verwenden, müssen Sie den umgekehrten Schrägstrich wie in \\n Doppelt maskieren.

<h:outputText value="#{fn:replace(bean.text,'\\n','&lt;br/&gt;')}" escape="false" />

Andernfalls tritt eine Ausnahme mit der Meldung Failed to parse the expression with root cause org.Apache.el.parser.ParseException: Encountered <ILLEGAL_CHARACTER> Auf.

Dies alles ist jedoch hässlich und der escape="false" Macht es empfindlich für XSS-Angriffe , wenn der Wert von der Eingabe des Endbenutzers stammt und Sie ihn nicht bereinigen im Voraus. Eine bessere Alternative ist, weiterhin \n Zu verwenden und CSS white-space - Eigenschaft für das übergeordnete Element vorformatiert einzustellen. Wenn Sie Zeilen innerhalb des Kontexts eines Blockelements umbrechen möchten, setzen Sie pre-wrap. Oder wenn Sie auch Leerzeichen und Tabulatoren reduzieren möchten, setzen Sie pre-line.

Z.B.

<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
    white-space: pre-wrap;
}
104
BalusC

Dies ist ein normales Verhalten. In HTML werden aufeinanderfolgende Leerzeichen wie Leerzeichen und Zeilenumbrüche normalisiert, sodass sie nur als einzelnes Leerzeichen angezeigt werden. Sie würden die gleiche Anzeige erhalten, wenn Sie den Text mit Zeilenumbrüchen direkt in die HTML-Quelle aufnehmen würden. Um Zeilenumbrüche in der Ausgabe zu berücksichtigen, müssten Sie den Text in pre -Tags einschließen oder eine Stylesheet-Klasse anwenden:

<pre><h:outputText value="..."/></pre>

<div style="white-space: pre-wrap"><h:outputText value="..."/></div>

Für andere mögliche Werte für das white-space Attribut siehe auf dieser Seite: http://www.w3schools.com/cssref/pr_text_white-space.asp

10
Jörn Horstmann

Die vorherigen Antworten verursachten für mich Probleme bei großen Textmengen, z. B. bei extrem breiten Ausgaben (kein Zeilenumbruch), die style="white-space: pre-wrap" nicht behoben; oder es zeigte nur die &lt;br/&gt; als Text, nicht als Zeilenende.

Am Ende habe ich das h:inputTextarea -Komponente, die den Text anzeigt und ihn "schreibgeschützt" macht, ohne die Zeilenumbrüche zu ersetzen und ohne die zusätzlichen Stile oder styleClasses verwenden zu müssen. Und die Größe kann an die Bedürfnisse des Benutzers angepasst werden, was ein Bonus ist.

<h:inputTextarea cols="70" rows="10" readonly="true" value="#{bean.text}" /> 

Für kleine Textmengen fand ich das pre-wrap Option, wie von Henko oben vorgeschlagen, um gut zu arbeiten.

6
Robbie62