2009-09-14 37 views
7

Giả sử tôi có một thẻ tùy chỉnh mà phải mất một Danh sách Strings:Tạo một danh sách trong EL

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

Làm thế nào tôi có thể tạo ra thuộc tính này trong jsp mà các cuộc gọi thẻ? Tôi có thể sử dụng tập lệnh

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

nhưng có cách nào để thực hiện việc này bằng Ngôn ngữ biểu thức hay không, vì nó có vẻ được ưu tiên hơn?

Trả lời

8

Nếu tất cả các bạn muốn làm là tạo danh sách, sau đó bạn có thể sử dụng [<jsp:useBean>][1] để tạo ra các đối tượng trong phạm vi mong muốn:

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

này hoạt động vì ArrayList có một constructor không có args. Tuy nhiên, danh sách sẽ không có gì trong đó. Và, theo như tôi biết, cả EL lẫn JSTL đều không cung cấp cơ chế tích hợp để thêm các mục vào bộ sưu tập - cả hai đều tập trung vào truy cập chỉ đọc. Tôi cho rằng bạn có thể xác định một số EL function mapping để kích hoạt phương thức add().

Tuy nhiên, tôi nghĩ rằng bạn nên cố gắng không ép JSP làm điều gì đó mà họ không muốn làm. Trong trường hợp này, điều đó có nghĩa là thay vì sử dụng một thẻ tag JSP, bạn nên viết một trình xử lý thẻ thực trong Java.

+0

vẫn còn đúng này 4 năm sau : "cả EL lẫn JSTL đều không cung cấp một cơ chế tích hợp để thêm các mục vào một bộ sưu tập". Không thể tìm cách để làm điều này – cahen

+2

@cahen - Tôi đã không sử dụng EL nhiều trong nhiều năm, nhưng tôi không thấy lý do gì để nó thay đổi. JSP được thiết kế như một công nghệ xem và đột biến là một thứ mà một bộ điều khiển nên làm. – kdgregory

3

kdgregory says, bạn có thể làm điều này với custom tag library functions, mặc dù nó sẽ không đẹp. Ví dụ: một cái gì đó như thế này:

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

Bạn chỉ đang chạy vào những hạn chế của những gì được gọi là Simplest Possible Expression Language.

Sẽ dễ dàng hơn khi thực hiện việc này thông qua một số cơ chế khác, như đậu.

+1

EL có các tính năng mới từ năm 2009: xem thêm [câu trả lời này] (http://stackoverflow.com/questions/10667650/pass-a-list-to-a-jsf-component-without-using-a-bean). – McDowell

3

Nếu bạn muốn tránh scriptlet hoặc các chức năng EL xấu xí, bạn có thể sử dụng bạn sở hữu xây dựng và đánh lừa người phiên dịch 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> 

... 

Kiểm tra ví dụ ở đây: https://gist.github.com/4581179

Các vấn đề liên quan