2009-09-14 10 views
7

Załóżmy, że mam własny znacznik, który pobiera listę ciągi:Tworzenie listy w El

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

Jak mogę utworzyć ten atrybut w JSP, która wywołuje tag? Mógłbym użyć scriptlet

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

ale czy jest jakiś sposób to zrobić przy użyciu Expression Language, ponieważ wydaje się być korzystne?

Odpowiedz

8

Jeśli wszystko, co chcesz zrobić, to stworzyć listę, a następnie można użyć [<jsp:useBean>][1] aby utworzyć obiekt w żądanym zakresie:

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

To działa, ponieważ nie ma ArrayList-args konstruktora. Jednak lista nie będzie zawierała niczego. I, o ile mi wiadomo, ani EL ani JSTL nie oferują wbudowanego mechanizmu do dodawania elementów do kolekcji - obie koncentrują się na dostępie tylko do odczytu. Przypuszczam, że można zdefiniować EL function mapping, aby włączyć metodę add().

Uważam jednak, że lepiej nie próbować zmuszać JSP do zrobienia czegoś, czego nie chce robić. W tym przypadku oznacza to, że zamiast używać pliku znaczników JSP, powinieneś napisać rzeczywistą obsługę znaczników w Javie.

+0

jest to jeszcze prawdziwe 4 lata później : "Ani EL ani JSTL nie zapewniają wbudowanego mechanizmu dodawania elementów do kolekcji". Nie mogłem znaleźć sposobu na zrobienie tego. – cahen

+2

@cahen - Nie używałem EL przez kilka lat, ale nie widzę powodu, dla którego mógłby się zmienić. JSP ma służyć jako technologia widoku, a mutacja to coś, co powinien wykonać kontroler. – kdgregory

3

Jako kdgregory says można to zrobić z custom tag library functions, ale nie będzie to piękne. Na przykład coś takiego:

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

Jesteś tylko bieg do ograniczeń, co zwykło się nazywać Simplest Possible Expression Language.

Łatwiej byłoby to zrobić za pomocą innego mechanizmu, np. Fasoli.

+1

EL ma nowe funkcje od 2009 roku: patrz również [ta odpowiedź] (http://stackoverflow.com/questions/10667650/pass-a-list-to-a-jsf-component- bez -używania-przyp.). – McDowell

3

Jeśli chcesz uniknąć scriptlet czy brzydkie funkcje EL, można użyć jesteś właścicielem budowniczy i oszukać tłumacza 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> 

... 

sprawdzić przykład tutaj: https://gist.github.com/4581179