連休は、家族サービスとか、後輩の教育とかしつつ、
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さん、ありがとうございます。