H:的outputText不破\\ \\ [R n个字符到新生产线(h:outputText doe

2019-07-19 03:36发布

我已经在一些文本String包含回车和新线变\r\n

text = "Text1\r\nText2\r\nText3";

我使用呈现它<h:outputtext>

<h:outputText value="#{bean.text}" />

但它不承认新行字符,并显示如下的网页浏览器。

文本1文本2文本3

为什么<h:outputText>不破\n进入新的线路?

我该怎么办? 我一定要取代\n<br />

Answer 1:

在HTML换行符由表示<br />元件,而不是由\n字符。 更有甚者,通过右击打开平均HTML源代码, 查看源文件浏览器,你会“看到” \n在所有的地方。 然而,它们不是在最终的HTML呈现呈现如此。 只有<br />意志。

所以,是的,你需要替换他们<br />

<h:outputText value="#{fn:replace(bean.text,'\n','&lt;br/&gt;')}" escape="false" />

注意:使用Apache EL,而不是甲骨文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攻击 ,如果该值来自最终用户的输入,你不消毒事前它。 更好的选择是使用保持\n ,并设置CSS white-space属性来预格式化父元素。 如果您想换块元素的上下文中的线条,然后设置pre-wrap 。 或者,如果你想崩溃空格和制表符,以及,然后将pre-line

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


Answer 2:

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



Answer 3:

以前的答案引起的问题对我来说大量的文本,像极宽的输出(无文本换行),其style="white-space: pre-wrap"没修好; 或它只是显示在&lt;br/&gt; 为文本,而不是作为一个行结束。

最后,我用的h:inputTextarea组件来显示文本,并使其作用后直客无需更换换行,也不必使用额外的样式或styleClasses“只读”。 而且,它是调整大小以适应用户的需求,这是一个意外收获。

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

对于少量的文本,我发现pre-wrap选项,通过江恒光的建议以上,运行良好。



文章来源: h:outputText does not break \\r\\n characters into new lines