ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Super Agile Struts開発記その8 - ActionFormの更新

ActionFormの更新機能をサポートしました。特徴的なのは、Strutsのタグを利用せず、JSTLのみ(html:formは使うこともあるかも)で開発ができることです。
例えば、nameプロパティを更新するには、つぎのようなJSPを用意します。


<form action="bbb2.do" method="post">
<input type="text" name="name" value="${name}"/>
<input type="submit"/>
</form>
input系のタグのname属性をプロパティ名とあわせておけば、自動的にアクションフォームが更新されます。SAStrutsの更新機能のうりは、リストやJavaBeansのプロパティがnullのケースは、自動的に初期化してくれることです。
次の例を見てください。

public class Hoge {
public String aaa;
public String bbb;
}

@Result(path = "/aaa/bbb.jsp")
public class BbbAction {
public List<Hoge> hogeList;
@Execute
public String execute() {
return "success";
}
}

<c:forEach items="${hogeList}" var="hoge" varStatus="s">
<input type="text" name="hogeList[${s.index}].aaa"
value="${hoge.aaa}"/>
</c:forEach>
hogeList[0].aaaのようなリクエストパラメータが飛んできたとき、hogeListがなければ作成し、0番目のインデックスのデータがなければ、Hogeをnewして0番目のデータとして追加します。
ポイントは、name属性の値で、ここをプロパティのパスにすれば、どんなネストしたパスでも、nullの場合は自動的に初期化され、設定することができます。次のようなネストも可能です。

@Result(path = "/aaa/bbb.jsp")
public class BbbAction {
public List<List<Hoge>> hogeListList;
@Execute
public String execute() {
return "success";
}
}

<c:forEach items="${hogeListList}" var="hogeList" varStatus="s">
<c:forEach items="${hogeList}" var="hoge" varStatus="s2">
<input type="text" name="hogeListList[${s.index}][${s2.index}].aaa"
value="${hoge.aaa}"/>
</c:forEach>
</c:forEach>
ActionもJSPブラックボックスな部分がほとんどなく、明示的に書かれていてわかりやすいうえに、コーディングの量も少ないことがわかってもらえるのではないかと思います。
追記:もちろん、これまでのStrutsのタグも使うことができます。