S-JIS[2005-08-07] 変更履歴

Strutsラジオタグの応用


表(行数が不定のテーブル)の中のラジオボタン

行数が可変の表において、セルの中にラジオボタンを配置する方法。

サンプル
ひしだま メイン サブ サード
ひしだみー メイン サブ サード
ひしだむ メイン サブ サード

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());
	}

logic:iterateへ戻る / Strutsへ戻る / JSPへ戻る
メールの送信先:ひしだま