【问题标题】:How to display all values of an enum as <option> elements?如何将枚举的所有值显示为 <option> 元素?
【发布时间】:2011-07-25 21:30:35
【问题描述】:

我需要将枚举的所有值显示为&lt;option&gt; 元素。我使用 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()));
        }
%>
...

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

更新:

Spring 现在有一个更简单的方法来做到这一点。首先添加弹簧框架工作标签 &lt;%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %&gt; 那么如果你只是声明一个选择,其中路径中的变量是一个枚举, spring 自动查找其他元素。

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

【问题讨论】:

标签: java jsp enums jstl el


【解决方案1】:

创建一个ServletContextListener 实现,在webapp 启动期间将枚举值放入应用程序范围,以便${carrierCodes} 在EL 中可用。此类可重复用于您希望在 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() 方法。它返回一个包含所有枚举值的数组。

然后,在 JSP 中,只需使用 JSTL &lt;c:forEach&gt; 对其进行迭代。

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

【讨论】:

  • 我会试一试。谢谢。
猜你喜欢
  • 2014-09-24
  • 2021-10-03
  • 2010-10-22
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多