我在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 />
?
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使它对sanitize敏感。更好的选择是继续使用\n
并将CSS white-space
property设置为在父元素上预格式化。如果您想在行元素的上下文中包含行,请设置pre-wrap
。或者,如果您还要折叠空格和制表符,请设置pre-line
。
EG
<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
white-space: pre-wrap;
}
这是正常行为,在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
以前的答案给我带来了大量文本的问题,比如极宽的输出(没有文字换行),style="white-space: pre-wrap"
没有修复;或者它只是将<br/>
显示为文本,而不是行结尾。
最后,我使用h:inputTextarea
组件显示文本并使其“只读”,直接工作而不替换换行符,也不必使用额外的样式或styleClasses。并且,它可以调整以适应用户的需求,这是一个奖励。
<h:inputTextarea cols="70" rows="10" readonly="true" value="#{bean.text}" />
对于少量文本,我发现pre-wrap
选项,正如上面的henko所建议的,运行良好。