我在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 />
?
答案 0 :(得分:103)
HTML中的换行符由<br />
元素表示,而不是由\n
字符表示。更重要的是,在浏览器中通过右键单击查看源打开普通HTML源代码,然后在所有位置“看到”\n
。但是,它们不会在最终的HTML演示文稿中显示。只有<br />
会。
所以,是的,你需要用<br />
替换它们。
<h:outputText value="#{fn:replace(bean.text,'\n','<br/>')}" escape="false" />
注意:使用Apache EL而不是Oracle 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>
。
这一切都很难看,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"
没有修复;或者只是将<br/>
显示为文本,而不是行结尾。
最后,我使用h:inputTextarea
组件显示文字,并将其设为“只读”。它直接工作而不替换换行符,也不必使用额外的样式或styleClasses。并且,它可以调整以适应用户的需求,这是一个奖励。
<h:inputTextarea cols="70" rows="10" readonly="true" value="#{bean.text}" />
对于少量文字,我发现上面的henko建议的pre-wrap
选项可以很好地运作。