21 votes

Comment diviser correctement les chaînes de caractères dans JSTL ?

Comment puis-je diviser les chaînes séparées par "/" dans une page jsp en utilisant JSTL ?

J'ai une chaîne de caractères dans ce format : **

"23/11/2010"

* . Parfois, la chaîne pourrait être comme ceci : *

"1/1/2010"

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

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

** En effet, je dois placer chacun d'entre 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 fonctionnel.

Merci d'avance !

51voto

BalusC Points 498232

Vous pouvez utiliser le fn:split() pour cela.

<%@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 validé au préalable :) Ce serait plus facile si c'était un java.util.Date et non un java.lang.String . Vous pourriez alors utiliser <fmt:formatDate> pour le formater d'abord dans un format de chaîne fiable et fixe. Sinon, il faudrait ajouter des vérifications sur la longueur du tableau en utilisant la fonction fn:length() et de prévenir les trous d'attaque XSS potentiels en fn:escapeXml() .

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

11voto

Luke Points 154

Il est intéressant de noter pour toute personne qui trouve cette question dans sa recherche (comme je l'ai fait) que JSTL a la balise utile <c:forTokens> . Ceci va diviser la chaîne d'entrée par un délimiteur fourni et ensuite itérer sur la collection résultante de tokens.

Comme démontré ici, le code suivant :

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

Aurait pour conséquence :

A
B
C
D

Documentation : Balise de base JSTL pour les jetons

5voto

digitaljoel Points 13557

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X