每个select
选项都需要与特定项目相关联。
最简单的方法是使用Item
s 的集合,并为每个集合赋予Item
一个rating
属性。我Integer
在这个例子中使用了一个。
使用<html:select>
数组表示法,并直接设置每个项目的评级。(我使用的是表单本身的费率列表和更简单的布局;忽略这些差异。)
<logic:iterate id="item" name="ratesForm" property="itemList" indexId="i">
${item.name}
<html:select property="itemList[${i}].rating">
<html:optionsCollection name="ratesForm" property="rates" label="description" value="value" />
</html:select>
<br/>
</logic:iterate>
该操作按照我们的预期访问项目评级:
RatesForm ratesForm = (RatesForm) form;
List<Item> items = ratesForm.getItemList();
for (Item item : items) {
System.out.println(item.rating);
}
如果项目没有关联的评级,则需要使用项目 ID 键和评级值的映射。这更令人费解。我推荐一个收藏。
首先,地图将是Map<String, Object>
因为索引属性的工作方式。除了地图本身的普通 getter 之外,还提供索引方法:
private Map<String, Object> itemRatings;
public Map<String, Object> getItemRatings() {
return itemRatings;
}
public Object getItemRating(String key) {
return itemRatings.get(key);
}
public void setItemRating(String key, Object val) {
itemRatings.put(key, val);
}
JSP 将类似,但使用"()"
而不是 "[]"
使用索引表单方法。
<logic:iterate id="item" name="ratesForm" property="itemList">
${item.name}
<html:select property="itemRating(${item.id})">
<html:optionsCollection name="ratesForm" property="rates" label="description" value="value" />
</html:select>
<br/>
</logic:iterate>
提交表单时,itemRatings
映射将包含代表每个项目 ID 的字符串键。键和值都是String
s,您需要手动转换为数值。