web-dev-qa-db-fra.com

Création d'un tableau à l'aide de JSTL ou EL

Je travaille sur une application Web en utilisant Java et ses frameworks (Spring 3.1.1). Et j'essaie d'éviter autant que possible d'utiliser des scriptlets, mais je ne trouve pas de autre manière que celle-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 du JSTL/EL simple pour créer un tableau?

PDATE: J'utilise ce tableau pour créer des liens. Par exemple, si l'utilisateur clique sur "S", une liste d'employés dont le prénom commence par "S" s'affiche. Donc, au lieu de créer des liens un par un, j'itère ${alphabet}.

22
Alpha Carinae

Si vous êtes déjà sur EL 3.0 (Tomcat 8+, WildFly 8+, GlassFish 4+, Payara 4+, TomEE 7+, etc.), qui prend en charge new 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 sur EL 3.0, utilisez l'astuce de fonction ${fn:split()} sur une seule chaîne qui sépare les caractères individuels par un séparateur commun, comme une 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 cependant d'accord pour dire qu'il vaut mieux utiliser le code normal Java pour cela. Étant donné qu'il s'agit apparemment de données statiques, créez simplement cette classe d'écoute:

@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 au démarrage de la webapp et mettra les données souhaitées dans la portée de l'application.

44
BalusC

Si vous souhaitez parcourir les jetons dans la chaîne, 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>
22
Andrii Nemchenko

Si vous utilisez Java EE 7/Expression Language 3.0, vous pouvez créer un littéral List

<c:set var="alphabet" value="${['A', 'B', 'C', ... , 'Z']}" />

qui peut ensuite itérer sur un peu comme un Array.

5
mxxk

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, vous avez probablement besoin d'un Servlet ici.

Ajoutez la logique de création de tableau (ou mieux encore, création de liste), dans un servlet, et utilisez-la pour pré-traiter la demande sur votre page JSP. Et puis, vous pouvez utiliser l'attribut List défini dans la servlet de votre page JSP.

3
Rohit Jain

Pas du EL pur, mais une solution assez propre néanmoins:

<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
2
wvdz

Sans savoir quel framework utilisez-vous, la meilleure approche pour travailler avec des JSP sans utiliser ses scriptlets est de sauvegarder chaque JSP (vue) avec un Java bean (un objet):

Haricot de support:

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;
   }

}

Instanciez ensuite le bean sur le JSP de cette façon:

<jsp:useBean id="backingBean" scope="page" class="com.example.MyBackingBean" />

Après cela, vous pouvez utiliser EL ${backingBean.alphabet} pour accéder à cette liste.

Remarque: si vous avez besoin d'un traitement plus complexe, vous devrez utiliser des servlets ou l'une des fonctionnalités fournies par n'importe quel framework.

0
Alonso Dominguez