web-dev-qa-db-fra.com

Comment diviser correctement les chaînes en JSTL?

Comment puis-je diviser des chaînes séparées par "/" à l'intérieur d'une page jsp en utilisant JSTL?

J'ai une chaîne dans ce format: **

"23/11/2010"

* . Parfois, la chaîne peut ressembler à ceci: *

"1/1/2010"

* . J'ai besoin de faire quelque chose pour diviser la chaîne en trois sous-chaînes différentes: *

"23", "11", "2010".

** C'est parce que je dois mettre chacun d'eux dans trois champs de texte différents, comme ceux-ci:

<input type="text" value="23">/
<input type="text" value="11">/
<input type="text" value="2010">

Je n'ai pas encore trouvé d'exemple de travail.

Merci d'avance!

17
Lucas

Pour cela, vous pouvez utiliser la fonction fn:split() .

<%@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="dateParts" value="${fn:split(dateString, '/')}" />
...
<input type="text" name="day" value="${dateParts[0]}" />
<input type="text" name="month" value="${dateParts[1]}" />
<input type="text" name="year" value="${dateParts[2]}" />

Assurez-vous que le format de la date est préalablement validé :) Ce serait plus facile si c'était un Java.util.Date, Pas un Java.lang.String. Vous pouvez ensuite utiliser <fmt:formatDate> pour le formater en un format de chaîne fiable et fixe en premier. Sinon, vous devrez ajouter des vérifications sur la longueur du tableau en fn:length() et empêcher les trous d'attaque XSS potentiels par fn:escapeXml() .

Il est également important de noter que la fonction prend une expression régulière comme argument et pas seulement une séquence de caractères simples. Donc, si vous souhaitez diviser les caractères qui représentent des caractères spéciaux dans les expressions régulières, vous devez les échapper avec des barres obliques inverses. Voir aussi Comment diviser une chaîne en Java pour les directives générales qui s'appliquent également à fn:split().

47
BalusC

Il convient de noter pour quiconque trouve cette question dans sa recherche (comme je l'ai fait) que JSTL a la balise utile <c:forTokens>. Cela divisera la chaîne d'entrée par un délimiteur fourni, puis itérera sur la collection résultante de jetons.

Comme démontré ici, le code suivant:

<c:forTokens items="A,B,C,D" delims="," var="mySplit">
   <c:out value="${mySplit}"/></br>
</c:forTokens>

Se traduirait par:

A
B
C
D

Documentation: JSTL core Tag forTokens

9
Luke

Utilisez la bibliothèque JSTL fn. Ils ont un split là-dedans.

4
digitaljoel