我有一个String
包含回车符和换行符的变量 \r\n
.
text = "Text1\r\nText2\r\nText3";
我使用 <h:outputtext>
来呈现它.
<h:outputText value="#{bean.text}" />
但它无法识别换行符,并在网络浏览器中显示如下。
Text1 Text2 Text3
为什么 <h:outputText>
没有打破\n
进入新行?
我该怎么办?我必须更换\n
与 <br />
?
最佳答案
HTML 中的换行符由 <br />
表示元素,而不是 \n
特点。更重要的是,通过右键单击打开普通 HTML 源代码,在浏览器中查看源代码,您将“看到”\n
遍及所有地方。然而,它们并没有在最终的 HTML 演示中呈现出来。只有<br />
会的。
所以,是的,您需要将它们替换为 <br />
。您可以使用JSTL functions为此:
<... 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>
.
这一切都很丑陋,escape="false"
使其对 XSS attacks 敏感如果该值来自最终用户输入而您不这样做sanitize事先。更好的选择是继续使用 \n
并设置CSS white-space
property在父元素上预先格式化。如果您想在 block 元素的上下文中换行,请设置 pre-wrap
。或者,如果您还想折叠空格和制表符,请设置 pre-line
。
例如
<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
white-space: pre-wrap;
}
关于jsf - :outputText does not break\r\n characters into new lines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647274/