PGBox
P
G
Box

バリデータ(入力チェック)【複合チェック】

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



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

ルール「validWhen」と「requiredif」のサンプルです。複数プロパティを対象とした複合的な入力チェックが可能です。



validWhenとrequiredifルールを使用する事により、複合的な入力チェックを行う事が可能となります。
例えば、「あるチェックボックスがチェック状態の場合のみ必須項目となるテキスト」などのチェックにおいて使用できます。

validWhenとrequiredifは実現できる事に大きな違いはありませんが、struts1.2以降はrequiredifは非推奨となっており
validWhenを使用する事が推奨されています。

requiredifルール

指定した条件に応じて必須チェックを行う事のできるルールです。

requiredifルールで指定可能な変数は以下のようになります。
変数名意味
field[N]条件の対象となるプロパティ名を指定する。
fieldTest[N]条件を指定する。
【NULL】field[N]で指定したプロパティの値がnullもしくは空文字の場合に必須チェックを行う。
【NOTNULL】field[N]で指定したプロパティの値がnull及び空文字でない場合に必須チェックを行う。
【EQUAL】field[N]で指定したプロパティの値がfieldValue[N]で指定した値と同一の場合に必須チェックを行う。
fieldValue[N]fieldTest[N]でEQUALを指定した場合に、比較値を指定する。
fieldIndexed[N]リストに対する入力チェックの場合にtrueを指定する。デフォルトはfalse。
fieldJoin条件を複数指定する場合に結合方法を指定する。AND/ORで指定する。デフォルトはAND。

[N]の部分には、実際にはfield[0]やfield[2]といったように、インデックス番号を指定する形になります。
また、requiredifルールのエラーメッセージのデフォルトは「errors.required」です。


以下は、「チェックボックスがチェック状態の場合のみテキストに対して必須チェック」を行うサンプルになります。
JSP
<html:form action="/sample">
    
    <html:checkbox property="checkboxValue" />
    <html:text property="textValue" />
    
    <html:submit />
    
</html:form>
ActionForm
public class SampleForm extends ValidatorForm {
    
    /** チェックボックスの値 */
    private boolean checkboxValue;
    
    /** テキストフィールドの値 */
    private String textValue;
    
    ※ 以下setter, getter
}
validation.xml
<form name="SampleForm">
    
    <!-- テキストフィールドの入力チェック -->
    <field property="textValue" depends="requiredif">
        
        <arg key="xxx" />
        
        <var>
            <var-name>field[0]</var-name>        <!-- (1) -->
            <var-value>checkboxValue</var-value>
        </var>
        <var>
            <var-name>fieldTest[0]</var-name>    <!-- (2) -->
            <var-value>EQUAL</var-value>
        </var>
        <var>
            <var-name>fieldValue[0]</var-name>   <!-- (3) -->
            <var-value>true</var-value>
        </var>
    </field>

</form>
(1) 複合チェックの条件対象としてチェックボックスのプロパティ名を指定します。
(2)-(3) チェックボックスがチェック状態の場合は、boolean値がtrueとなるので、trueと同一である場合を必須チェックの条件としています。



「テキストAが空の場合はテキストBは必須になる」といった条件を指定する場合には、validation.xmlで以下のように記述します。
<field property="textB" depends="requiredif">
    <var>
        <var-name>field[0]</var-name>
        <var-value>textA</var-value>
    </var>
    <var>
        <var-name>fieldTest[0]</var-name>
        <var-value>NULL</var-value>
    </var>
</field>


また、複数の条件を指定する場合
例えば「テキストAもしくはテキストBが空である場合は、テキストCは必須になる」
といった条件の場合はvalidation.xmlで以下のように記述します。
<field property="textC" depends="requiredif">
    <var>
        <var-name>fieldJoin</var-name>
        <var-value>OR</var-value>
    </var>
    <var>
        <var-name>field[0]</var-name>
        <var-value>textA</var-value>
    </var>
    <var>
        <var-name>fieldTest[0]</var-name>
        <var-value>NULL</var-value>
    </var>
    <var>
        <var-name>field[1]</var-name>
        <var-value>textB</var-value>
    </var>
    <var>
        <var-name>fieldTest[1]</var-name>
        <var-value>NULL</var-value>
    </var>
