スケールするアクション
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(); } }
【アクションフォーム】
- 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を用意します。