52

我有一个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 />

4

3 回答 3

116

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','&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>

然而,这一切都很丑陋,如果值来自最终用户输入并且您没有事先对其进行清理,那么它对XSS 攻击escape="false"很敏感。更好的选择是继续使用CSS属性并将其设置为在父元素上预先格式化。如果您想在块元素的上下文中换行,请设置. 或者,如果您还想折叠空格和制表符,请设置.\nwhite-spacepre-wrappre-line

例如

<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
    white-space: pre-wrap;
}
于 2013-02-01T13:51:19.663 回答
12

这是正常的行为,在 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

于 2013-02-01T13:52:11.820 回答
6

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

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

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

对于少量文本,我发现pre-wrap上面 henko 建议的选项效果很好。

于 2014-10-22T23:06:13.633 回答