我需要将枚举的所有值显示为<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()));
}
%>
...
但是,我想使用JSTL / EL代码来实现它。我该怎么办?
更新
Spring现在有一种更简单的方法。首先添加弹簧框架工作标签
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
那么如果你只是声明一个选择路径中的变量是枚举,
spring自动找到其他元素。
<form:select path="dataFormat.delimiter" class="dataFormatDelimiter">
<form:options items="${dataFormat.delimiter}"/>
</form:select>
答案 0 :(得分:7)
创建一个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 <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>