我已经在一些文本String
包含回车和新线变\r\n
。
text = "Text1\r\nText2\r\nText3";
我使用呈现它<h:outputtext>
<h:outputText value="#{bean.text}" />
但它不承认新行字符,并显示如下的网页浏览器。
文本1文本2文本3
为什么<h:outputText>
不破\n
进入新的线路?
我该怎么办? 我一定要取代\n
与<br />
?
我已经在一些文本String
包含回车和新线变\r\n
。
text = "Text1\r\nText2\r\nText3";
我使用呈现它<h:outputtext>
<h:outputText value="#{bean.text}" />
但它不承认新行字符,并显示如下的网页浏览器。
文本1文本2文本3
为什么<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,而不是甲骨文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攻击 ,如果该值来自最终用户的输入,你不消毒事前它。 更好的选择是使用保持\n
,并设置CSS 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
选项,通过江恒光的建议以上,运行良好。