PGBox
P
G
Box

バリデータ(入力チェック)【基本】

機能リファレンスのメニューへ戻る



使用した環境
JDK 6 Update 11
struts 1.3.10

バリデータ機能を使用した入力チェックのサンプルです。


strutsに用意されているValidator機能を使用するには、まずValidatorPlugInを有効にする必要があります。
struts-config.xmlの最後の方に記述があります。
<!-- =================================================== Validator plugin -->
<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>
この<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>

(1) 入力エラー発生時にテキストフィールドの背景色を赤色にするためのスタイル定義です。
(2) 入力エラー発生時にメッセージを出力するタグです。詳しくはhtml:errorsタグを参照してください。


対応するフォームは以下のようになります。
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ライブラリを使用して実装されています。

ルール名入力チェックの概要エラーメッセージの
デフォルト
指定可能な変数
required必須チェックを行う。プロパティの値がnullもしくは空文字の場合にエラーになる。errors.required
requiredif条件付の必須チェックを行う。非推奨となっており、validWhenを使用する事が推奨されている。errors.requiredバリデータ(入力チェック)【複合チェック】を参照してください。
validwhen式を使用して入力チェックを行う。「この場合はこういったチェック」といった入力チェックが可能。errors.requiredバリデータ(入力チェック)【複合チェック】を参照してください。
minlength最低文字数のチェックを行う。minlengthで指定した文字数より少ない文字数の場合にエラーとなる。errors.minlength【minlength】入力可能な最低文字数を指定する。
【lineEndLength】改行を何文字としてカウントするかを指定。※1
maxlength最大文字数のチェックを行う。maxlengthで指定した文字数より多い文字数の場合にエラーとなる。errors.maxlength【maxlength】入力可能な最大文字数を指定する。
【lineEndLength】改行を何文字としてカウントするかを指定。※1
mask正規表現を使用したチェックを行う。maskで指定した正規表現にマッチしない場合にエラーとなる。errors.invalid【mask】正規表現を指定する。※2
bytebyte型に変換可能であるかのチェックを行う。※3errors.byte
shortshort型に変換可能であるかのチェックを行う。※3errors.short
integerinteger型に変換可能であるかのチェックを行う。※3errors.integer
longlong型に変換可能であるかのチェックを行う。※3errors.long
floatfloat型に変換可能であるかのチェックを行う。※3errors.float
doubledouble型に変換可能であるかのチェックを行う。※3errors.double
byteLocale国際対応の場合に、ロケールに準じてbyte型に変換可能であるかのチェックを行う。※3errors.byte
shortLocale国際対応の場合に、ロケールに準じてshort型に変換可能であるかのチェックを行う。※3errors.short
integerLocale国際対応の場合に、ロケールに準じてinteger型に変換可能であるかのチェックを行う。※3errors.integer
longLocale国際対応の場合に、ロケールに準じてlong型に変換可能であるかのチェックを行う。※3errors.long
floatLocale国際対応の場合に、ロケールに準じてfloat型に変換可能であるかのチェックを行う。※3errors.float
doubleLocale国際対応の場合に、ロケールに準じてdouble型に変換可能であるかのチェックを行う。※3errors.double
datedatePatternもしくはdatePatternStrictで指定した日付フォーマットであるかのチェックを行う。整合性もチェックされるので、うるう年などでも正しくチェックされる。errors.date【datePattern】許容する日付のフォーマットを指定する。SimpleDateFormatのコンストラクタで指定可能なフォーマット文字列を指定する。
【datePatternStrict】厳密な日付チェックを行う場合は、datePatternではなくこちらの変数を使用する。datePattern同様にフォーマット文字列を指定する。日付フォーマットチェックの後に、フォーマット文字列と入力文字列の文字列の長さが一致しているかのチェックが追加で行われる。
intRange数値の範囲チェックを行う。min以上max以下のint型であるかのチェックを行う。また、範囲チェックが行われる前にintegerルールが自動で呼び出され、変換可能であるかのチェックが行われるerrors.range【min】チェック範囲のFrom
【max】チェック範囲のTo
longRange数値の範囲チェックを行う。min以上max以下のlong型であるかのチェックを行う。また、範囲チェックが行われる前にlongルールが自動で呼び出され、変換可能であるかのチェックが行われるerrors.range【min】チェック範囲のFrom
【max】チェック範囲のTo
floatRange数値の範囲チェックを行う。min以上max以下のfloat型であるかのチェックを行う。また、範囲チェックが行われる前にfloatルールが自動で呼び出され、変換可能であるかのチェックが行われるerrors.range【min】チェック範囲のFrom
【max】チェック範囲のTo
doubleRange数値の範囲チェックを行う。min以上max以下のdouble型であるかのチェックを行う。また、範囲チェックが行われる前にdoubleルールが自動で呼び出され、変換可能であるかのチェックが行われるerrors.range【min】チェック範囲のFrom
【max】チェック範囲のTo
creditCardクレジットカード形式であるかのチェックを行う。認証などは考慮せず、カード番号フォーマットのチェックのみを行う。commons-validator-1.3.1ではVisa・Amex・Mastercard・Discoverのチェックが実装されている。errors.creditcard
emailEメール形式として正しいかのチェックを行う。W3Cの規約に沿ったチェックを行う。※4errors.email
urlURL形式として正しいかのチェックを行う。※4errors.url【allowallschemes】http://やmailto://やftp://などの全てのスキームを許容する場合にtrue。デフォルトはfalse。(デフォルトではschemesで指定されたスキームのみが許容される)
【allow2slashes】http://以降のURL中にスラッシュが2つ以上続く(//)箇所が存在する場合に許容する場合にtrue。デフォルトはfalse。
【nofragments】URLフラグメント(#)を許容しない場合にtrue。デフォルトはfalse(許容する)。
【schemes】許容するスキームをカンマ(,)区切りで指定する。デフォルトはhttp,https,ftp。

※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 property="inputA" depends="required">
        <msg name="required" key="xxx" />
        <arg key="field.inputA" />
    </field>

</form>
<field>内に<msg>タグを記述し、<msg name="ルール名" key="メッセージのキー" />
とする事で、入力チェックごとに個別にエラーメッセージを設定する事が可能です。


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(エラーメッセージのキー, エラーメッセージの引数文字列));
といった形でエラーメッセージを追加します。





機能リファレンスのメニューへ戻る