2009-09-14 5 views
7

Supponiamo che io sono un tag personalizzato che prende una lista di stringhe:Creazione di un elenco in EL

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

Come si crea 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?

risposta

8

Se tutto quello che vogliamo fare è creare l'elenco, quindi è possibile utilizzare [<jsp:useBean>][1] per creare l'oggetto del perimetro desiderata:

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

Questo funziona perché ArrayList ha un costruttore senza argomenti. Tuttavia, l'elenco non avrà nulla in esso. E, per quanto ne so, né EL né JSTL forniscono un meccanismo integrato per aggiungere elementi a una raccolta: entrambi sono focalizzati sull'accesso in sola lettura. Suppongo che tu possa definire un EL function mapping 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 di tag JSP, è necessario scrivere un gestore di tag effettivo in Java.

+0

è ancora vero 4 anni dopo : "né EL né JSTL forniscono un meccanismo integrato per aggiungere elementi a una raccolta". Non ho trovato un modo per farlo – cahen

+2

@chehen - Non ho usato EL pesantemente per diversi anni, ma non vedo alcun motivo per cambiare. JSP è inteso come una tecnologia di visualizzazione e la mutazione è qualcosa che un controller dovrebbe fare. – kdgregory

3

Come kdgregory says, è possibile farlo con custom tag library functions, anche se non sarà carino. Per esempio, qualcosa di simile:

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

si stanno semplicemente in esecuzione nei limiti di quello che era chiamato il Simplest Possible Expression Language.

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

+1

EL ha nuove funzionalità dal 2009: vedi anche [questa risposta] (http://stackoverflow.com/questions/10667650/pass-a-list-to-a-jsf-component-without-using-a-bean). – McDowell

3

Se si vuole evitare scriptlet o funzioni brutti EL, è possibile utilizzare Possiedi un costruttore 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> 

... 

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