2008-09-26 23 views
12

Tôi có một Enum như thế nàyiterating qua hằng Enum trong JSP

package com.example; 

public enum CoverageEnum { 

    COUNTRY, 
    REGIONAL, 
    COUNTY 
} 

Tôi muốn để lặp qua các hằng số trong JSP mà không cần sử dụng mã scriptlet. Tôi biết tôi có thể làm điều đó với mã tập lệnh như sau:

<c:forEach var="type" items="<%= com.example.CoverageEnum.values() %>"> 
    ${type} 
</c:forEach> 

Nhưng tôi có thể đạt được điều tương tự nếu không có tập lệnh không?

Chúc mừng, Don

Trả lời

5

Nếu bạn đang sử dụng Tag Libraries bạn có thể đóng gói mã nó trong một hàm EL. Vì vậy, các thẻ mở sẽ trở thành:

<c:forEach var="type" items="${myprefix:getValues()}"> 

EDIT: Để đối phó với cuộc thảo luận về thực hiện điều đó sẽ làm việc cho nhiều loại Enum chỉ phác thảo ra này:

public static <T extends Enum<T>> Enum<T>[] getValues(Class<T> klass) { 
    try { 
     Method m = klass.getMethod("values", null); 
     Object obj = m.invoke(null, null); 
     return (Enum<T>[])obj; 
    } catch(Exception ex) { 
     //shouldn't happen... 
     return null; 
    } 
} 
+0

Nếu tôi làm theo cách này tôi cần phải xác định một chức năng EL cho mỗi enum, đó sẽ là một nỗi đau thực sự. Xác định một hàm duy nhất hoạt động cho tất cả các enums (có lẽ là thông qua sự phản chiếu) sẽ thích hợp hơn. Nhưng chắc chắn như một chức năng đã tồn tại trong một số taglib JSP? –

+0

Có thể có nhưng tôi không biết về nó, chỉ có một đi: tĩnh công > Enum [] getValues ​​(Lớp klass) { \t try { \t \t Phương pháp m = klass. getMethod ("giá trị", null); \t \t Object obj = m.invoke (null, null); \t \t trả lại (Enum []) obj; \t} bắt (Ngoại lệ cũ) { \t \t trả lại null; \t} } –

+0

Công việc tuyệt vời. Boy, là tham số kiểu > xấu xí! Tôi đang chỉ trích việc thực thi Generics Java ở đây, chứ không phải mã của bạn. Tôi đã bị ép buộc vào những sự ghê tởm tương tự. Cảm ơn mã. –

7

Nếu bạn đang sử dụng Spring MVC, bạn có thể hoàn thành mục tiêu của bạn với sự giúp đỡ cú pháp sau:

<form:form method="post" modelAttribute="cluster" cssClass="form" enctype="multipart/form-data"> 
    <form:label path="clusterType">Cluster Type 
     <form:errors path="clusterType" cssClass="error" /> 
    </form:label> 
    <form:select items="${clusterTypes}" var="type" path="clusterType"/> 
</form:form> 

nơi thuộc tính mô hình của bạn (ví dụ, thực thể đậu/dữ liệu để cư) được đặt tên theo cụm và bạn đã cư thứ e mô hình với một mảng enum của các giá trị có tên clusterTypes. Phần <form:error> là rất nhiều tùy chọn.

Trong đất Spring MVC, bạn cũng có thể tự động cư clusterTypes vào mô hình của bạn như thế này

@ModelAttribute("clusterTypes") 
public MyClusterType[] populateClusterTypes() { 
    return MyClusterType.values(); 
} 
Các vấn đề liên quan