我如何使用JSP和JSTLreplace换行符?

我有一个bean对象的列表传入我的JSP页面,其中一个是注释字段。 这个字段可能包含换行符,我想使用JSTL用分号replace它们,以便字段可以显示在文本input中。 我find了一个解决scheme,但不是很优雅。 我会在下面发帖作为一种可能性。

这是我find的解决scheme。 但是,这看起来并不高雅:

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

只需使用fn:replace()函数来replace\n ;

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

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

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

这与被接受的答案类似(因为它使用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 />")} 

这个解决scheme比直接设置pagecontext属性的解决scheme更加优雅。 你应该使用<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", ";")}不起作用。

这对我不起作用:

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

这样做:

 <% pageContext.setAttribute("newLineChar", "\n"); %> ${fn:replace(item.comments, newLineChar, "; ")} 

你可以创build你自己的JSPfunction。 http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

这大致是你需要做的。

创build一个标签库描述符文件
/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> 

为函数逻辑创build一个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中,您可以通过以下方式访问您的function。

 <%@ taglib prefix="sf" uri="http://www.stackoverflow.com"%> ${sf:clean(item.comments)} 

你应该可以用fn:replace来做到这一点。

您将需要使用以下声明将标记库导入到JSP中:

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

然后,您可以使用以下expression式用分号replace$ {data}中换行符的出现:

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

这些文件不是很好,我没有机会去testing它。

如果你真正需要的是\ n符号,你可以使用这里的build议:

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

要么

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

这包括string文字中的新行。

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

解决scheme将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”不太可能出现在我正在replace的文本中,所以对我来说这是一个合理的select。

更容易:

 <str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace> 

你可以编写你自己的JSP函数来做replace。

这意味着你最终会得到像这样的东西:

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

其中ns是您定义和replace的命名空间前缀是您的JSP函数。

这些函数很容易实现(它们只是一个静态方法),尽pipe目前我似乎无法find一个很好的参考。

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

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

为了logging,我在处理这个问题时遇到了这个post:

JSTL中的多行string被添加为textarea的title属性。 然后,JavaScript将此添加为textarea的默认文本。 为了清楚这个文本的重点,值需要等于标题…但失败了许多文本编辑器\ r \ n而不是\ n。 所以follownig将摆脱不必要的\ r:

 <% pageContext.setAttribute("newLineChar", "\r"); %> <c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" /> 

这是JSP EL的有效解决scheme:

 "${fn:split(string1, Character.valueOf(10))}"