Pregunta

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

¿Fue útil?

Solución

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

Otros consejos

Solo usa fn:replace() función para reemplazar \n por ;.

${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 usa Tomcat, TomEE, JBoss, etc. en lugar de GlassFish, Payara, WildFly, WebSphere, etc.), entonces necesita volver a escapar de la 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 <c:set/> se usa 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 del elemento <c:set/> no puede tener sangría (y puede verse más fea):

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

Esta solución es más elegante que su propia solución que establece el atributo de contexto de página directamente.Deberías usar el <c:set> 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" %>

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

POR CIERTO: ${fn:replace(data, "\n", ";")} No funciona.

Esto no funciona para mi:

<c:set var="newline" value="\n"/>
${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 debes hacer.

Crear un archivo descriptor de biblioteca de etiquetas
/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>

Cree 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 tu JSP puedes acceder a tu función de la siguiente manera.

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

Si lo que realmente necesitas es un símbolo puedes utilizar los consejos de aquí:

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

o

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

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

Deberías poder hacerlo con fn:replace.

Deberá importar la biblioteca de etiquetas a su JSP con la siguiente declaración:

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

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

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

La documentación no es muy buena sobre este tema y no he tenido la oportunidad de probarla.

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

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

Sin embargo, prefiero usar la biblioteca de pestañas de cadenas de Yakarta 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>
...

Puedes usar lo que quieras para newlineToken;Es poco probable que "~n" aparezca en el texto que estoy reemplazando, por lo que fue una elección razonable para mí.

Más fácilmente:

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

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

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

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

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 usted 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 mientras configura la var, presione ENTER entre las comillas dobles.

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

Para que conste, me encontré con esta publicación mientras abordaba este problema:

Se agrega una cadena de varias líneas en JSTL como atributo de título de un área de texto.Luego, Javascript agrega esto como el texto predeterminado del área de texto.Para borrar el foco de este texto, el valor debe ser igual al título...pero falla porque muchos editores de texto ponen en lugar de .Entonces lo siguiente eliminará el no deseado:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top