Question

J'ai une liste d'objets bean transmis à ma page JSP, et l'un d'eux est un champ de commentaire.Ce champ peut contenir des nouvelles lignes et je souhaite les remplacer par des points-virgules en utilisant JSTL, afin que le champ puisse être affiché dans une saisie de texte.J'ai trouvé une solution, mais elle n'est pas très élégante.Je posterai ci-dessous comme possibilité.

Était-ce utile?

La solution

Voici une solution que j'ai trouvée.Cela n'a cependant pas l'air très élégant :

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

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

Autres conseils

Utilisez simplement fn:replace() fonction à remplacer \n par ;.

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

Dans le cas où vous utilisez l'implémentation EL d'Apache au lieu de l'implémentation de référence EL d'Oracle (c'est-à-direlorsque vous utilisez Tomcat, TomEE, JBoss, etc. au lieu de GlassFish, Payara, WildFly, WebSphere, etc.), vous devez ré-échapper la barre oblique inverse.

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

Ceci est similaire à la réponse acceptée (car elle utilise Java pour représenter la nouvelle ligne plutôt que EL) mais ici l'élément <c:set/> est utilisé pour définir l'attribut :

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

L'extrait suivant fonctionne également, mais la deuxième ligne de l'élément <c:set/> ne peut pas être mise en retrait (et peut paraître plus moche) :

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

Cette solution est plus élégante que votre propre solution qui définit directement l'attribut pagecontext.Vous devriez utiliser le <c:set> balise pour ceci:

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

D'AILLEURS: ${fn:replace(data, "\n", ";")} ne marche pas.

Cela ne fonctionne pas pour moi:

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

Cela fait :

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

Vous pouvez créer votre propre fonction JSP.http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

C'est à peu près ce que vous devez faire.

Créer un fichier descripteur de bibliothèque de balises
/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>

Créez une classe Java pour la logique des fonctions.
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", "; ");
  }
}

Dans votre JSP, vous pouvez accéder à votre fonction de la manière suivante.

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

Si vous avez vraiment besoin d'un symbole , vous pouvez utiliser les conseils de ici:

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

ou

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

Cela inclut la nouvelle ligne dans votre chaîne littérale.

Vous devriez pouvoir le faire avec fn:replace.

Vous devrez importer la bibliothèque de balises dans votre JSP avec la déclaration suivante :

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

Ensuite, vous pouvez utiliser l'expression suivante pour remplacer les occurrences de nouvelle ligne dans ${data} par un point-virgule :

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

La documentation n'est pas géniale sur ce genre de choses et je n'ai pas eu l'occasion de la tester.

ne représente pas le caractère de nouvelle ligne dans une expression EL.

La solution qui fixe un pageContext attribut au caractère de nouvelle ligne, puis l'utilise avec les JSTL fn:replace la fonction fonctionne.

Cependant, je préfère utiliser la bibliothèque d'onglets de chaînes Jakarta pour résoudre ce problème :

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

Vous pouvez utiliser ce que vous voulez pour le newlineToken ;Il est peu probable que "~n" apparaisse dans le texte sur lequel je fais le remplacement, c'était donc un choix raisonnable pour moi.

Plus facilement:

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

Il s'agit d'une solution valable pour le JSP EL :

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

Vous pouvez écrire votre propre fonction JSP pour effectuer le remplacement.

Cela signifie que vous obtiendrez quelque chose comme :

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

ns est un préfixe d'espace de noms que vous définissez et replace est votre fonction JSP.

Ces fonctions sont assez faciles à implémenter (ce ne sont qu'une méthode statique) bien que je n'arrive pas à trouver une bonne référence pour les écrire pour le moment.

Dans la valeur lors de la définition de la var, appuyez sur ENTRÉE entre les guillemets doubles.

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

Pour mémoire, je suis tombé sur ce post en abordant ce problème :

Une chaîne multiligne dans JSTL est ajoutée comme attribut de titre d'une zone de texte.Javascript l'ajoute ensuite comme texte par défaut de la zone de texte.Afin d'effacer ce texte, la valeur doit être égale au titre...mais échoue car de nombreux éditeurs de texte mettent au lieu de .Ainsi, la procédure suivante supprimera le indésirable :

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top