【发布时间】:2011-01-15 06:43:16
【问题描述】:
我想在 JSP 中创建一个选择标记,其中选项是一个枚举(例如,所有美国州)。它们是 JSTL 中的标记还是可以执行此操作的标准标记,而无需手动遍历列表?
【问题讨论】:
-
您应该在此处进一步澄清“手动”一词。您还应该澄清 c:forEach 有什么问题。它也可以动态迭代列表,而无需事先知道项目的数量。
我想在 JSP 中创建一个选择标记,其中选项是一个枚举(例如,所有美国州)。它们是 JSTL 中的标记还是可以执行此操作的标准标记,而无需手动遍历列表?
【问题讨论】:
当然,在JSTL(只需将jstl-1.2.jar 放入/WEB-INF/lib)中有c:forEach 标签。您只需要将(老式的)Enumeration 转换为现代的 List 或 Enum,如果它是用 Java 硬编码的。如果要从不可更改的第 3 方 API 获取 Enumeration,如有必要,您可以为此获取 Collections#list()。
这是一个如何使用<c:forEach> 的演示:
<select name="country">
<c:forEach items="${countries}" var="country">
<option value="${country.code}" ${param.country eq country.code ? 'selected' : ''}>${country.name}</option>
</c:forEach>
</select>
${countries} 应该引用 List<Country> 或 Country[],它们已被放入 page、request、session 或 application 范围中的任何一个中——其中 application 范围是最直接的选择,因为国家列表应该是一个应用程序范围的常量。您可以使用ServletContextListener 加载一次并在应用程序启动时放入应用程序范围。在此示例中,Country 只是一个具有至少两个属性的 Javabean(模型)类。
【讨论】:
JSTL 中没有。然而,许多框架都提供了这样的附加标签:
Struts2 - <s:select>
Spring MVC - <form:select>
<h:selectOneMenu>
【讨论】:
h:selectOneMenu。
c:forEach”,但它很可能意味着其他任何东西。