¿Cómo puedo reemplazar caracteres de nueva línea usando JSP y JSTL?

Tengo una lista de objetos bean pasados ​​a mi página JSP, y uno de ellos es un campo de comentarios. Este campo puede contener líneas nuevas, y quiero reemplazarlas por punto y coma con JSTL, de modo que el campo se pueda mostrar en una entrada de texto. Encontré una solución, pero no es muy elegante. Publicaré a continuación como una posibilidad.

Aquí hay una solución que encontré. Aunque no parece muy elegante:

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

Simplemente use la función fn:replace() para reemplazar \n by ; .

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

En caso de que esté utilizando la implementación EL de Apache en lugar de la implementación de referencia EL de Oracle (es decir, cuando esté utilizando Tomcat, TomEE, JBoss, etc. en lugar de GlassFish, Payara, WildFly, WebSphere, etc.), entonces necesita volver a escapar del barra invertida.

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

Esto es similar a la respuesta aceptada (porque usa Java para representar la nueva línea en lugar de EL), pero aquí el elemento se usa para establecer el atributo:

 " /> ${fn:replace(myAddress, newline, "
")}

El siguiente fragmento también funciona, pero la segunda línea del elemento no puede sangrarse (y puede parecer más fea):

   ${fn:replace(myAddress, newline, "
")}

Esta solución es más elegante que su propia solución que establece directamente el atributo pagecontext. Debe usar la etiqueta para esto:

 < %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> < %@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>  ${fn:replace(data, newLine, "; ")} 

Por cierto: ${fn:replace(data, "\n", ";")} NO funciona.

Esto no funciona para mi:

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

Esto hace:

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

Podrías crear tu propia función JSP. http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

Esto es más o menos lo que necesita hacer.

Crear un archivo descriptor de biblioteca de tags
/src/META-INF/sf.tld

 < ?xml version="1.0" encoding="UTF-8"?>  1.0 sf http://www.stackoverflow.com  clean com.stackoverflow.web.tag.function.TagUtils  java.lang.String clean(java.lang.String)    

Crea una clase Java para la lógica de funciones.
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", "; "); } } 

En su JSP puede acceder a su función de la siguiente manera.

 < %@ taglib prefix="sf" uri="http://www.stackoverflow.com"%> ${sf:clean(item.comments)} 

Si lo que realmente necesita es un símbolo \ n, puede usar los consejos de aquí :

 ${fn:replace(text, " ", "
")}

o

 < %-- this is a new line --%> 

Esto incluye la nueva línea en su literal de cadena.

Deberías poder hacerlo con fn: replace.

Deberá importar la biblioteca de tags en su JSP con la siguiente statement:

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

Luego puede usar la siguiente expresión para reemplazar las ocurrencias de nueva línea en $ {data} con un punto y coma:

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

La documentación no es excelente en este aspecto y no he tenido la oportunidad de probarla.

\ n no representa el carácter de nueva línea en una expresión EL.

La solución que establece un atributo pageContext para el carácter de nueva línea y luego lo usa con la función fn:replace JSTL funciona.

Sin embargo, prefiero usar la Biblioteca de Tablas de Cartas de Yakarta para resolver este problema:

 < %@ taglib prefix="str" uri="http://jakarta.apache.org/taglibs/string-1.1" %> ...  Text containing newlines  ... 

Puede usar lo que quiera para el newlineToken; “~ n” es poco probable que aparezca en el texto que estoy reemplazando, por lo que fue una opción razonable para mí.

Más fácilmente:

 ${your_Var_to_replaced} 

Esta es una solución válida para el JSP EL:

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

Podría escribir su propia función JSP para hacer el reemplazo.

Esto significa que terminarías con algo como:

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

Donde ns es un prefijo de espacio de nombres que define y replace es su función JSP.

Estas funciones son bastante fáciles de implementar (son solo un método estático) aunque parece que no puedo encontrar una buena referencia para escribirlas en este momento.

En el valor al configurar la var, presione ENTER entre las comillas dobles.

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

Para el registro, me encontré con esta publicación al abordar este problema:

Se agrega una cadena de varias líneas en JSTL como el atributo de título de un área de texto. Javascript luego agrega esto como el texto predeterminado del área de texto. Para aclarar este texto sobre el enfoque, el valor debe ser igual al título … pero falla el número de editores de texto \ r \ n en lugar de \ n. Entonces el siguiente se deshará de la \ no deseada:

 < % pageContext.setAttribute("newLineChar", "\r"); %>