我如何使用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))}"