Création de tableau en utilisant JSTL ou EL
je travaille sur une application web utilisant Java et ses cadres(printemps 3.1.1). Et j'essaie d'éviter d'utiliser les scriptlets autant que possible, mais je ne trouve pas d'autre moyen que celui-ci pour définir un tableau:
<%
String[] alphabet = {"A", "B", "C", ... , "Z"};
pageContext.setAttribute("alphabet", alphabet);
%>
après avoir défini l'attribut pageContext, je peux l'utiliser avec ${alphabet}
. Mais je veux savoir, est-il possible d'utiliser JSTL/EL pour créer un tableau?
mise à jour: j'utilise ce tableau pour créer des liens. Par exemple, si l'utilisateur clique sur "S", un liste des employés dont le prénom commence par " S " vient. Donc, au lieu de créer des liens Un par un, je répète ${alphabet}
.
6 réponses
si vous êtes déjà sur EL 3.0 (Tomcat 8+, WildFly 8+, GlassFish 4+, Payara 4+, TomEE 7+, etc), qui supporte nouveau opérations sur les objets de collection, vous pouvez utiliser ${[...]}
syntaxe pour construire une liste, et ${{...}}
syntaxe pour construire un ensemble.
<c:set var="alphabet" value="${['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']}" scope="application" />
si vous n'êtes pas encore sous EL 3.0, utilisez le ${fn:split()}
fonction astuce sur une chaîne simple qui sépare les caractères individuels par un séparateur commun, tel que la virgule.
<c:set var="alphabet" value="${fn:split('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z', ',')}" scope="application" />
je suis toutefois d'accord que tu ferais mieux d'utiliser le code Java normal pour ça. Étant donné qu'il s'agit apparemment de données statiques, il suffit de créer cette classe d'auditeur:
@WebListener
public class ApplicationData implements ServletContextListener {
private static final String[] ALPHABET = { "A", "B", "C", ..., "Z" };
@Override
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("alphabet", ALPHABET);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
// NOOP.
}
}
il s'auto-enregistrera de manière transparente sur le démarrage de webapp et mettra les données désirées dans la portée de l'application.
si vous voulez itérer plus de tokens dans string alors utilisez simplement forTokens
:
<c:set var="alphabet">A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z</c:set>
<c:forTokens items="${alphabet}" delims="," var="letter">
${letter}
</c:forTokens>
Si vous utilisez Java EE 7 / Langage d'Expression 3.0, vous pouvez créer un List
littérale
<c:set var="alphabet" value="${['A', 'B', 'C', ... , 'Z']}" />
qui peut parcourir un peu comme un Array
.
les JSP ne sont pas destinés à ce genre de choses. Ils sont destinés à consommer, pas à créer. Si vous souhaitez créer un tableau, alors vous avez probablement besoin d'un Servlet
ici.
ajouter la logique de création de tableau( ou encore mieux, la création de liste), dans un Servlet, et l'utiliser pour pré-processus la demande à votre page JSP. Et puis, vous pouvez utiliser le List
attribut servlet
dans votre JSP
page.
pas pure EL, mais une solution assez propre néanmoins:
<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
sans savoir laquelle cadre utilisez - vous, la meilleure approche pour travailler avec JSPs sans utiliser is scriptlets est de sauvegarder chaque JSP (view) avec un Java bean (un objet):
Sauvegarde de haricot:
public class MyBackingBean {
private List<String> alphabet;
public List<String> getAlphabet() {
if (alphabet == null) {
// Using lazy initialization here, this could be replaced by a
// database lookup or anything similar
alphabet= Arrays.asList(new String[]{ "A", "B", "C", ... });
}
return alphabet;
}
}
puis instanciez la fève au JSP de cette façon:
<jsp:useBean id="backingBean" scope="page" class="com.example.MyBackingBean" />
Après cela, vous pouvez utiliser le EL ${backingBean.alphabet}
pour accéder à cette liste.
Remarque:: si vous avez besoin d'un traitement plus complexe, alors vous devrez utiliser Servlets ou l'une des fonctionnalités fournies par un framework.