2011-07-25 29 views
5

Tôi cần hiển thị tất cả các giá trị của một enum là <option> yếu tố. Tôi đã đạt được điều này bằng scriptlets:Làm thế nào để hiển thị tất cả các giá trị của một enum là <option> yếu tố?

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
    <%@ taglib prefix="errors" tagdir="/WEB-INF/tags/jostens/errors" %> 
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 

... 
<% 
     Class<?> c = CarrierCode.class; 
     for (Object carrier : c.getEnumConstants()) { 
      CarrierCode cc = (CarrierCode) carrier; 
      StringBuilder sb = new StringBuilder(); 
      Formatter formatter = new Formatter(sb, Locale.US); 
      out.print(formatter.format("<option value='%s'>%s</option>\n", cc.getMfCode(), cc.name())); 
     } 
%> 
... 

Tuy nhiên, tôi muốn thực hiện nó sử dụng JSTL/EL mã thay vì. Tôi làm nó như thế nào?

UPDATE:

Spring có một cách dễ dàng hơn để làm điều này ngay bây giờ. Trước tiên, thêm các thẻ làm việc của khung hình mùa xuân <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> sau đó nếu bạn chỉ khai báo lựa chọn nơi biến trong đường dẫn là một trường hợp Enum, tự động tìm các phần tử khác.

<form:select path="dataFormat.delimiter" class="dataFormatDelimiter"> 
    <form:options items="${dataFormat.delimiter}"/> 
</form:select> 
+0

@BalusC Cảm ơn bạn đã chỉnh sửa rõ ràng hơn bây giờ. – kasdega

+1

Có thể trùng lặp [lặp lại các hằng số Enum trong JSP] (http://stackoverflow.com/questions/141611/iterating-over-enum-constants-in-jsp) – Stewart

Trả lời

7

Tạo thực hiện ServletContextListener trong đó đặt các giá trị enum trong phạm vi ứng dụng trong quá trình startup webapp để nó có sẵn trong EL bởi ${carrierCodes}. Lớp này có thể sử dụng lại cho tất cả những thứ khác mà bạn muốn làm một lần trong quá trình khởi động webapp.

@WebListener 
public class Config implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     event.getServletContext().setAttribute("carrierCodes", CarrierCode.values()); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     // NOOP 
    } 

} 

Lưu ý rằng tôi đã sử dụng Enum#values() thay vì phương pháp vụng về Class#getEnumConstants(). Nó trả về một mảng của tất cả các giá trị enum.

Sau đó, trong JSP, chỉ cần sử dụng JSTL<c:forEach> để lặp qua nó.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
... 
<select name="carrierCode"> 
    <c:forEach items="${carrierCodes}" var="carrierCode"> 
    <option value="${carrierCode.mfCode}">${carrierCode}</option> 
    </c:forEach> 
</select> 
+0

Tôi sẽ chụp. Cảm ơn bạn. – kasdega

+0

Đồng ý câu trả lời tuyệt vời! Nó hoạt động hoàn hảo. Cám ơn rất nhiều. – kasdega

+0

Bạn được chào đón. – BalusC

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