2010-02-10 33 views
8

Tôi có một lớp học enum USState. Tôi muốn lặp qua các trạng thái trong một JSP.Tôi có thể truy cập các giá trị của một lớp enum từ JSP bằng EL không?

Có thể truy cập danh sách USState mà không đặt danh sách như một thuộc tính trước tiên không? Có vẻ như một cái gì đó tĩnh như một enum nên luôn luôn có sẵn, nhưng tôi không thể tìm ra cách để làm điều đó.

Dưới đây là những gì tôi đang tìm kiếm (ngoại trừ làm việc)

<c:forEach var="state" items="${USState.values}" > 
    <option value="${state}">${state}</option> 
</c:forEach> 
+0

http://stackoverflow.com/questions/2237135/how-can-i-produce-a-select-tag-using-jstl-or -standard-actions-in-a-jsp Bạn có nên lấy Struts không? :) – BalusC

+0

Tôi nghĩ đó là những gì tôi sẽ làm. Tôi đang xây dựng một cái gì đó nhỏ, và suy nghĩ ban đầu là Struts sẽ không cần thiết. –

Trả lời

9

Bạn sẽ phải tạo ra một danh sách ở đâu đó trên mã sự ủng hộ của bạn và vượt qua nó như một tham số mô hình. Tốt nhất trong một ServletContextListener (như tư vấn bởi BalusC) và đặt nó trong (tức là phạm vi ứng dụng) ServletContext:

servletContext.setAttribute("statesList", YourEnum.values()); 
+4

Vì nó đã là một hằng số tôi chỉ cần đặt nó trong phạm vi ứng dụng, nếu cần thiết với sự trợ giúp của 'ServletContextListener'. Một giải pháp thay thế khác là trình giải quyết EL tùy chỉnh hoặc chức năng EL, nhưng đó là một chút công việc. – BalusC

+0

@BalusC: Tôi đã bắt đầu thực hiện việc này rồi. Tôi bắt đầu nghĩ rằng tôi phải hack theo cách tiếp cận chính xác. –

+4

Tôi khá chắc chắn rằng không cần có lệnh gọi 'Arrays.asList()'. Bạn chỉ có thể làm 'servletContext.setAttribute (" statesList ", YourEnum.values ​​());' –

6

Lưu ý rằng bạn cũng có thể sử dụng một scriptlet (Tôi không nghĩ rằng nó quá nguy hiểm trong đó một đơn giản trường hợp):

<c:forEach var="state" items="<%= USState.values() %>" > 

(USState nên hoặc có đủ điều kiện nhập khẩu hoặc sử dụng <%@ page import = "..." %>

+0

Đây là trạng thái hiện tại của mã của tôi. Nó hoạt động, nhưng tôi nghĩ rằng tôi phải bỏ lỡ một cách dễ dàng hơn. –

+1

Ý kiến ​​cá nhân của tôi là điều này dễ bảo trì hơn các giải pháp khác. Nó ngắn và bạn không phải dựa vào các chuỗi có thể thay đổi và phá vỡ mà không cần bạn chú ý. Trong trường hợp này, tôi sẽ không chạy khỏi tập lệnh. –

9

Bạn cũng có thể xem xét để bọc nó trong một JavaBean như sau:

package com.stackoverflow.q2240722; 

public class StateBean { 

    public State[] getValues() { 
     return State.values(); 
    } 

} 

Bằng cách này nó có thể truy cập bằng cách <jsp:useBean>:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<jsp:useBean id="stateBean" class="com.stackoverflow.q2240722.StateBean" /> 

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2240722</title> 
    </head> 
    <body> 
     <select> 
      <c:forEach items="${stateBean.values}" var="state"> 
       <option value="${state}">${state}</option>   
      </c:forEach> 
     </select> 
    </body> 
</html> 
Các vấn đề liên quan