Come posso sostituire i caratteri newline usando JSP e JSTL?

Ho una lista di oggetti bean passati nella mia pagina JSP, e uno di loro è un campo di commento. Questo campo può contenere nuove righe e voglio sostituirli con il punto e virgola utilizzando JSTL, in modo che il campo possa essere visualizzato in un input di testo. Ho trovato una soluzione, ma non è molto elegante. Inserirò di seguito come una possibilità.

Ecco una soluzione che ho trovato. Non sembra molto elegante, però:

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

Usa semplicemente la funzione fn:replace() per sostituire \n con ; .

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

Nel caso in cui si stia utilizzando l’implementazione EL di Apache anziché l’implementazione di riferimento EL di Oracle (ad esempio quando si utilizzano Tomcat, TomEE, JBoss, ecc. Anziché GlassFish, Payara, WildFly, WebSphere, ecc.), È necessario ri-sfuggire backslash.

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

Questo è simile alla risposta accettata (perché sta usando Java per rappresentare la nuova riga piuttosto che EL) ma qui l’elemento viene usato per impostare l’attributo:

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

Anche lo snippet seguente funziona, ma la seconda riga dell’elemento non può essere rientrata (e potrebbe sembrare più brutta):

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

Questa soluzione è più elegante della tua soluzione che imposta direttamente l’attributo pagecontext. Dovresti usare il per questo:

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

BTW: ${fn:replace(data, "\n", ";")} NON funziona.

Questo non funziona per me:

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

Questo fa:

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

È ansible creare la propria funzione JSP. http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

Questo è più o meno quello che devi fare.

Creare un file descrittore della libreria di tag
/src/META-INF/sf.tld

   1.0 sf http://www.stackoverflow.com  clean com.stackoverflow.web.tag.function.TagUtils  java.lang.String clean(java.lang.String)    

Creare una class Java per la logica delle funzioni.
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", "; "); } } 

Nel tuo JSP puoi accedere alla tua funzione nel modo seguente.

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

Se quello di cui hai veramente bisogno è un simbolo \ n puoi usare il consiglio da qui :

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

o

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

Ciò include la nuova riga nella stringa letterale.

Dovresti riuscire a farlo con fn: replace.

Dovrai importare la libreria di tag nel tuo JSP con la seguente dichiarazione:

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

Quindi puoi usare la seguente espressione per sostituire le occorrenze di newline in $ {data} con un punto e virgola:

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

La documentazione non è eccezionale su questa roba e non ho avuto l’opportunità di testarla.

\ n non rappresenta il carattere di fine riga in un’espressione EL.

La soluzione che imposta un attributo pageContext sul carattere newline e quindi la usa con la funzione fn:replace di JSTL fn:replace funziona.

Tuttavia, preferisco usare la Jakarta String Tab Library per risolvere questo problema:

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

Puoi usare quello che vuoi per il newlineToken; “~ n” è improbabile che compaia nel testo su cui sto facendo la sostituzione, quindi è stata una scelta ragionevole per me.

Più facilmente:

 ${your_Var_to_replaced} 

Questa è una soluzione valida per JSP EL:

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

È ansible scrivere la propria funzione JSP per fare la sostituzione.

Questo significa che ti ritroverai con qualcosa come:

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

Dove ns è un prefisso dello spazio dei nomi che definisci e replace è la tua funzione JSP.

Queste funzioni sono abbastanza facili da implementare (sono solo un metodo statico) anche se non riesco a trovare un buon riferimento per la scrittura di questi al momento.

Nel valore mentre si imposta var, premere INVIO tra le virgolette.

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

Per la cronaca, mi sono imbattuto in questo post mentre affrontavo questo problema:

Una stringa multilinea in JSTL viene aggiunta come attributo titolo di una textarea. Javascript quindi aggiunge questo come testo predefinito della textarea. Per cancellare questo testo sul focus, il valore deve essere uguale al titolo … ma fallisce il numero di editor di testo messi \ r \ n invece di \ n. Quindi il follownig si sbarazzerà del indesiderato \ r:

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