谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

リスト入力画面を作る方法

連休は、家族サービスとか、後輩の教育とかしつつ、
S2StrutsでWebアプリ作成。
いやー、実はWebアプリを作るのは久々で、割とはまる (^^;


さて、FAQの一つだと思うんですが、
テーブル内にテキストボックスを並べて、
リスト入力する (Listで値を受け取る) ような画面の作り方。
ググってもうまく見つけられなかったので、メモ代わりに残しておきます。


最初は <logic:iterate> と <html:text indexed="true"> で作ったんですが
これだと、HTMLテンプレートに書いたタグを、
Mayaaファイル側で丸々上書きしてしまうので、よろしくない。

2007/5/9追記
ボディの解釈の仕方を勘違いしていました。
Mayaaファイル側でタグを記述しても、Mayaaファイル側のタグにボディ部分を記述しなければ
HTMLテンプレートに書いたタグのボディ部分は有効になります。

例えば、HTMLテンプレート側にデザイン改修が入って
class属性が書き換わったら、Mayaaファイルの書き換えも必要になります。
それでは美しくないので、m:forで出来ないか試してみました。


xxxFormが、xxxListという可変のリストを属性として持っていて、
その値 (value属性) をリストで受け取るという例で作りました。


HTMLテンプレートの記述

<tbody id="xxxList">
	<tr>
		<td class="label">○○○</td>
		<td><input type="text" id="input" /></td>
	</tr>
</tbody>


Before - logic:iterateを使う場合 (Mayaaファイルの記述)

<logic:iterate m:id="xxxList" id="xxx" name="xxxForm" property="xxxList" indexId="index">
	<tr>
		<td class="label">○○○</td>
		<td><html:text indexed="true" name="xxx" property="value" /></td>
	</tr>
</logic:iterate>


After - m:forを使う場合 (Mayaaファイルの記述)

<m:for m:id="xxxList"
		init="${ var i = 0 }"
		test="${ i < xxxForm.instance.getXxxList().size() }"
		after="${ i++ }">
	<m:exec script="${ request.setAttribute(xxx, xxxForm.instance.getXxxList()); }"/>
	<m:doBody/>
</m:for>

<html:text m:id="input" property="xxx[${i}].value" />

これでOK。
propertyの中で ${} を使ってループ変数にアクセスできました。


ActionとかActionForm側の実装は、
調べればいくらでも出てくるので割愛します。


One More After - そもそもボディの解釈の仕方を誤解していました(コメント欄参照)

<logic:iterate m:id="xxxList" id="xxx" name="xxxForm" property="xxxList" />
<html:text m:id="input" name="xxx" property="value" indexed="true" />

こんな書き方で問題ありませんでした。


sugaさん、ありがとうございます。