</field>



validWhenルール

条件式を使用して複合チェックを行う事が可能です。
条件式はANTLRというパーサジェネレータによって解釈されます。

validWhenルールで指定可能な変数は以下のようになります。
変数名意味
test条件式を指定する。この式が成立しない場合に入力エラーとなる。

validWhenルールのエラーメッセージのデフォルトは「errors.required」です。


以下は、「チェックボックスがチェック状態の場合のみテキストに対して必須チェック」を行うサンプルになります。
JSP
<html:form action="/sample">
    
    <html:checkbox property="checkboxValue" />
    <html:text property="textValue" />
    
    <html:submit />
    
</html:form>
ActionForm
public class SampleForm extends ValidatorForm {
    
    /** チェックボックスの値 */
    private boolean checkboxValue;
    
    /** テキストフィールドの値 */
    private String textValue;
    
    ※ 以下setter, getter
}
validation.xml
<form name="SampleForm">
    
    <!-- テキストフィールドの入力チェック -->
    <field property="textValue" depends="validwhen">
        
        <arg key="xxx" />
        
        <var>
            <var-name>test</var-name>
            <var-value>((checkboxValue == 'false') or (*this* != null))</var-value>
        </var>
    </field>

</form>

testで指定した式が成立しない場合に入力エラーとなります。

このサンプルの場合
((checkboxValue == 'false') or (*this* != null))
といった式なので
((チェックボックスがオフ) or (テキストが空ではない))
と解釈されます。*this*はテスト対象のプロパティの値を示します。
つまり、
チェックボックスがオンの場合はテキストは空であってはならない
と解釈する事が可能です。


validwhenのtest式の要点をまとめると、以下のようになります。

● 式は必ず括弧で囲む必要がある。

● ==  !=  <  <=  >  >= といった演算子が使用できる。

● プロパティがStringである場合でも、数値として評価可能な場合は数値比較も可能。例えば(aaa > 20)は、プロパティaaaがStringであっても数値として評価されるので、19以下の値の場合はエラーとする事ができる。ただし、小数点付きの数値は数値として評価されない。

● 入力チェック対象のプロパティ自身は*this*で指定可能。

● キーワードnullは、空文字も含まれる。例えば(*this* != null)はaaaがnullもしくは空文字であった場合にエラーとなる。

● 文字列はシングルクォーテーション(')もしくはダブルクォーテーション(")で表現する。例えば(*this* == 'xxx')といったように指定する。

● true/falseはキーワードではないので文字列で指定する。例えばプロパティaaaがtrueであるかどうかを式で表現すると(aaa == 'true')となる。

● 式の結合は ((式1) and (式2)) もしくは ((式1) or (式2)) といったようにandとorが使用できる。

● 配列の特定要素を指定する場合は (aaa[1] == 'xxx') といったようにインデックス指定が可能である。

● 式の結合は2つの式までのみ行える。((式1) and (式2)) では問題ないが、 ((式1) and (式2) and (式3)) といったように結合が2度以上行われる式は使用できない。


幾つかのサンプルを以下に示します。


textAが未入力の場合はtextBは必須とする
<field property="textB" depends="validwhen">
    
    <var>
        <var-name>test</var-name>
        <var-value>((textA != null) or (*this* != null))</var-value>
    </var>

</field>

textAが入力されている場合はtextBを必須とする。
<field property="textB" depends="validwhen">
    
    <var>
        <var-name>test</var-name>
        <var-value>((textA == null) or (*this* != null))</var-value>
    </var>

</field>

optionで選択された値が"3"の場合はtextAは必須とする
<field property="textA" depends="validwhen">
    
    <var>
        <var-name>test</var-name>
        <var-value>((option != '3') or (*this* != null))</var-value>
    </var>

</field>


textAの入力値が10以上20以下でないとエラー
<field property="textA" depends="validwhen">
    
    <var>
        <var-name>test</var-name>
        <var-value><![CDATA[ ((*this* >= 10) and (*this* <= 20)) ]]></var-value>
    </var>

</field>
※ 比較演算子(>や<)を使用する場合は、CDATAセクションを使用して文字データとして明確に認識させる必要があります。







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