jsf - :outputText does not break\r\n characters into new lines

标签 jsf output line-breaks

我有一个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','&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在父元素上预先格式化。如果您想在 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/

相关文章:

jquery - 当 contenteditable 从 true 设置为 false 时,哪些 css 属性会发生变化?

java - Primefaces 树集复选框

jsf - SelectOneRadio重设tabindex计数中的selectItem

java - jsf 应用程序在 jboss 上抛出 java.awt.headlessException

c - 这个 printf() 语句的输出是如何计算的?

bash - 无法在脚本中静音解压缩输出

java - 这个 Java 程序的输出

java - 帮助在现有的 jsf 项目中创建 servlet

html - 如何使 jquery-ui 标签没有换行符?

jquery - 在第一行中断后隐藏文本? (不是 <br/>,而是被浏览器包裹)