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

问题描述 投票:48回答:3

我在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 />

jsf output line-breaks
3个回答
104
投票

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使它对sanitize敏感。更好的选择是继续使用\n并将CSS white-space property设置为在父元素上预格式化。如果您想在行元素的上下文中包含行,请设置pre-wrap。或者,如果您还要折叠空格和制表符,请设置pre-line

EG

<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
    white-space: pre-wrap;
}

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


5
投票

以前的答案给我带来了大量文本的问题,比如极宽的输出(没有文字换行),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所建议的,运行良好。

© www.soinside.com 2019 - 2024. All rights reserved.