2009-09-14 13 views
7

Supongamos que tengo una etiqueta personalizada que tiene una lista de cadenas:Crear una lista de EL

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

¿Cómo puedo crear este atributo en el JSP que llama a la etiqueta? Podría utilizar un scriptlet

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

pero ¿hay alguna manera de hacer esto utilizando lenguaje de expresión, ya que parece ser el preferido?

Respuesta

8

Si todo lo que quieres hacer es crear la lista, entonces se puede utilizar [<jsp:useBean>][1] para crear el objeto en el alcance deseado:

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

Esto funciona porque ArrayList tiene un constructor sin argumentos. Sin embargo, la lista no tendrá nada. Y, hasta donde yo sé, ni EL ni JSTL proporcionan un mecanismo integrado para agregar elementos a una colección: ambos se centran en el acceso de solo lectura. Supongo que podría definir un EL function mapping para habilitar el método add().

Sin embargo, creo que es mejor que no intentes obligar a JSP a hacer algo que no quiere hacer. En este caso, eso significa que en lugar de usar un archivo de etiqueta JSP, debe escribir un controlador de etiqueta real en Java.

+0

es cierto esto todavía 4 años posteriores : "ni EL ni JSTL proporcionan un mecanismo integrado para agregar elementos a una colección". No pude encontrar una manera de hacer esto – cahen

+2

@cahen - No he utilizado EL durante muchos años, pero no veo ninguna razón para que cambie. JSP pretende ser una tecnología de visualización, y la mutación es algo que un controlador debería hacer. – kdgregory

3

Como kdgregory says, puede hacer esto con custom tag library functions, aunque no será bonito. Por ejemplo, algo como esto:

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

que no son más que desembocan en las limitaciones de lo que antes se llamaba la Simplest Possible Expression Language.

Sería más fácil hacerlo a través de algún otro mecanismo, como un frijol.

+1

EL tiene nuevas características desde 2009: ver también [esta respuesta] (http://stackoverflow.com/questions/10667650/pass-a-list-to-a-jsf-component-without-using-a-bean). – McDowell

3

Si se quiere evitar funciones EL feas scriplet o, se puede utilizar es el propietario constructor y engañar al intérprete 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> 

... 

Comprobar el ejemplo aquí: https://gist.github.com/4581179