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

时间:2013-02-01 13:23:53

标签: jsf output line-breaks

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

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

我使用<h:outputtext>来展示它。

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

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

  

Text1 Text2 Text3

为什么<h:outputText>不会将\n分成新行?

我该怎么办?我是否必须将\n替换为<br />

3 个答案:

答案 0 :(得分:103)

HTML中的换行符由<br />元素表示,而不是由\n字符表示。更重要的是,在浏览器中通过右键单击查看源打开普通HTML源代码,然后在所有位置“看到”\n。但是,它们不会在最终的HTML演示文稿中显示。只有<br />会。

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

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

注意:使用Apache EL而不是Oracle EL时,请使用\\n中的反斜杠双重转义。

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

否则,您将遇到消息Failed to parse the expression with root cause org.apache.el.parser.ParseException: Encountered <ILLEGAL_CHARACTER>

的异常

这一切都很难看,escape="false"如果值来自最终用户输入并且您事先没有XSS attacks,则\n会对sanitize敏感。更好的选择是继续使用pre-wrap并将CSS white-space property设置为在父元素上预先格式化。如果您想在行元素的上下文中包含行,请设置pre-line。或者,如果您还要折叠空格和制表符,请设置<h:outputText value="#{bean.text}" styleClass="preformatted" />

E.g。

.preformatted {
    white-space: pre-wrap;
}
{{1}}

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:5)

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

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

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

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