クライアントサイド(JavaScript)
いくつかのバリデーションは、JavaScriptを用いたクライアントサイドでの実行とすることもできます。その設定方法は、ごく簡単で、JSPファイルの<s:form>タグにvalidate="true"という属性を追加するだけです。それだけで必要なJavaScriptをStruts 2が自動で生成してくれます。
ただしこの場合、複数のsubmitごとに別のバリデーション設定はできません。1つのフォームには、複数のsubmitがあっても1つだけの設定となります。research.jspの場合は、<s:form>タグを次のように変更するだけです。
<s:form action="ResearchConfirm" validate="true"> ~省略~ <s:submit value="確認"/> </s:form>
クライアントサイドでのバリデーションがサポートされているのは、以下のタイプのみとなります。これらのJavaScriptのコードは、Struts 2のソースコードの「\src\core\src\main\resources\template\xhtml\form-close-validate.ft」lに記述されています。
- required
- requiredstring
- stringlength
- regex
- url
- int
- double
なお、表示テーマの設定が「simple」の場合は、クライアントサイドのバリデーション機能は使えません。
アノテーションでの定義
アノテーションとは、Javaのソースファイルにメタデータとして注釈を記入できる機能のことです。Struts 2では、この機能を使ってXML設定ファイルの替わりにバリデーション設定をソースファイルに記述できます。この場合は前述のようなXMLファイルは不要です。
記述の仕方には、クラス定義の前に、@Validations()としてまとめて書く方法と、個別のアクセッサの前に書く方法があります。
クラス単位に書く方法
クラス定義の前に、アノテーションを追加します。また、バリデーション用のパッケージをimportしておきます。
package part2a; import com.opensymphony.xwork2.validator.annotations.*; import org.apache.struts2.interceptor.validation.SkipValidation; @Validations( requiredStrings = { @RequiredStringValidator( fieldName="email", message="名前を入力してください") }, emails = { @EmailValidator( fieldName="email", message="有効なメールアドレスを入力してください") } ) public class Research extends ActionSupport { ~途中省略~ @SkipValidation public String execute() throws Exception { ~以下省略~
@Validationsの上記以外のパラメータには「requiredFields」「dateRangeFields」「intRangeFields」「urls」「regexFields」などがあります。また、アノテーションバリデータには、「@RequiredStringValidator」「@IntRangeFieldValidator」などがあります。
XMLファイルでの定義とは書式が少し異なるだけで、実質的な内容には違いがありません。ここでの詳細は割愛しますので、詳しくはリファレンスを参照してください。
@SkipValidationとは、文字通りバリデーションを行わないようにするための設定です。アノテーションとして記述した場合はすべてのメソッドの実行前にバリデーションが行われてしまいます。最初のAction(Research.action)ではページを表示するだけでよいので、不要なバリデーションが実行されないようにexecute()メソッドの前に@SkipValidationを追加しています。
アクセッサ単位に書く方法
アクセッサごとに書く場合は、クラス定義の前に@Validationだけを記述します。そして、アクセッサの前にバリデータの定義を記述します。この場合でも@SkipValidationの指定は必要です。
@Validation public class Research extends ActionSupport { @RequiredStringValidator(message="名前を入力してください" ) public String getName(){ return name; } public void setName(String name){ this.name = name; } @IntRangeFieldValidator(min = "18", max = "99", message = "${min}歳以上(${max}歳以下)の方が対象です(入力値:${age}歳)") public int getAge(){ return age; } public void setAge(int age){ this.age = age; } @RequiredFieldValidator(message = "選択してください") public String getCareer(){ return career; } public void setCareer(String career){ this.career = career; } @SkipValidation public String execute() throws Exception { ~以下省略~
今回追加したバリデーション
以上がStruts 2で用意されているバリデーションの追加方法です。もう1つの自前でロジックを実装する方法は、次回解説することにします。
まとめ
今回は、基本の入力フォームアプリケーションと、バリデーションの基本的な仕組みについて説明しました。Struts 2では、ちょっとした記述を追加するだけでバリデーション機能が利用できるようになります。特にアノテーションのおかげでActionクラスに処理をひとまとめに記述できますので、以前のStrutsより分かりやすいコードが書けるようになっています。また、Struts 2のバリデータも一覧表のとおり多くのものが提供されています。ぜひ実際にコードを書いてみて、いろいろと試してみてください。
参考資料
- Apache Struts
- Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク
- 【特集】実践サンプルで学ぶStruts 2 - 生まれ変わった定番フレームワークを徹底解説:マイコミジャーナル
- Struts2を使ってみる
- ITの現場-Java,Flex,Strus2,Spring2,Hibernate3,Ajax,PHP
- OGNLガイド:Seasar - DI Container with AOP
- 「Struts2入門」(川崎克巳 著 、オンライン書籍)
- 「サーブレット&JSP逆引き大全650の極意 改訂第3版」(川崎克巳 著、秀和システム、2007年12月)
