如何使用JSP和JSTL替换换行符?

时间:2008-09-12 00:57:12

标签: string jsp replace jstl newline

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

14 个答案:

答案 0 :(得分:53)

这是我找到的解决方案。但它似乎并不优雅:

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

${fn:replace(item.comments, newLineChar, "; ")}

答案 1 :(得分:19)

只需使用fn:replace()功能将\n替换为;

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

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

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

答案 2 :(得分:14)

这类似于接受的答案(因为它使用Java来表示换行而不是EL)但是这里&lt; c:set /&gt; element用于设置属性:

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

以下代码段也有效,但&lt; c:set /&gt;的第二行元素不能缩进(可能看起来更丑):

    <c:set var="newline" value="
" /><!--this line can't be indented -->
    ${fn:replace(myAddress, newline, "<br />")}

答案 3 :(得分: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, "; ")}

BTW:${fn:replace(data, "\n", ";")}不起作用。

答案 4 :(得分: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)}

答案 5 :(得分:4)

这对我不起作用:

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

这样做:

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

答案 6 :(得分:4)

如果你真正需要的是一个\ n符号,你可以使用here的建议:

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

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

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

答案 7 :(得分:2)

您应该可以使用fn:replace。

来完成

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

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

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

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

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

答案 8 :(得分:1)

\ 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”不太可能出现在我正在替换的文本中,所以对我来说这是一个合理的选择。

答案 9 :(得分:1)

更容易:

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

答案 10 :(得分:1)

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

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

答案 11 :(得分:0)

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

这意味着你最终得到的结果如下:

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

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

这些函数很容易实现(它们只是一种静态方法),但我现在似乎无法找到一个很好的参考文献。

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

为了记录,我在解决这个问题时遇到了这个帖子:

JSTL中的多行字符串被添加为textarea的title属性。然后Javascript将其添加为textarea的默认文本。为了清除焦点上的这个文本,值需要等于标题...但是尽管许多文本编辑器放置了\ r \ n而不是\ n。因此,follownig将摆脱不需要的\ r:

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