行数が可変の表において、セルの中にラジオボタンを配置する方法。
| ひしだま | メイン サブ サード |
| ひしだみー | メイン サブ サード |
| ひしだむ | メイン サブ サード |
1行の情報を保持するサブフォームを作り、主フォームからはインデックスでサブフォームを取得するgetterを用意する。
JSP内ではlogic:iterateをインデックス付きで使用。ラジオボタンも「インデックスを有効」という指定にする。
jsp:
<table border="1"> <logic:iterate name="mainForm" property="charactor" scope="request" id="charactor" indexId="index1"> <tr> <td> <bean:write name="charactor" property="name" filter="false"/> </td> <td> <html:radio name="charactor" property="radioCode" indexed="true" value="1"/>メイン <html:radio name="charactor" property="radioCode" indexed="true" value="2"/>サブ <html:radio name="charactor" property="radioCode" indexed="true" value="3"/>サード </td> </tr> </logic:iterate> </table>
MainForm.java(主フォーム):
public class MainForm extends ActionForm {
/** キャラクター */
private List charactor = new ArrayList();
/**
* 子フォーム一覧取得.
* strutsフレームワークが使用する。
* @return SubForm[]
*/
public SubForm[] getCharactor() {
return (SubForm[])charactor.toArray(new SubForm[0]);
}
/**
* 子フォーム取得.
* strutsフレームワークが使用する。
* 当メソッドは無くてもかまわない。無い場合は配列を返すタイプのメソッドで代用される。
* ただし自分でも使えるので、あった方が便利。
* @param pos 行インデックス
* @return SubForm
*/
public SubForm getCharactor(int pos) {
return (SubForm)charactor.get(pos);
}
/**
* 行数取得.
* 自分で使用する目的。
* @return 表の行数
*/
public int getCharactorFormSize() {
return charactor.size();
}
/**
* 子フォーム取得.
* 自分で使用する目的。
* @param pos 行インデックス
* @return SubForm
*/
protected SubForm getCharactorForm(int pos) {
while(pos >= charactor.size()) {
charactor.add(null);
}
SubForm form = (SubForm)charactor.get(pos);
if(form == null) {
form = new SubForm();
charactor.set(pos, form);
}
return form;
}
/**
* 名前セット.
* @param pos 行インデックス
* @param name 名前
*/
public void setName(int pos, String name) {
getCharactorForm(pos).setName(name);
}
/**
* ラジオボタンのコードセット.
* @param pos 行インデックス
* @param code ラジオボタンの値
*/
public void setRadioCode(int pos, String code) {
getCharactorForm(pos).setRadioCode(code);
}
}
SubForm.java(表の1行分の情報を保持する):
public class SubForm { //子フォームは publicでありさえすればよく、ActionFormを継承している必要は無い
/** 名前 */
private String name;
/** ラジオボタンの値 */
private String radioCode;
/**
* 名前セット.
* @param name 名前
*/
public void setName(String name) {
this.name = name;
}
/**
* 名前取得.
* @return 名前
*/
public String getName() {
return name;
}
/**
* ラジオボタンの値セット.
* @param code ラジオボタンの値
*/
public void setRadioCode(String code) {
radioCode = code;
}
/**
* ラジオボタンの値取得.
* @return ラジオボタンの値
*/
public String getRadioCode() {
return radioCode;
}
}
画面を作るAction.java:
MainForm form = new MainForm(); form.setName(0, "ひしだま"); form.setRadioCode(0, "1"); form.setName(1, "ひしだみー"); form.setRadioCode(1, "2"); form.setName(2, "ひしだむ"); form.setRadioCode(2, "3");
↓
生成されたHTML:
<table border="1"> <tr> <td> ひしだま </td> <td> <input type="radio" name="charactor[0].radioCode" value="1" checked="checked">メイン <input type="radio" name="charactor[0].radioCode" value="2">サブ <input type="radio" name="charactor[0].radioCode" value="3">サード </td> </tr> <tr> <td> ひしだみー </td> <td> <input type="radio" name="charactor[1].radioCode" value="1">メイン <input type="radio" name="charactor[1].radioCode" value="2" checked="checked">サブ <input type="radio" name="charactor[1].radioCode" value="3">サード </td> </tr> <tr> <td> ひしだむ </td> <td> <input type="radio" name="charactor[2].radioCode" value="1">メイン <input type="radio" name="charactor[2].radioCode" value="2">サブ <input type="radio" name="charactor[2].radioCode" value="3" checked="checked">サード </td> </tr> </table>
↓
このHTMLがサブミットされる(submitボタンが押される)と、MainForm(及びSubForm)にラジオボタンで選択した値が入る。
サブミットを受け取るAction.java:
for(int i=0; i<form.getCharactorFormSize(); i++){
SubForm sub = form.getCharactor(i);
System.out.println(i + ":" + sub.getRadioCode());
}