Teedaのページ駆動開発のように実装してみる
1html = 1Page、ユースケース=ディレクトリ
という分かりやすいTeedaのページ駆動開発をSAStrutsで挑戦してみました。
SASturtsの場合は、1html = 1Pageではなく、1JSP = 1Actionですね。
今回は、pageという名前のユースケースを想定してみました。
作成したモジュールは次のとおりです。
- exercise.action.page.FromAction.java
- exercise.action.page.ToAction.java
- exercise.action.page.AbstractPageAction.java
- webapp/page/from.jsp
- webapp/page/to.jsp
AbstractPageAction.java は pageユースケースのための
FromActionとFromActionの共通親クラスです。
作成した機能はとても簡単なものです。
from.jsp から文字列をサブミットしてみる。
from.jspで入力した値が to.jsp で表示される。
以下、ソースコード。
FromAction.java
public class FromAction extends AbstractPageAction { /* Teedaの initialized メソッドに相当するメソッド */ @Execute(validator = false) public String index() { return "/page/from.jsp"; } @Execute(input = "from") public String doSubmit() { return "/page/to"; } }
ToAction.java
public class ToAction extends AbstractPageAction { /* Teedaの initialized メソッドに相当するメソッド */ @Execute(validator = false) public String index() { return "/page/to.jsp"; } }
AbstractPageAction.java
public abstract class AbstractPageAction { @Required public String hoge; }
from.jsp
<html:errors/> <s:form action="/page/from"> <html:text property="hoge" /> <br> <input type="submit" name="doSubmit" /> </s:form>
to.jsp
${f:h(hoge)}
意外とサックリいけました。
TeedaとSAStrutsの良いところをミックスした感じで良い感じだと思います。
Teedaの initialized メソッドに相当する機能をSAStrutsのindexメソッドで
実現できたのは大きい。また、SAStrutsはActionクラスが肥大化する傾向があるが
これならば大丈夫そうですね。
今の時点で気づいた課題を以下にまとめておきます。
【現時点で気づいた課題】
- 実行メソッドのreturn値のがやや冗長になってしまう
- 流れるようなインターフェースでなんとかしたいところ
- リダイレクトでプロパティの値をどう引き継ぐか
- 流れるようなインターフェースでクエリーストリングを作成するべきか?
- SAStrutsPlugInの画面遷移機能が使えなくなってしまう。
Teedaのサブアプリケーションスコープに相当するものが存在しない
追記:
まだ試していないけど、プロパティに付けるバリデーション関連のアノテーションの
target属性が正しく機能しないケースがありそう。
追記2:
親アクションにあるプロパティに例えば、"hogehoge"というtarget属性を書いて
2つの子アクションにそれぞれ "hogehoge"とう名前のメソッドがあった場合に、
片方のアクションのhogehogeメソッドだけバリデーションを有効にしたいケースだと
破綻してしまいますね。今のところ、別々のメソッド名にするしか、対処法がなさそう。
(target = "xxxAction#hogehoge" のような書式をサポートすればなんとかなりそうだなぁ。)