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)}


意外とサックリいけました。
TeedaSAStrutsの良いところをミックスした感じで良い感じだと思います。


Teedaの initialized メソッドに相当する機能をSAStrutsのindexメソッドで
実現できたのは大きい。また、SAStrutsはActionクラスが肥大化する傾向があるが
これならば大丈夫そうですね。


今の時点で気づいた課題を以下にまとめておきます。


【現時点で気づいた課題】

  • 実行メソッドのreturn値のがやや冗長になってしまう
    • 流れるようなインターフェースでなんとかしたいところ
  • リダイレクトでプロパティの値をどう引き継ぐか
    • 流れるようなインターフェースでクエリーストリングを作成するべきか?
  • SAStrutsPlugInの画面遷移機能が使えなくなってしまう。
  • Teedaのサブアプリケーションスコープに相当するものが存在しない


追記:
まだ試していないけど、プロパティに付けるバリデーション関連のアノテーション
target属性が正しく機能しないケースがありそう。

追記2:
親アクションにあるプロパティに例えば、"hogehoge"というtarget属性を書いて
2つの子アクションにそれぞれ "hogehoge"とう名前のメソッドがあった場合に、
片方のアクションのhogehogeメソッドだけバリデーションを有効にしたいケースだと
破綻してしまいますね。今のところ、別々のメソッド名にするしか、対処法がなさそう。
(target = "xxxAction#hogehoge" のような書式をサポートすればなんとかなりそうだなぁ。)