スケールするアクション

SAStrutsで、アクションの規模が大きくなっても、
ガタガタになりにくいであろうパターンを検討してみました。


まずは、簡単な足し算のサンプルプログラムを使って順を追って説明します。

【アクション】

  • アクションロジック
    • クラス名は、アクション名Logic。
    • publicフィールドにて用意します。
    • オブジェクト名は@Bindingアノテーションを使って簡潔にします。(推奨は、"logic")

アクションのサンプルコード

public class HogeAction {

    @ActionForm
    @Binding(value="hogeDto")
    public HogeDto dto;

    @Binding(value="hogeLogic")
    public HogeLogic logic;

    @Execute(validator = false)
    public String add() {
        return "add.jsp";
    }

    @Execute(input = "add")
    public String doAdd() {
        dto.result = logic.add(dto.cast());
        return add();
    }
}

【アクションフォーム】

  • アクション名Dtoという名前にします。
  • スコープはリクエストにします。(何もしなくて良い。)
  • RawDto
    • RawDtoという名前の内部クラスを作成します。
    • RawDtoは、アクションフォームのString型ではない適切なデータ型のプロパティで構成します。
  • castメソッド
    • アクションフォームをRawDtoに変換するためのcastメソッドを用意します。


今回はサンプルコードに登場しませんでしたが、必要に応じて以下の役割のメソッドを定義します。

  • copyメソッド
    • 引数として受け取ったセッションDtoへアクションフォームの値を詰め込みます。
  • conditionsメソッド
    • アクションフォームからS2JDBC用のBeanMapを生成するためのメソッドです。

アクションフォームのサンプルコード

public class HogeDto {
    
    public Integer result;
    
    @Required
    @IntegerType
    public String arg1;
    
    @Required
    @IntegerType
    public String arg2;
    
    public static class RawDto {
        public Integer result;
        public Integer arg1;
        public Integer arg2;
    }
    
    public RawDto cast() {
        return Beans.createAndCopy(RawDto.class, this).execute();
    }    
}

【アクションロジック】

  • クラス名は、アクション名Logicとします。
  • 複数のアクションにまたがる処理を記述する通常のロジッククラスと区別するために、特定のアクションでのみ使用するロジッククラスをアクションロジックと呼びます。
  • アクションロジックメソッドの引数にアクションフォームを使いたい場合は、代わりにRawDtoを使います。


アクションロジックのサンプルコード

public class HogeLogic {
    
    public Integer add(HogeDto.RawDto dto) {
        return dto.arg1 + dto.arg2;
    }    
}

今回は、登場しませんでしたが、セッションを使う場合は、セッションDtoを用意します。

【セッションDto

  • クラス名はアクション名SessionDtoとします。
  • スコープはセッションで、クラスに以下のアノテーションを付与します。
    • @Component(instance = InstanceType.SESSION)
  • 必要に応じて作成し、作成した場合はアクションにpublicフィールドとして用意しておきます。
  • アクションのpublicフィールドによってDIされたプロパティをアクションフォームのcopyメソッドへ渡すことでアクションフォームの値からセッションDtoへの値の詰め替えを行います。

課題は?

このパターンは、クラスの数が増加します。クラスの数が増加すると、
同一ユースケースのような関連クラスが分散していると開発効率が悪くなってしまいます。
そこで、次のエントリーでは、同一ユースケースに関連する複数のクラスを、
1箇所のユースケースに対応したパッケージで集中させる方法について説明します。