2008-09-12 9 views
40

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.¿Cómo puedo reemplazar caracteres de nueva línea usando JSP y JSTL?

Respuesta

51

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

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

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

Estoy aceptando esto, aunque es mi propia respuesta, porque es más simple y he encontrado que realmente funciona. – parkerfath

+0

Eso es innecesario. Solo escape de la barra inclinada invertida: http://stackoverflow.com/questions/58054/how-can-i-replace-newline-characters-using-jsp-and-jstl/1690942#1690942 – BalusC

+2

Intenté simplemente escapar de la barra diagonal inversa, que no hizo tampoco funciona Mi método de configuración anterior del atributo pageContext sigue siendo la única manera en que puedo ponerlo en funcionamiento. Sin embargo, como dice BalusC, es posible que tengas mejor suerte con algunos de los métodos más simples. Probablemente es bueno tener todas las opciones aquí. – parkerfath

2

Debería poder hacerlo con fn: replace.

Usted tendrá que importar la biblioteca de etiquetas en su JSP con la siguiente declaración:

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

continuación, puede utilizar la siguiente expresión para reemplazar las apariciones de nueva línea en $ {datos} 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.

+0

Estoy bastante seguro de que esto es lo que probé primero, y no funcionó. Realmente no tengo tiempo para volver a probarlo, así que puedo estar equivocado. – parkerfath

+0

Creo que esta respuesta es más o menos la misma que la mía (ver más abajo), pero sin el adicional pageContext.setAttribute(). ¿Sabes si hay alguna configuración que no haya configurado que me obligue a llamar a este método adicional? – parkerfath

+0

Recibo este error: org.apache.jasper.JasperException: /WEB-INF/jsp/team/alarms.jsp(11,2) "$ {fn: replace (blob," \ n ","; ") } "contiene expresiones inválidas: javax.servlet.jsp.el.ELException: Encontrado" "\ n", esperado uno de [, , etc. – parkerfath

0

Puede escribir su propia función JSP para hacer la sustitución.

Esto significa que terminarías con algo como:

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

Dónde ns es un prefijo de espacio de nombres que definen 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.

4

Puede crear su 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.

Cree un archivo descriptor de la biblioteca
/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> 

Crear 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 manera siguiente.

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

debe ser $ {sf: clean (item .comments)} ... Utilicé esta solución .. parece más limpio que el scriptlet – danb

+0

gracias danb, he actualizado mi publicación – Geekygecko

+0

@danb: ¿has perdido mi respuesta? http://stackoverflow.com/questions/58054/how- can-i-replace-newline-characters-using-jsp-and-jstl/1690942 # 1690942 – BalusC

0

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

$ {fn: reemplazar (datos, newLineChar, ";")}

8

Esta solución es más elegante que su propia solución que está preparando el pageContext atribuir directamente.Se debe utilizar la etiqueta de <c:set> para esto:

<%@ 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, "; ")} 

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

+0

Esto no funciona para mí en Resin 3, mientras que la respuesta superior con el scriptlet pageContext sí. – pimlottc

+0

Supongo que sería un error porque de acuerdo con los estándares debería funcionar. – Bousch

+1

@pimlottc Rep encajar el '" 'con' ''en' $ {fn: replace (data, "\ n", ";")} 'y debería funcionar:' $ {fn: replace (data,' \ n ',' ; ')} '. De lo contrario, esto, por ejemplo, no funcionará: '' debido a las comillas dobles después del valor. – mvdb

1

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

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

Sin embargo, yo prefiero usar la Biblioteca Tab Jakarta cuerdas para resolver este problema:

<%@ 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> 
... 

Puede usar lo que desea 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í.

4

Esto no funciona para mí:

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

esto hace:

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

Estas son las respuestas anteriores, ¿no? Tal vez sería mejor comentar o rescindir las respuestas ya dadas, en lugar de repetirlas. – parkerfath

+0

Tengo el mismo problema, esta mina resuelta, gracias pero ¿por qué la primera no funciona? –

+0

@parkerfath La versión de mayor clasificación de esta respuesta no advierte que las versiones c: set o inline a menudo fallarán silenciosamente. – LateralFractal

19

sólo tiene que utilizar la función de reemplazar fn:replace()\n por ;.

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

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

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

Para el registro, me encontré con este post, mientras que hacer frente a este problema:

Una cadena de múltiples líneas en JSTL se agrega como atributo 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. Por lo que el follownig va a deshacerse de los no deseados \ r:

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

Más fácil:

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

Si lo que realmente necesita es un símbolo \ n puede utilizar el asesoramiento de here:

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

o

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

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

12

Esto es similar a la respuesta aceptada (porque está utilizando Java para representar la nueva línea en lugar de EL) pero aquí el < C: Configuración/> elemento se utiliza para establecer el atributo:

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

El siguiente fragmento también funciona, pero la segunda línea de la < C: Configuración/> elemento no puede tener una sangría (y puede parecer más feo):

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

¡Genial! No sé por qué, pero la respuesta aceptada no funciona. ¿Sabes por qué? –

+0

El primer fragmento funcionó para mí. ¡Gracias! –

0

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

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