我有一个String
包含回车和换行符的变量\r\n
。
text = "Text1\r\nText2\r\nText3";
我正在使用<h:outputtext>
.
<h:outputText value="#{bean.text}" />
但它不识别换行符,并在 webbrowser 中显示如下。
文本 1 文本 2 文本 3
为什么不<h:outputText>
换\n
行?
我该怎么办?我必须用 替换\n
吗<br />
?
我有一个String
包含回车和换行符的变量\r\n
。
text = "Text1\r\nText2\r\nText3";
我正在使用<h:outputtext>
.
<h:outputText value="#{bean.text}" />
但它不识别换行符,并在 webbrowser 中显示如下。
文本 1 文本 2 文本 3
为什么不<h:outputText>
换\n
行?
我该怎么办?我必须用 替换\n
吗<br />
?
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" />
注意:当使用 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>
。
然而,这一切都很丑陋,如果值来自最终用户输入并且您没有事先对其进行清理,那么它对XSS 攻击escape="false"
很敏感。更好的选择是继续使用CSS属性并将其设置为在父元素上预先格式化。如果您想在块元素的上下文中换行,请设置. 或者,如果您还想折叠空格和制表符,请设置.\n
white-space
pre-wrap
pre-line
例如
<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 建议的选项效果很好。