h:outputText不会将\ r \n字符分成新行

Pel*_*zon 48 jsf line-breaks output

我在String变量中有一些文本,其中包含回车符和新行\r\n.

text = "Text1\r\nText2\r\nText3";
Run Code Online (Sandbox Code Playgroud)

我用它来呈现它<h:outputtext>.

<h:outputText value="#{bean.text}" />
Run Code Online (Sandbox Code Playgroud)

但它无法识别新的行字符,并在webbrowser中显示如下.

Text1 Text2 Text3

为什么不<h:outputText>打破\n新线?

我该怎么办?我一定要更换\n<br />

Bal*_*usC 104

HTML中的换行符由<br />元素表示,而不是由\n字符表示.更重要的是,通过右键单击打开普通HTML源代码,在浏览器中查看源代码,您将"看到" \n所有地方.但是,它们不会在最终的HTML演示文稿中显示.只有<br />意志.

所以,是的,你需要替换它们<br />.

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

注意:使用Apache EL而不是Oracle EL时,请将斜杠双重转义为\\n.

然而,如果值来自最终用户输入并且您事先没有对其进行清理,则会Failed to parse the expression with root cause org.apache.el.parser.ParseException: Encountered <ILLEGAL_CHARACTER>使其对XSS攻击敏感.更好的选择是继续使用并将CSS 属性设置为在父元素上预先格式化.如果您想在行元素的上下文中包含行,则设置.或者,如果您想要折叠空格和制表符,请设置.escape="false"\nwhite-spacepre-wrap

例如

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

  • @JohnB:`<pre>#{bean.text} </ pre>` (3认同)
  • 别客气.使用`<pre>`也应该有效.但是,CSS可以操作`<pre>`标签的默认行为.所以如果你有一些你没有读过的第三方CSS,或者根本就不理解,那么可能是因为`<pre>`不再格式化了. (2认同)

Jör*_*ann 11

这是正常行为,在HTML连续空格(如空格和换行符)中进行了规范化,因此它只显示为单个空格.如果直接在HTML源中包含带有换行符的文本,则会显示相同的显示.要在输出中保证换行符,您必须将文本包装在pre标记中或应用样式表类:

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

<div style="white-space: pre-wrap"><h:outputText value="..."/></div>
Run Code Online (Sandbox Code Playgroud)

有关white-space属性的其他可能值,请查看此页面:http://www.w3schools.com/cssref/pr_text_white-space.asp


Rob*_*e62 6

以前的答案给我带来了大量文本的问题,比如极宽的输出(没有文本换行),style="white-space: pre-wrap"但没有修复; 或者它只是显示&lt;br/&gt;为文本,而不是行结尾.

最后,我使用该h:inputTextarea组件显示文本,并使其"只读",直接工作而不替换换行符,也不必使用额外的样式或styleClasses.并且,它可以调整以适应用户的需求,这是一个奖励.

<h:inputTextarea cols="70" rows="10" readonly="true" value="#{bean.text}" /> 
Run Code Online (Sandbox Code Playgroud)

对于少量文本,我发现pre-wrap上面的henko建议的选项可以很好地运行.