2008-09-12 109 views
40

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

回答

51

这是我找到的解决方案。但它看起来并不很优雅:

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

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

虽然这是我自己的答案,但我接受了这一点,因为它最简单,而且我发现它确实可行。 – parkerfath 2009-02-12 00:06:43

+0

这是不必要的。只是越过反斜杠:http://stackoverflow.com/questions/58054/how-can-i-replace-newline-characters-using-jsp-and-jstl/1690942#1690942 – BalusC 2010-02-11 11:37:26

+2

我试着只是逃避反斜杠,它没有也不行。我上面列出的设置pageContext属性的方法仍然是我可以使其工作的唯一方法。尽管如BalusC所说,用一些简单的方法你可能会有更好的运气。可能很好,在这里有所有的选择。 – parkerfath 2010-02-19 19:44:41

2

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

您需要的标记库导入您的JSP与以下声明:

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

然后你可以用下面的表达式用分号来代替换行的出现在$ {数据}:

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

该文档对这个东西并不是很好,我没有机会测试它。

+0

我很确定这是我第一次尝试,而且没有奏效。但是,我没有时间重新测试它,所以我可能是错的。 – parkerfath 2008-09-12 22:52:40

0

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

这意味着你最终的东西,如:

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

ns是一个命名空间前缀定义和replace是你的JSP的功能。

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

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)} 
0

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

$ {FN:更换(数据,newLineChar, “”)}

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", ";")}不起作用。

1

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

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

不过,我更喜欢使用雅加达字符串标签库来解决这个问题:

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

4

这并没有为我工作:

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

这并不:

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

只需使用fn:replace()功能通过;更换\n

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

在你使用Apache的EL实现,而不是甲骨文的EL参考实现(即,当你使用Tomcat,TomEE时,JBoss等,而不是GlassFish中,似鲭水狼牙鱼,WildFly中,WebSphere等)的情况下,则您需要重新转义反斜杠。

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

为了记录在案,我碰到这个职位后来虽然解决这个问题:

在JSTL多行字符串被添加为textarea的title属性。然后,Javascript将此添加为textarea的默认文本。为了清楚地理解这个文本,这个值需要等于标题......但是失败的是许多文本编辑器放弃\ r \ n而不是\ n。所以follownig将摆脱不必要的\的r:

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

更容易:

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

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

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

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

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

12

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

<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 />")} 
0

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

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