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?
\n
na <br />
? 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','<br/>')}" 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;
}
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
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ł <br/>
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.
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