Domanda

Supponiamo di avere un tag personalizzato che accetta un Elenco di stringhe:

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

Come posso creare questo attributo nel jsp che chiama il tag? Potrei usare uno scriptlet

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

ma c'è un modo per farlo usando Expression Language, dal momento che sembra essere preferito?

È stato utile?

Soluzione

Se tutto ciò che vuoi fare è creare l'elenco, puoi utilizzare [<jsp:useBean>][1] per creare l'oggetto nell'ambito desiderato:

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

Funziona perché ArrayList ha un costruttore no-args. Tuttavia, l'elenco non contiene nulla. E, per quanto ne so, né EL né JSTL forniscono un meccanismo integrato per l'aggiunta di elementi a una raccolta: sono entrambi incentrati sull'accesso di sola lettura. Suppongo che potresti definire un Mappatura funzioni EL per abilitare il metodo add().

Tuttavia, penso che sia meglio non provare a forzare JSP a fare qualcosa che non vuole fare. In questo caso, ciò significa che anziché utilizzare un file tag JSP, è necessario scrivere un vero gestore di tag in Java.

Altri suggerimenti

Come kdgregory dice , puoi farlo con funzioni della libreria di tag personalizzate , anche se non lo farà essere bella. Ad esempio, qualcosa del genere:

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

Stai semplicemente incontrando i limiti di quello che era chiamato Lingua delle espressioni possibili più semplice .

Sarebbe più semplice farlo tramite qualche altro meccanismo, come un bean.

Se vuoi evitare scriptlet o brutte funzioni EL, puoi usare il tuo builder e ingannare l'interprete 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>

...

Controlla l'esempio qui: https://gist.github.com/4581179

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top