h: outputText nie pęka znaki w nowe linie

Mam trochę tekstu w zmiennej String, która zawiera zwroty karetki i nowe linie \r\n.

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

Przedstawiam go za pomocą <h:outputtext>.

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

Ale nie rozpoznaje nowych znaków linii i pokazuje się jak poniżej w webbrowserze.

Text1 Text2 Text3

Dlaczego <h:outputText> nie rozbija \n na nowe linie?

Co mam zrobić? Czy muszę wymieniać \n na <br />?
Author: BalusC, 2013-02-01

3 answers

Linebreaks w HTML są reprezentowane przez element <br />, a nie przez znak \n. Co więcej, otwórz Przeciętny kod źródłowy HTML przez rightclick, Zobacz źródło w przeglądarce, a "zobaczysz" \n na całym miejscu. Nie są one jednak prezentowane jako takie w ostatecznej prezentacji HTML. Tylko <br /> będzie.

Więc tak, musisz je zastąpić <br />.

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

Uwaga: Podczas używania Apache EL zamiast Oracle EL, unikaj ukośnika tak jak w \\n.

To jest jednak brzydki i escape="false" sprawia, że jest wrażliwy na ataki XSS, Jeśli wartość pochodzi z wejścia użytkownika końcowego, a ty nie dezynfekujesz wcześniej. Lepszą alternatywą jest używanie \n i ustawienie CSS white-space właściwości na preformatowanym elemencie nadrzędnym. Jeśli chcesz zawinąć linie wewnątrz kontekstu elementu blokowego, Ustaw pre-wrap. Lub jeśli chcesz zwinąć spacje i tabulatory, Ustaw pre-line.

Np.

<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
    white-space: pre-wrap;
}
 96
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-22 07:18:05

Jest to normalne zachowanie, w HTML kolejne białe spacje, takie jak spacje i przełamania linii, zostają znormalizowane, więc wyświetlane są tylko jako pojedyncza spacja. Otrzymałbyś ten sam wyświetlacz, jeśli umieściłbyś tekst z linebreaks bezpośrednio w źródle HTML. Aby wyróżnić linebreaks w wyjściu, musisz zawinąć tekst w znaczniki pre lub zastosować klasę arkusza stylów:

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

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

Dla innych możliwych wartości atrybutu white-space zajrzyj na tę stronę: http://www.w3schools.com/cssref/pr_text_white-space.asp

 10
Author: Jörn Horstmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-01 13:52:11

Poprzednie odpowiedzi sprawiały mi problemy z dużą ilością tekstu, jak bardzo szerokie wyjście (bez zawijania tekstu), którego style="white-space: pre-wrap" nie Naprawiono; lub po prostu wyświetlał &lt;br/&gt; jako tekst, a nie jako końcówkę linii.

W końcu użyłem komponentu h:inputTextarea do wyświetlania tekstu i zrobiłem go "tylko do odczytu", który działał od razu bez zastępowania podziałów wierszy, ani konieczności używania dodatkowych stylów lub klas stylów. I można go zmienić w zależności od potrzeb użytkownika, co jest bonus.

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

W przypadku niewielkich ilości tekstu znalazłem opcję pre-wrap, jak zasugerował henko powyżej, która działa dobrze.

 4
Author: Robbie62,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 00:04:09