2009-09-14 7 views
7

Angenommen, ich einen benutzerdefinierten Tag habe, die eine Liste der Strings nehmen:eine Liste in EL Erstellen

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

Wie kann ich dieses Attribut in der jsp erstellen, die den Tag ruft? Ich könnte ein scriptlet

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

zu verwenden, aber ist es eine Möglichkeit, dies mit Expression Language zu tun, denn das ist der Vorzug zu geben scheint?

Antwort

8

Wenn alles, was Sie tun möchten, ist die Liste erstellen, dann können Sie [<jsp:useBean>][1] verwenden Sie das Objekt in dem gewünschten Umfang zu schaffen:

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

Dies funktioniert, da Arraylist einen No-args Konstruktor hat. Die Liste enthält jedoch nichts. Und soweit ich weiß, bieten weder EL noch JSTL einen eingebauten Mechanismus zum Hinzufügen von Elementen zu einer Sammlung - beide konzentrieren sich auf schreibgeschützten Zugriff. Ich vermute, dass Sie eine EL function mapping definieren können, um die add() Methode zu aktivieren.

Allerdings denke ich, dass Sie besser nicht versuchen, JSP zu zwingen, etwas zu tun, das es nicht tun möchte. In diesem Fall sollten Sie anstelle einer JSP-Tagdatei einen tatsächlichen Tag-Handler in Java schreiben.

+0

ist dies immer noch wahr 4 Jahre später : "Weder EL noch JSTL bieten einen integrierten Mechanismus zum Hinzufügen von Elementen zu einer Sammlung". Konnte keinen Weg finden, dies zu tun – cahen

+2

@cahen - Ich habe EL seit mehreren Jahren schwer benutzt, aber ich sehe keinen Grund dafür, es zu ändern. JSP ist als Ansichtstechnologie gedacht, und Mutation ist etwas, was ein Controller tun sollte. – kdgregory

3

Als kdgregory says, könnten Sie dies mit custom tag library functions tun, obwohl es nicht schön sein wird. Zum Beispiel so etwas wie dieses:

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

Sie führen nur in die Grenzen dessen, was früher die Simplest Possible Expression Language aufgerufen werden.

Es wäre einfacher, dies über einen anderen Mechanismus wie eine Bohne zu tun.

+1

EL hat neue Funktionen seit 2009: siehe auch [diese Antwort] (http://stackoverflow.com/questions/10667650/pass-a-list-to-a-js-f-component-without-using-a-bean). – McDowell

3

Wenn Sie scriptlet oder hässlich EL-Funktionen vermeiden möchten, können Sie Sie besitzen Builder verwenden und die EL-Interpreter täuschen:

... 

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

... 

Überprüfen Sie das Beispiel hier: https://gist.github.com/4581179