代码之家  ›  专栏  ›  技术社区  ›  parkerfath

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

  •  42
  • parkerfath  · 技术社区  · 17 年前

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

    14 回复  |  直到 17 年前
        1
  •  55
  •   parkerfath    17 年前

    我找到了一个解决办法。不过,它看起来并不十分优雅:

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

    只用 fn:replace() \n ; .

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

    ${fn:replace(data, '\\n', ';')}
    
        3
  •  16
  •   andy    15 年前

    这与公认的答案类似(因为它使用Java来表示换行符而不是EL),但这里的<c:set/>元素用于设置属性:

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

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

    此解决方案比您自己的直接设置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", ";")} 不起作用。

        5
  •  4
  •   user205294 user205294    16 年前

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

    这是:

    <% pageContext.setAttribute("newLineChar", "\n"); %> 
    ${fn:replace(item.comments, newLineChar, "; ")}
    
        6
  •  4
  •   Geekygecko    16 年前

    您可以创建自己的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>
    


    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)}
    
        7
  •  4
  •   Leonid    15 年前

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

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

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

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

        8
  •  2
  •   Brian Matthews    17 年前

    您应该可以使用fn:replace来执行此操作。

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

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

    然后可以使用以下表达式将${data}中出现的换行符替换为分号:

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

        9
  •  2
  •   Matt    17 年前

    解决方案设置了一个 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”不太可能出现在我正在替换的文本中,因此它对我来说是一个合理的选择。

        10
  •  2
  •   josliber Martin Ballet    11 年前

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

    "${fn:split(string1, Character.valueOf(10))}"
    
        11
  •  1
  •   brunohop    15 年前

    更容易:

    <str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>  
    
        12
  •  0
  •   Walter Rumsby    17 年前

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

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

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

        13
  •  0
  •   Helper Helper    17 年前

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

        14
  •  0
  •   wheresrhys    16 年前

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

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