如何使用JSP和JSTL替换换行符?
我有一个传递到我的JSP页面中的bean对象的列表,其中之一是注释字段。该字段可能包含换行符,我想使用JSTL将其替换为分号,以便可以在文本输入中显示该字段。我找到了一种解决方案,但是它不是很优雅。我将在下面发布作为一种可能性。
解决方案
回答
这是我找到的解决方案。但是,它似乎并不十分优雅:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <% pageContext.setAttribute("newLineChar", "\n"); %> ${fn:replace(item.comments, newLineChar, "; ")}
回答
我们应该可以使用fn:replace做到这一点。
我们将需要使用以下声明将标记库导入到JSP中:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
然后,我们可以使用以下表达式将$ {data}中的换行符替换为分号:
${fn:replace(data, "\n", ";")}
该文档在这方面不是很好,我还没有机会对其进行测试。
回答
我们可以编写自己的JSP函数进行替换。
这意味着我们最终会遇到以下情况:
<%@ taglib prefix="ns" uri="..." %> ... ${ns:replace(data)}
其中" ns"是我们定义的名称空间前缀,而"替换"是JSP函数。
这些函数很容易实现(它们只是一个静态方法),尽管我现在似乎找不到很好的参考来编写这些函数。
回答
我们可以创建自己的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)}
回答
在设置变量的值中,在双引号之间按Enter。
$ {fn:replace(data,newLineChar,";")}
回答
此解决方案比我们自己的直接设置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",";")}`不起作用。
回答
\ n不代表EL表达式中的换行符。
该解决方案可以为换行符设置一个pageContext属性,然后将其与JSTL的fn:replace函数一起使用。
但是,我更喜欢使用Jakarta字符串标签库来解决此问题:
<%@ 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"不太可能出现在我要进行替换的文本中,因此对我来说这是一个合理的选择。
回答
这对我不起作用:
<c:set var="newline" value="\n"/> ${fn:replace(data, newLine, "; ")}
这样做:
<% pageContext.setAttribute("newLineChar", "\n"); %> ${fn:replace(item.comments, newLineChar, "; ")}
回答
只需使用fn:replace()函数将\ n
替换为;
。
${fn:replace(data, '\n', ';')}
如果我们使用Apache的EL实现而不是Oracle的EL参考实现(即,当我们使用Tomcat,TomEE,JBoss等代替GlassFish,Payara,WildFly,WebSphere等)时,则需要重新转义反斜杠。
${fn:replace(data, '\n', ';')}
回答
作为记录,我在解决此问题时遇到了这篇文章:
JSTL中的多行字符串被添加为textarea的title属性。然后,JavaScript将其添加为textarea的默认文本。为了使文本清晰可见,该值需要等于标题...但是失败了,因为许多文本编辑器将\ r \ n替换为\ n。因此,Follownig将摆脱不必要的\ r:
<% pageContext.setAttribute("newLineChar", "\r"); %> <c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
回答
更容易:
<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>