Super Agile Struts開発記
Super Agile Strutsとは、StrutsとSeasar2を使った開発をAgileに行なうためのフレームワークです。今回は、開発中に考えたことをそのまま書いてみようと思います。
Actionは、もちろんPOJOだよね。ActionFormなんていならない。リクエストパラメータは、Actionクラスのプロパティに格納されたほうがシンプル。
リクエストパラメータは、Actionに格納されるので、Actionのスコープはrequest。
URLも*.doなんてかっこ悪い。/ユースケース名/アクション名で書けるようにします。
今の実装だと、/greeting/inputに対するリクエストは、rootpackage.web.greeting.InputActionにマッピングされます。
現状は、ここまでの実装しかできてなくて、次は、ActionForwardの実装を入れます。Actionクラスに次のようにアノテーションで指定する感じ。
遷移先が複数ある場合は、@Resultsで指定する感じ。
@Result(name="success", path="/greeting/input.jsp")
この辺は、Struts2の仕様にあわせておいたほうがいいかなと思っています。
@Results({
@Result(...), @Result(...)
})
フィードバックや要望は大歓迎です。よろしくお願いします。
追記:バリデーションは、フィールドにアノテーションで記述します。
publicフィールドに対応しているので、結構すっきりするのではないかと思います。validate(), reset()もActionに記述する感じです。
@Required
public String arg1;@Required
public String arg2;
後、Java5以上を対象にしています。
追記2:
Actionのフィールドからエンティティに値をコピーするときは、Beansを使うほうが、軽くていいかなと思っています。Actionからエンティティを生成するには次のようにします。
Employee e = Beans.createAndCopy(Employee.class, this).execute();
Super Agile Struts開発記その2
Actionにリクエストが飛んできたとき、Actionクラスのメソッドで@Executeアノテーションがつけられているものを実行するようにします。
@Executeがついているメソッドが1つだけなら、デフォルトで実行され、複数ある場合は、ボタン系のタグのname属性と同じメソッドが実行されます。
@Execute
public String execute() {
return "success";
}
@Execute
public String add() {
...
return "success";
}
@Execute
public String subtract() {
...
return "success";
}
@Executeには、validate属性があり、デフォルトはtrueですが、falseにすることによって、バリデーションをしないでメソッドを呼び出せるようになります。戻るボタンのようにバリデーションなしで画面遷移するときに使います。
<input type="submit" name="add"/>
<input type="submit" name="subtract"/>
メソッド名がdoXxxで戻り値の型がStringだったら、呼び出せるようにするというやり方もあるのですが、今回は、CoCを必要最小限に抑える方針なので、明示的にアノテーションを指定する方法を採用しています。
@Execute(validate = false)
public String previous() {
return "previous";
}