Как я могу заменить символы новой строки, используя JSP и JSTL? - PullRequest
42 голосов
/ 12 сентября 2008

У меня есть список объектов bean, переданных на мою страницу JSP, и один из них - поле комментария. Это поле может содержать символы новой строки, и я хочу заменить их точкой с запятой, используя JSTL, чтобы поле могло отображаться при вводе текста. Я нашел одно решение, но оно не очень элегантное. Я опубликую ниже как возможность.

Ответы [ 14 ]

53 голосов
/ 12 сентября 2008

Вот решение, которое я нашел. Хотя это не выглядит очень элегантно:

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

${fn:replace(item.comments, newLineChar, "; ")}
19 голосов
/ 07 ноября 2009

Просто используйте функцию fn:replace(), чтобы заменить \n на ;.

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

В случае, если вы используете реализацию Apache EL вместо эталонной реализации Oracle (т.е. когда вы используете Tomcat, TomEE, JBoss и т. Д. Вместо GlassFish, Payara, WildFly, WebSphere и т. Д.), Вам необходимо -бросить обратную косую черту.

${fn:replace(data, '\\n', ';')}
14 голосов
/ 19 августа 2011

Это похоже на принятый ответ (потому что он использует Java для представления новой строки, а не EL), но здесь элемент используется для установки атрибута:

<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 />")}
8 голосов
/ 09 апреля 2009

Это решение более элегантное, чем ваше собственное решение, которое напрямую устанавливает атрибут 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", ";")} НЕ работает.

4 голосов
/ 05 августа 2011

Если вам действительно нужен символ \ n, вы можете воспользоваться советом от здесь :

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

или

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

Это включает новую строку в строковом литерале.

4 голосов
/ 07 ноября 2009

Это не работает для меня:

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

Это делает:

<% pageContext.setAttribute("newLineChar", "\n"); %> 
${fn:replace(item.comments, newLineChar, "; ")}
4 голосов
/ 12 сентября 2008

Вы можете создать свою собственную функцию 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)}
2 голосов
/ 12 сентября 2008

Вы должны быть в состоянии сделать это с помощью fn: replace.

Вам потребуется импортировать библиотеку тегов в JSP со следующим объявлением:

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

Затем вы можете использовать следующее выражение для замены вхождений новой строки в $ {data} точкой с запятой:

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

Документация по этому материалу не очень хорошая, и у меня не было возможности протестировать ее.

1 голос
/ 20 июля 2015

Это правильное решение для JSP EL:

"${fn:split(string1, Character.valueOf(10))}"
1 голос
/ 28 октября 2010

Проще:

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