リファレンストップへ Java | バリデータ(入力チェック)【基本】使用した環境 JDK 6 Update 11 struts 1.3.10 バリデータ機能を使用した入力チェックのサンプルです。strutsに用意されているValidator機能を使用するには、まずValidatorPlugInを有効にする必要があります。 struts-config.xmlの最後の方に記述があります。 <!-- =================================================== Validator plugin --> この<plug-in>がコメントアウトされている場合は、コメントを解除してください。<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml"/> </plug-in> 基本的な使用バリデータの機能的な機能を使用して入力チェックの行えるフォームを作成してみます。 完成イメージは以下のようになります。 この画面を構成しているJSPは以下のようになります。 sample.jsp <%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <style type="text/css"> .error { background-color:#ffaaaa; <%-- (1) --%> } </style> <html:errors /> <%-- (2) --%> <html:form action="/sample"> 入力A:<html:text property="inputA" errorStyleClass="error" />(必須)<br /> <br /> 入力B:<html:text property="inputB" errorStyleClass="error" />(最低文字数:3文字以上でないとエラー)<br /> <br /> 入力C:<html:text property="inputC" errorStyleClass="error" />(最高文字数:5文字以下でないとエラー)<br /> <br /> 入力D:<html:text property="inputD" errorStyleClass="error" />(正規表現:郵便番号形式)<br /> <br /> 入力E:<html:text property="inputE" errorStyleClass="error" />(数値:Integerに変換可能でないとエラー)<br /> <br /> 入力F:<html:text property="inputF" errorStyleClass="error" />(日付:yyyy/M/d形式でないとエラー)<br /> <br /> 入力G:<html:text property="inputG" errorStyleClass="error" />(数値範囲:10~20の数値でないとエラー)<br /> <br /> 入力H:<html:text property="inputH" errorStyleClass="error" />(Eメール)<br /> <br /> 入力I:<html:text property="inputI" errorStyleClass="error" />(URL)<br /> <br /> <html:submit /> </html:form> 対応するフォームは以下のようになります。 SampleForm.java public class SampleForm extends ValidatorForm { // (1) private String inputA; private String inputB; private String inputC; private String inputD; private String inputE; private String inputF; private String inputG; private String inputH; private String inputI; ※ 以下setter, getter } (1) 通常のFormではなく、org.apache.struts.validator.ValidatorFormを継承します。 アクションでは、バリデータを使用する際に特別な記述は必要ありませんので省略します。 struts-configは以下のようになります。 struts-config.xml <form-beans> <form-bean name="SampleForm" type="pgbox.form.SampleForm" /> </form-beans> (中略) <action-mappings> <action path="/sample" name="SampleForm" type="pgbox.action.SampleAction" validate="true" <!-- (1) --> input="/sample.jsp"> <!-- (2) --> <forward name="success" path="/sample.jsp" /> </action> </action-mappings> (1) validate="true"とする事で、このアクションに対するリクエストは入力チェックが行われるようになります。 (2) 入力チェックエラー時の遷移先を指定します。 バリデータを使用する際は、/WEB-INF/validation.xml に入力チェックの方法を定義する必要があります。ファイルが存在しない場合は新たに作成してください。 ファイルの内容が長いので以下は抜粋になります。実際にサンプル作成に使用したxmlファイルはこちらになります。 validation.xml(抜粋) <form name="SampleForm"> <!-- (1) --> <!-- 入力A(必須) --> <field property="inputA" depends="required"> <!-- (2) --> <arg key="field.inputA" /> <!-- (3) --> </field> <!-- 入力B(3文字以上でないとエラー) --> <field property="inputB" depends="minlength"> <arg key="field.inputB" /> <arg key="${var:minlength}" resource="fasle" /> <!-- (4) --> <var> <!-- (5) --> <var-name>minlength</var-name> <var-value>3</var-value> </var> </field> (中略) </form> (1) <form>タグでは、入力チェックの情報を定義するフォーム名を指定します。struts-configに定義されているフォーム名と同一のものを指定します。 (2) <field>タグでは、property属性に入力チェック対象のプロパティ名、dependsにルール(入力チェックの種類)を指定します。 指定可能なルールは、下記の「バリデータルールの一覧」を参照してください。 (3) 入力チェックエラー時のエラーメッセージの埋め込みパラメータのメッセージを指定します。MessageResources.propertiesで定義されているメッセージキーを指定します。MessageResources.propertiesからではなく、メッセージを直接記述したい場合は <arg key="入力A" resource="false" />といったように、resource="false"を指定するとkey="xxx"の文字列がそのまま使用されます。 エラーメッセージ自体のキーは、ルール(入力チェックの種類)ごとにデフォルト値が定義されています。エラーメッセージのキーのデフォルト値は、下記の「バリデータルールの一覧」を参照してください。 (4) メッセージの埋め込みパラメータに"${var:xxx}"と記述すると、<var></var>タグ内で指定した変数の値を使用する事ができます。 この例の場合、(5)で指定された変数「minlength」の値「3」がセットされる事になります。 (5) ルール(入力チェックの種類)に応じたパラメータ変数を指定します。ルール「minlength」の変数「minlength」は、入力可能な最低文字数を指定します。 指定可能な変数は、下記の「バリデータルールの一覧」を参照してください。 このサンプルで使用しているMessageResources.propertiesは以下のようになります。 入力チェックのルールごとにエラーメッセージを定義しておく必要があります。 MessageResources.properties errors.header=<div style="color:red;"> errors.prefix=・ errors.suffix=<br /> errors.footer=</div> errors.required={0}は必須です。 errors.minlength={0}は{1}文字以上で入力してください。 errors.maxlength={0}は{1}文字以下で入力してください。 errors.invalid={0}の形式が不正です。 errors.integer={0}は数値形式で入力してください。 errors.date={0}はxxxx/xx/xx形式の正しい日付で入力してください。 errors.range={0}は{1}から{2}の範囲で入力してください。 errors.email={0}は正しいEメール形式で入力してください。 errors.url={0}は正しいURL形式で入力してください。 field.inputA=入力A field.inputB=入力B field.inputC=入力C field.inputD=入力D field.inputE=入力E field.inputF=入力F field.inputG=入力G field.inputH=入力H field.inputI=入力I バリデータルールの一覧デフォルトで使用可能なバリデータルール(入力チェックの種類)は以下のようになります。ルール名を<field depends="xxx">に指定する事で使用可能となります。strutsでは実際のチェックロジック自体はcommons-validatorライブラリを使用して実装されています。
※1 minlengthとmaxlengthのlineEndLengthは主に<html:textarea>を使用する場合に関連します。 lineEndLengthを指定しない場合、クライアント側がwindows環境であれば、改行を含むリクエストパラメータの場合、1つの改行あたり「¥r¥n」で2文字カウントされます。 つまり ---------- あいう えお ---------- といった文字列がtextareaに入力された場合の文字数は7です。 これを6文字として扱いたい場合はlineEndLengthで1を指定します。また、0を指定した場合は改行は文字数にカウントされなくなりますので、5文字として扱われます。 ※2 maskで使用可能な正規表現は、String#matchesやjava.util.Patternで指定するjavaの正規表現ではなく、Perl5の正規表現になります。 ¥p{InHiragana}や¥p{InKatakana}は使用できませんので注意が必要です。 ※3 strutsのバリデータ機能の数値系チェックの実装は try { new Integer(xxx); } catch (NumberFormatException e) { return 入力エラー; } といったように、ラッパクラスに変換可能であるかどうかでチェックを行っています。これはつまり「123」といったような全角の数値文字でも許容してしまう事になります。 厳密に半角数値のみを許容する入力チェックを作成するにはmaskルールを使用して正規表現で入力チェックを行う必要があります。 チェック正規表現については正規表現サンプル集を参考にしてください。 ※4 EメールやURLの形式はW3Cでの規約こそありますが、実際には対象のサーバの設定や実装によって左右されます。 strutsのバリデータ機能を使用して厳密にチェックを行ってしまうと、実際は使用できるEメールアドレスやURLなのに入力チェックでエラーになってしまう。といった事態になってしまう可能性がありますので注意してください。 入力チェックルールは、自分で独自に作成して追加する事も可能です。 その際のサンプルはバリデータ(入力チェック)【独自ルールの作成】を参照してください。 デフォルト以外のエラーメッセージを使用する場合ルールごとにデフォルトで決められたエラーメッセージのキーを変更する場合は以下のように指定します。 validation.xml <form name="SampleForm"> <field>内に<msg>タグを記述し、<msg name="ルール名" key="メッセージのキー" /><field property="inputA" depends="required"> <msg name="required" key="xxx" /> <arg key="field.inputA" /> </field> </form> とする事で、入力チェックごとに個別にエラーメッセージを設定する事が可能です。 javaコードで入力チェック処理を実装する場合バリデータ機能だけでは対応が難しいチェックの場合、フォームのvalidateメソッドをオーバーライドする事で、javaコードで独自の処理を記述する事ができます。public class SampleForm extends ValidatorForm { 入力エラーの場合はprivate String inputA; private String inputB; @Override public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // strutsのバリデート処理を呼び出す ActionErrors errors = super.validate(mapping, request); // 独自の処理を実装。 // 例として、inputAの値とinputBの値が同一かをチェックする。 if (inputA != null && inputB != null) { if (!inputA.equals(inputB)) { // 入力エラーの場合はエラーメッセージを追加する。 errors.add("inputA", new ActionMessage("errors.xxx", "入力A")); } } // エラー情報を返す return errors; } ※ 以下setter, getter } errors.add(プロパティ名, new ActionMessage(エラーメッセージのキー, エラーメッセージの引数文字列)); といった形でエラーメッセージを追加します。 |
|