SAStrutsのバリデーション

DBFluteとは直接無関係ながらも、親和性の高いフレームワークを紹介します。 ここでは、SAStrutsのバリデーションについて。

バリデーションの概要

大きくは二つ

大きく分けると二種類のバリデーション方式があります。

アノテーション方式
Formのプロパティにアノテーションを付与してお手軽チェック
メソッドベタ方式
バリデーションメソッドの中で自分でなんでもチェック

ハイブリッドway

アノテーション方式は表現に限界があります。 厳密には、独自のバリデーションアノテーションを作るなどすればそうではないですが、 用意されているものだけでとなると業務で求められる複雑な条件のバリデーションはなかなか難しくなってきます。

なので、アノテーション方式だけで済ませるというのではなく、現実的にはメソッドベタ方式も織り交ぜていくことが想定されます。 ハイブリッドなやり方です。

割り切りway

ただ、ハイブリッドだと、バリデーションのロジックが分散してしまいます。 ある項目のチェックがどのようなものなのか?を調べるには、Formの定義とメソッドを見ないといけません。

また、SAStrutsのデフォルトでは、アノテーションによるバリデーションでエラーになったらメソッドのバリデーションは呼ばれません。 これだと二段階バリデーションになってしまい、UI的にはあまり良いものにはなりません。 Executeアノテーションの属性で挙動を変更できますが、それぞれのActionで毎回定義しないといけないので、設定漏れで二段階バリデーションになってしまうかもしません。

なので、アノテーションは一切使わずに、バリデーションメソッドだけでやるというやり方もアリかもしれません。 簡単なバリデーションもロジックで書くのはちょっと面倒かもしれませんが、それはうまくユーティリティを作るなどして、楽に実装できるようにすればいいかと。

アノテーション方式のやり方

Executeでvalidator=true

Executeアノテーションにて validator属性を true にて、input属性にバリデーションエラー発生時に表示するJSPを指定します。

e.g. Executeアノテーションでバリデーションの指定 @Java
@Execute(validator=true, input="index.jsp")
public String index() {
}

Formのフィールドにアノテーションを

そして、ActionFormのpublicフィールドに、バリデーション用のアノテーションを定義します。 すると、リクエストが来たときにバリデーションが実行され、エラーがひとつでもある場合は Action のメソッドは呼ばれずに、input属性で指定されたJSPを表示します。

e.g. ActionFormでバリデーションのアノテーション @Java
@Required
public String memberName;