HTML の改行は<br />
、文字ではなく要素で表されます\n
。さらに、平均的な HTML ソース コードを右クリックして開き、ブラウザでソースを表示すると、すべての場所が「表示」\n
されます。ただし、それらは最終的な HTML プレゼンテーションではそのままでは表示されません。意志だけ<br />
。
したがって、はい、それらを に置き換える必要があります<br />
。これにはJSTL 関数を使用できます。
<... xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions">
<h:outputText value="#{fn:replace(bean.text,'\n','<br/>')}" escape="false" />
注: Oracle EL の代わりに Apache EL を使用する場合は、 のようにバックスラッシュをダブルエスケープします\\n
。
<h:outputText value="#{fn:replace(bean.text,'\\n','<br/>')}" escape="false" />
そうしないと、例外が発生し、メッセージが表示されますFailed to parse the expression with root cause org.apache.el.parser.ParseException: Encountered <ILLEGAL_CHARACTER>
。
ただし、これはすべて醜く、値がエンドユーザーの入力から取得され、事前にサニタイズしないと、XSS 攻撃escape="false"
に対して敏感になります。より良い代替手段は、 CSSプロパティを使用し続け、親要素で preformatted に設定することです。ブロック要素のコンテキスト内で行を折り返す場合は、 を設定します。または、スペースとタブも折りたたむ場合は、 を設定します。\n
white-space
pre-wrap
pre-line
例えば
<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
white-space: pre-wrap;
}