Как отобразить все значения перечисления в виде элементов?


Мне нужно отобразить все значения перечисления как элементы <option>. Я достиг этого с помощью скриплетов:

    <%@ 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()));
        }
%>
...

Однако я хотел бы реализовать его с помощью кода JSTL/EL. Как я могу это сделать?

Обновление:

Теперь у Весны есть гораздо более простой способ сделать это. Сначала добавьте метки работы пружинной рамы <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> затем, если вы просто объявите select, где переменная в path является перечислением, весна автоматически находит другие элементы.
<form:select path="dataFormat.delimiter" class="dataFormatDelimiter">
    <form:options items="${dataFormat.delimiter}"/>
</form:select>
1 5

1 ответ:

Создайте реализацию ServletContextListener, которая помещает значения enum в область приложения во время запуска webapp, чтобы они были доступны в EL по ${carrierCodes}. Этот класс можно повторно использовать для всех других вещей, которые вы хотели бы сделать один раз во время запуска 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
    }

}
Обратите внимание, что я использовал Enum#values() вместо неуклюжего метода Class#getEnumConstants(). Он возвращает массив всех значений enum.

Тогда, в JSP, просто используйте JSTL <c:forEach> чтобы повторить его.

<%@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>