如何将枚举的所有值显示为<option>元素?

kas*_*ega 5 java enums jsp jstl el

我需要将枚举的所有值显示为<option>元素.我用scriptlets实现了这个目的:

    <%@ 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()));
        }
%>
...
Run Code Online (Sandbox Code Playgroud)

但是,我想使用JSTL/EL代码来实现它.我该怎么做?

更新:

Spring现在有一种更容易的方法.首先添加弹簧框架工作标签 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 然后如果你只是声明一个选择,其中路径中的变量是一个枚举,弹簧自动找到其他元素.

<form:select path="dataFormat.delimiter" class="dataFormatDelimiter">
    <form:options items="${dataFormat.delimiter}"/>
</form:select>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 7

创建一个ServletContextListener实现,在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
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是Enum#values()代替笨拙的Class#getEnumConstants()方法.它返回所有枚举值的数组.

然后,在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>
Run Code Online (Sandbox Code Playgroud)