#topicpath
----
ユーザ入力値は必ずValidateする必要がありますが、Actionクラスに入力チェック処理などを書くと、ビジネスロジックと入力チェック処理が混在し、あまりキレイとはいえません。また入力した内容はActionFormが責任を持つべきだという思想(?)からか、ActionFormにはvalidateする統一的なI/Fを持っています。ちなみにこの方法はStruts1.0までのもので、1.1以降はValidatorプラグインが主流となるようです。
ユーザ入力値は必ずValidateする必要がありますが、Actionクラスに入力チェック処理などを書くと、ビジネスロジックと入力チェック処理が混在し、あまりキレイとはいえません。また入力した内容はActionFormが責任を持つべきだという思想(?)からか、ActionFormにはvalidateする統一的なI/Fを持っています。ちなみにこの方法はStruts1.0までのもので、1.1以降は[[Validatorプラグイン>Java/Struts/Struts Validator]]が主流となるようです。

***validateの使用方法
あらかじめ、struts-config.xmlで
 <action
    path="/user_regist"
    input="/regist.jsp" <-エラー発生時の遷移先。これはフォームのみで有効?
    type="kino.action.UserRegistAction"
    name="userRegistForm"
    scope="request"
    attribute="userRegistForm">
のようにエラー遷移先(/regist.jsp)を定義しておきます。~
次にvalidate処理の記述です。ActionFormにはvalidateメソッドが定義されているのでこのメソッドをオーバーライドします。下の例ではユーザ入力値が空だったり、パラメータがリクエストにのってこなかったりしたときに、エラーを表示しています。
#contents

***ロジックの実装
まずはActionFormにチェックロジックを実装します。ActionFormにはvalidateメソッドが定義されているのでこのメソッドをオーバーライドします。下の例ではユーザ入力値が空だったり、パラメータがリクエストにのってこなかったりしたときに、エラーを表示しています。
 public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){
   ActionErrors errors = new ActionErrors();
   
   //ユーザIDが空だったら
   if(userId==null || userId.length()==0){
     ユーザIDのテキストボックスでエラーが発生した、エラー文言は「ユーザID」
     errors.add("userId",new ActionError("errors.required","ユーザID"));
   //入力が空だったら
   if (input == null || input.equals("")) {
     テキストボックスでエラーが発生した、エラー文言は「キーワードを入力してください」
     errors.add("input",new ActionError("errors.required", "キーワードを入力してください"));
   }
   return errors;
 }
さらにJSP側では、エラー文言を表示したい箇所に
 <html:errors property="userId"/>
と記述しておきます。~
加えて、ApplicationResources.propertiesに下記内容を追加(ファイルは/WEB-INF/classesにある)

 errors.add("input",new ActionError("errors.required", "キーワードを入力してください"));
の意味は
 errors.add([エラーのID(?)],new ActionError([ApplicationResources.propertiesのキー], [置換文字列]));
という意味です。エラーのIDってのは後述の <html:errors>タグのproperty属性に対応し、置換文字列ってのは後述の{0}に対応します。((置換したい文字列がない場合は errors.add("input",new ActionError("errors.required") );でよい))


***エラー遷移先や、Validateすることの宣言
struts-config.xmlで
 <action 
   name="searchForm" scope="request"
   path="/javaDocSearch" type="kino.actions.JavaDocSearchAction" 
   validate="true" input="kino.tiles.javaDocumentSearch">
   <forward name="success" path="kino.tiles.javaDocumentSearch" />
 </action>
のようにエラー時の遷移先(kino.tiles.javaDocumentSearch)((tilesもかけるみたいですね))を定義しておきます。

***JSP側の記述
さらに遷移先のJSPでは、エラー文言を表示したい箇所に
 <html:errors property="input"/>
と記述しておきます。これで、上のvalidate処理でエラーがあった場合、property属性の値(inputのこと)のIDのエラーをerrorsインスタンスより探し、画面表示処理を行います。表示する内容は次のApplicationResources.propertiesで定義します。

***ApplicationResources.propertiesへの追加
加えて、ApplicationResources.propertiesに下記内容を追加します。
 errors.header=<hr><font color="red"><h3>ERROR</h3>
 errors.footer=<hr></font>
 errors.required={0} Required    ← {0}にerrors.addでセットした文言が入る。
と記述しておきます。~
さてerrors.add("userId",new ActionError("errors.required","ユーザID"));の意味は~
userIdが、<html:errors property="userId"/>に対応し、"errors.required"がプロパティファイルのキーに対応し"ユーザID"が、{0}に対応しています。
 errors.required={0}
と記述しておきます。そうすると表示時に{0}にerrors.addでセットした文言が入り画面上に
 <hr><font color="red"><h3>ERROR</h3>
 キーワードを入力してください
 <hr></font>
と表示されます。以上で、完了です。

まとめると、errors.add("userId",new ActionError("errors.required","ユーザID"));
で、「errors.required={0} Required」の{0}を「ユーザID」という文字列で置換して
 ユーザID Required
という文字列が生成されます。その文字列が、、<html:errors property="userId"/>と書いた箇所に表示されます。

なんか、ややこしいですね。

***まとめ
もう一度対応を考えると
errors.add("input",new ActionError("errors.required","キーワードを入力してください"));の意味は
-inputが、<html:errors property="input"/>に対応し、
-"errors.required"がプロパティファイルのキーに対応し
-"キーワードを入力してください"が、{0}に置換されます

であり、プロパティファイルより取得した文字列が<html:errors property="input"/>と書いた箇所に表示されます。

やってみるとわりかしすっきりするんですが、やっぱ道は長いですね。

----
この記事は
#vote(おもしろかった[1],そうでもない[0])

#comment

#navi(Java/Struts)

SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS