Domanda

Ho un elenco di oggetti bean passati nella mia pagina JSP e uno di questi è un campo di commento.Questo campo può contenere caratteri di fine riga e desidero sostituirli con 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.Pubblicherò di seguito come possibilità.

È stato utile?

Soluzione

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

Altri suggerimenti

Basta usare fn:replace() funzione da sostituire \n di ;.

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

Nel caso in cui utilizzi l'implementazione EL di Apache invece dell'implementazione di riferimento EL di Oracle (ad es.quando usi Tomcat, TomEE, JBoss, ecc. invece di GlassFish, Payara, WildFly, WebSphere, ecc.), devi eseguire nuovamente l'escape della barra rovesciata.

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

Questo è simile alla risposta accettata (perché utilizza Java per rappresentare il ritorno a capo anziché EL) ma qui l'elemento <c:set/> viene utilizzato per impostare l'attributo:

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

Anche il seguente frammento funziona, ma la seconda riga dell'elemento <c:set/> non può essere rientrata (e potrebbe sembrare più brutta):

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

Questa soluzione è più elegante della tua soluzione che imposta direttamente l'attributo pagecontext.Dovresti usare il <c:set> tag per questo:

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

A proposito: ${fn:replace(data, "\n", ";")} non funziona.

Questo non funziona per me:

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

Questo fa:

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

Potresti creare la tua funzione JSP.http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

Questo è più o meno ciò che devi fare.

Creare un file descrittore della libreria di tag
/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>

Creare una classe 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 ciò di cui hai veramente bisogno è un simbolo puoi usare i consigli di Qui:

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

O

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

Ciò include la nuova riga nella stringa letterale.

Dovresti essere in grado di farlo con fn:replace.

Dovrai importare la libreria di tag nella tua JSP con la seguente dichiarazione:

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

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

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

La documentazione non è eccezionale su queste cose e non ho avuto l'opportunità di testarla.

non rappresenta il carattere di nuova riga in un'espressione EL.

La soluzione che imposta a pageContext attributo al carattere di nuova riga e quindi lo utilizza con JSTL fn:replace la funzione funziona.

Tuttavia, preferisco utilizzare la libreria Jakarta String Tab per risolvere questo 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>
...

Puoi usare quello che vuoi per newlineToken;È improbabile che "~n" venga visualizzato nel testo su cui sto eseguendo la sostituzione, quindi è stata una scelta ragionevole per me.

Più facilmente:

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

Questa è una soluzione valida per JSP EL:

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

Potresti scrivere la tua funzione JSP per eseguire la sostituzione.

Ciò significa che ti ritroveresti con qualcosa del tipo:

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

Dove ns è un prefisso dello spazio dei nomi definito dall'utente e replace è la tua funzione JSP.

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

Nel valore durante l'impostazione della var, premere INVIO tra virgolette doppie.

${fn:sostituisci(dati, newLineChar, ";")}

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

Una stringa su più righe in JSTL viene aggiunta come attributo titolo di un'area di testo.Javascript lo aggiunge quindi come testo predefinito dell'area di testo.Per mettere a fuoco questo testo, il valore deve essere uguale al titolo...ma fallisce poiché molti editor di testo inseriscono invece di .Quindi il seguente eliminerà gli indesiderati :

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top