はじめに
「Apache Struts」(以下、Struts)とは、サーバサイドJava開発のデファクトスタンダードとしてあまりにも有名なオープンソースのWebアプリケーション・フレームワークです。本連載は、実際に動作するアプリケーションをもとに、Strutsの次世代バージョンであるStruts 2を解説していきます。第3回目の本稿は、前回の「バリデーションの仕組みを理解する」の後編として、バリデーションロジックを自前で記述する方法と、メッセージのローカライズ方法を中心に解説していきます。
前回の記事
対象読者
サーバサイドJava(JSP&サーブレット)について基本的なことを理解している方を対象とします。
バリデーション・ロジックの組み込み
前回解説したように、Struts 2には多くのバリデーション処理があらかじめ定義されています。しかし、実際のアプリケーションでは複数のフィールドにまたがるバリデーション処理など、Struts 2の機能だけでは対応できないことも多いかと思います。そのような場合には、自分でバリデーション・ロジックを実装することになります。
Struts 2でAction
クラスに独自のバリデーション・ロジックを組み込む際は、validate
というメソッドの実装を行います。次のサンプルコードは、前回のAction
クラス、Research
クラスに、バリデーション・ロジックを追加する例です。バリデーション処理自体は、ごく単純なサンプルですので、特に説明は不要でしょう。
public class Research extends ActionSupport { // 追加のvalidateの実装 public void validate() { if ( name == null || name.length() == 0 ) { addActionError("名前を入力してください"); } if ( email==null || email.length() == 0 ) { addActionError("メールアドレスを入力してください"); } if ( age < 18 || age > 99 ) { addActionError("18歳以上(99歳以下)の方が対象です"); } if ( career == null ) { addActionError("キャリアを選択してください"); } } }
validate
メソッドは、Struts 2で定義されているValidatable
インターフェイスの実装です。このメソッドが実装されている場合、Action
メソッドが呼び出される前に、その処理が自動的に実行されるようになっています。
各バリデーション処理でエラーとなったら、addActionError
メソッドで、エラー用のメッセージを追加します。このメソッドは、親クラスで用意されているエラーメッセージ用のコレクションに、指定した文字列を追加します。
エラーの発生は、このコレクションのデータの有無で判断しています。エラーがあると判断された場合、Action
メソッドの処理はスキップされ、メソッドの戻り値としてinput
という値が返されます。
JSP側でのエラーメッセージ表示
addActionError
メソッドで追加したエラー表示用のメッセージをJSPで参照する場合は、<s:actionerror>
タグを用います。前回の「research.jsp」に、このタグを追加すると、次のようになります。
<body> <s:actionerror /> <s:form action="Research"> <s:textfield label="名前" name="name"/> <s:textfield label="メールアドレス" name="email" /> <s:textfield label="年齢" name="age"/> <s:radio label="どの携帯のCMが好き?" name="career" list="#{'1':'ドコモ', '2':'au', '3':'ソフトバンク'}"/> <s:submit value="確認" action="ResearchConfirmPart3" /> </s:form> </body><html>
<s:actionerror>
タグを用いると、自動的にメッセージが<ul>
と<li>
タグでのリスト表示として出力されます。なお、これはたとえ表示テーマがsimple
であっても、そうなります。これを回避するためには、テーマ(テンプレート)を独自に編集する必要があるようです。
addActionError
メソッドは、エラーメッセージの保持に用いるのですが、それとよく似た、addActionMessage
というメソッドも用意されています。このメソッドを用いた場合は、JSPでは<s:actionmessage />
タグでメッセージの参照を行います。Errorという文言がついていないことから分かるように、このメソッドでメッセージを追加した場合は、通常どおりAction
メソッドが実行されますし、エラー扱いにはなりません。なお、JSPでの表示はエラーメッセージと同様のリスト表示となります。