45

我有一个传递到我的 JSP 页面的 bean 对象列表,其中一个是注释字段。该字段可能包含换行符,我想使用 JSTL 将它们替换为分号,以便该字段可以显示在文本输入中。我找到了一种解决方案,但它不是很优雅。我将在下面发布作为一种可能性。

4

14 回答 14

55

这是我找到的解决方案。不过,它似乎不是很优雅:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newLineChar", "\n"); %>

${fn:replace(item.comments, newLineChar, "; ")}
于 2008-09-12T00:59:31.160 回答
19

只需使用fn:replace()函数替换\n;.

${fn:replace(data, '\n', ';')}

如果您使用 Apache 的 EL 实现而不是 Oracle 的 EL 参考实现(即当您使用 Tomcat、TomEE、JBoss 等而不是 GlassFish、Payara、WildFly、WebSphere 等时),那么您需要重新转义反斜杠。

${fn:replace(data, '\\n', ';')}
于 2009-11-06T22:31:08.207 回答
16

这类似于接受的答案(因为它使用 Java 来表示换行符而不是 EL),但这里 <c:set/> 元素用于设置属性:

<c:set var="newline" value="<%= \"\n\" %>" />
${fn:replace(myAddress, newline, "<br />")}

下面的代码片段也可以,但是 <c:set/> 元素的第二行不能缩进(并且可能看起来更丑):

    <c:set var="newline" value="
" /><!--this line can't be indented -->
    ${fn:replace(myAddress, newline, "<br />")}
于 2011-08-19T16:15:18.507 回答
8

此解决方案比您自己直接设置 pagecontext 属性的解决方案更优雅。您应该<c:set>为此使用标签:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<c:set var="newLine" value="\n"/>
${fn:replace(data, newLine, "; ")}

顺便说一句:${fn:replace(data, "\n", ";")}不起作用。

于 2009-04-09T12:00:22.430 回答
4

您可以创建自己的 JSP 函数。 http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

这大致就是你需要做的。

创建标签库描述符文件
/src/META-INF/sf.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>sf</short-name>
  <uri>http://www.stackoverflow.com</uri>
  <function>
    <name>clean</name>
    <function-class>com.stackoverflow.web.tag.function.TagUtils</function-class>
    <function-signature>
      java.lang.String clean(java.lang.String)
    </function-signature>
  </function>
</taglib>

为函数逻辑创建一个 Java 类。
com.stackoverflow.web.tag.function.TagUtils

package com.stackoverflow.web.tag.function;

import javax.servlet.jsp.tagext.TagSupport;

public class TagUtils extends TagSupport {
  public static String clean(String comment) {
    return comment.replaceAll("\n", "; ");
  }
}

在您的 JSP 中,您可以通过以下方式访问您的函数。

<%@ taglib prefix="sf" uri="http://www.stackoverflow.com"%>
${sf:clean(item.comments)}
于 2008-09-12T01:29:45.800 回答
4

这对我不起作用:

<c:set var="newline" value="\n"/>
${fn:replace(data, newLine, "; ")}

这样做:

<% pageContext.setAttribute("newLineChar", "\n"); %> 
${fn:replace(item.comments, newLineChar, "; ")}
于 2009-11-06T22:23:23.357 回答
4

如果您真正需要的是 \n 符号,则可以使用此处的建议:

${fn:replace(text, "
", "<br/>")}

或者

<c:set var="nl" value="
" /><%-- this is a new line --%>

这包括字符串文字中的新行。

于 2011-08-05T17:55:23.567 回答
2

您应该可以使用 fn:replace 来完成。

您需要使用以下声明将标签库导入您的 JSP:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

然后,您可以使用以下表达式将 ${data} 中出现的换行符替换为分号:

${fn:replace(数据, "\n", ";")}

这些东西的文档不是很好,我没有机会测试它。

于 2008-09-12T01:19:14.623 回答
2

\n 不代表 EL 表达式中的换行符。

pageContext属性设置为换行符然后将其与 JSTL 的fn:replace函数一起使用的解决方案确实有效。

不过,我更喜欢使用 Jakarta String Tab Library 来解决这个问题:

<%@ taglib prefix="str" uri="http://jakarta.apache.org/taglibs/string-1.1" %>
...
<str:replace var="result" replace="~n" with=";" newlineToken="~n">
Text containing newlines
</str:replace>
...

你可以为 newlineToken 使用任何你想要的东西;“~n”不太可能出现在我正在替换的文本中,所以这对我来说是一个合理的选择。

于 2009-05-28T12:53:48.353 回答
2

这是 JSP EL 的有效解决方案:

"${fn:split(string1, Character.valueOf(10))}"
于 2015-07-20T15:08:46.710 回答
1

更容易:

<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>  
于 2010-10-28T15:28:41.620 回答
0

您可以编写自己的 JSP 函数来进行替换。

这意味着你最终会得到类似的东西:

<%@ taglib prefix="ns" uri="..." %>
...
${ns:replace(data)}

ns您定义的名称空间前缀在哪里,并且replace是您的 JSP 函数。

这些函数很容易实现(它们只是一个静态方法),尽管目前我似乎找不到编写这些函数的好参考。

于 2008-09-12T01:28:44.710 回答
0

在设置 var 的值中,在双引号之间按 ENTER。

${fn:replace(data, newLineChar, ";")}

于 2009-02-12T04:08:53.857 回答
0

作为记录,我在解决这个问题时遇到了这篇文章:

JSTL 中的多行字符串被添加为文本区域的标题属性。然后 Javascript 将其添加为 textarea 的默认文本。为了在焦点上清除此文本,值需要等于标题...但由于许多文本编辑器放置 \r\n 而不是 \n 而失败。所以follownig会去掉不需要的\r:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
于 2010-03-31T16:48:13.570 回答