Question

Supposons que j'ai une balise personnalisée prenant une liste de chaînes:

<%@ attribute name="thelist" type="java.util.List&lt;java.lang.String&gt;"
    required="true" %>

Comment puis-je créer cet attribut dans le jsp qui appelle la balise? Je pourrais utiliser un scriptlet

<tags:list thelist='<%= java.util.Arrays.asList("blah","blah2") %>' />

mais y a-t-il un moyen de faire cela en utilisant Expression Language, puisque cela semble être préféré?

Était-ce utile?

La solution

Si vous souhaitez simplement créer la liste, vous pouvez utiliser [<jsp:useBean>][1] pour créer l'objet dans l'étendue souhaitée:

<jsp:useBean id="thelist" scope="request" class="java.util.ArrayList" />

Cela fonctionne car ArrayList a un constructeur no-args. Cependant, la liste ne contiendra rien. Et, autant que je sache, ni EL ni JSTL ne fournissent de mécanisme intégré pour ajouter des éléments à une collection - ils sont tous deux concentrés sur un accès en lecture seule. Je suppose que vous pouvez définir un mappage de la fonction EL pour activer la add() méthode.

Cependant, je pense que vous feriez mieux de ne pas forcer JSP à faire quelque chose qu'il ne veut pas faire. Dans ce cas, cela signifie qu'au lieu d'utiliser un fichier de balise JSP, vous devez écrire un gestionnaire de balises réel en Java.

Autres conseils

Comme kdgregory indique , vous pouvez le faire avec fonctions de la bibliothèque de balises personnalisées , bien que ce ne soit pas le cas sois belle. Par exemple, quelque chose comme ceci:

#{foo:add(foo:add(foo:add(foo:newList(), 'One'), 'Two'), 'Three')}

Vous rencontrez simplement les limitations de ce que l'on appelait auparavant le Langage d'expression le plus simple possible .

Il serait plus facile de faire cela via un autre mécanisme, comme un haricot.

Si vous voulez éviter les scriptlets ou les fonctions EL laides, vous pouvez utiliser votre propre générateur et tromper l'interpréteur EL:

...

<jsp:useBean id="listBuilder" class="com.example.ELListBuilder"/>

<ul>
  <c:forEach var="item" items="${listBuilder['red']['yellow']['green'].build}">
      <li>${item}</li>
  </c:forEach>
</ul>

...

Consultez l'exemple ici: https://gist.github.com/4581179

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top