Как отобразить все значения перечисления в виде элементов?
Мне нужно отобразить все значения перечисления как элементы <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 ответ:
Создайте реализацию
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>