行数が可変の表において、セルの中にラジオボタンを配置する方法。
ひしだま | メイン サブ サード |
ひしだみー | メイン サブ サード |
ひしだむ | メイン サブ サード |
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()); }