各select
オプションは、特定のアイテムに関連付ける必要があります。
最も簡単な方法は、 のコレクションを使用し、それぞれにプロパティItem
を与えることです。この例ではを使用しました。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 になり、手動で数値に変換する必要があります。