ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

F.2.1 入力項目に入力されたデータが適切かどうかチェックしたい

ブラウザ上でフォームの送信直前にチェックする方法と、サーバ側でチェックする方法とがあります。

ブラウザ上でチェックする(フィールドタグ)

フィールドタグ、クライアントスクリプトタグを使用すると、入力された文字種や値の範囲をチェックできます。チェックはフォームが送信されるときに行なわれ、チェックでエラーになった場合は警告を表示し送信を中止するといった処理が可能です。

フィールドタグでチェックを行なう場合は、タグのアトリビュートでチェック内容を指定します。フォームはuji:formタグで作成します。以下は、入力値の上限と下限を指定する例です。

<uji:form name="order" method="post" ... >
    ...
    数量: <uji:fieldLong bean="body" property="longData"
                   minimumValue="0" maximumValue="100" 
infoText="数量は0以上100以下で入力してください。" /> ... </uji:form>

入力値が0未満の場合、100を超える場合は、送信ボタンを押した時に以下のようなダイアログボックスが表示され、送信は中止されます。

フィールドタグで可能なチェック内容は以下の表のとおりです。対応しているチェック内容はタグにより異なります。個々のタグについては“UJIタグリファレンス”を参照してください。

チェック内容

指定するアトリビュート

字数

文字数が指定した字数以下である

maxLength, maxByteLength

有効文字種

指定した文字種(英字、英数字、日本語文字など)のみ入力されている

enableCharType

有効文字

正規表現で指定した形式に合っている

enableChars

最大値, 最小値

数値が指定した範囲内である

maximumValue, minimumValue

必須入力

入力値が空でない

indispensableField

全桁入力

指定字数が入力されている

fullField

整数部、小数部の最大桁数

実数の整数部、小数部の桁数が指定の桁数以下である

maxIntegerDigit, maxDecimalDigit

チェック内容をタグのアトリビュートではなく、項目クラスで指定することもできます。項目クラスで指定すると、チェック内容をビジネスクラスで指定することが可能になります。項目クラスについては、“16.4.2 フィールドタグの利用”を参照してください。

ブラウザ上でチェックする(クライアントスクリプトタグ)

クライアントスクリプトタグを使ったチェックでは、チェックでエラーとなった場合の動作をJavaScriptで記述することができます。また、チェックをするタイミングを指定できます。入力項目をuji:input, uji:select, uji:textareaタグで作成した場合に、この方法が利用できます。

チェック内容はuji:validateタグまたはuji:actionタグで記述します。

これらのタグは、チェックの対象となるuji:input, uji:select, uji:textareaタグのコンテントに記述します。

また、HTMLのFORMタグの代わりにuji:formタグでフォームを作成する必要があります。

クライアントスクリプトタグを使用する場合の注意事項や、 uji:validate, uji:actionの詳細は、“UJIタグリファレンス”、“16.3 クライアントスクリプト”を参照してください。

サーバ側でチェックする

サーバ側でチェックする場合は、ビジネスクラスのメソッドで、受け取ったデータBeanをチェックします。チェックの内容はJavaでプログラムすることもできますが、ApcoordinatorのXMLデータ仕様記述を使用してチェックすることもできます。 XMLデータ仕様記述を使うと、チェックの内容をXMLで定義できます。そのため、チェック内容が変更された場合でも、プログラムを変更と再コンパイルが不要であり保守性の向上が期待できます。

ポイント

チェックの実行速度を重視する場合には、チェック内容を記述したXMLから、そのチェックを実行するJavaソースを生成することもできます。Javaソースの生成にはXMLデータ仕様記述コンパイラ を使用します。

データのチェックを行うには、以下のようにアプリケーションを作成します。

チェックの基本的な記述方法を以下の例で説明します。チェックはXMLデータ仕様記述ファイルにXMLで記述します。XMLデータ仕様記述については“第11章 XMLデータ仕様記述”を参照してください。ここでは基本的な使い方を説明します。

<?xml version="1.0" encoding="Shift_JIS"?>
<eSpec
    xmlns=http://interstage.fujitsu.com/schemas/uji/eSpec
    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
    xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec
                        http://interstage.fujitsu.com/schemas/uji/espec.xsd">
  <!-- checkValue という名前の仕様を定義 -->
  <specification name="checkValue">
    <!-- check1, check2 セクションをこの順で実行する-->
    <control>
      <validate section="check1"/>
      <validate section="check2"/>
    </control>

    <!-- check1セクションの処理 (0~100のデータをチェックする)-->
    <section name="check1">
      <!-- プロパティ"value" が 0以上のとき-->
      <block property="value" function="int" op="GE" operand="0">
        <!-- かつプロパティ"value" が 100以下のとき 指定メッセージの例外を投げる-->
        <term property="value" op="LE" operand="100" exception="#valueは0~100の間です"/>
      </block>
    </section>
    <!-- check2セクションの処理 -->
    <section name="check2">
      ....
    </section>
  </specification>

  <!-- 別の仕様を定義 -->
  <specification name="nextSpec">
     ....
  </specification>
</eSpec>

XMLデータ仕様記述ファイルには、specificationタグで仕様を定義します。1つの仕様は、複数のチェック内容をまとめたものです。ビジネスクラスからは、どの仕様を使うのかを指定してチェックを実行します。1つの仕様の中には、セクションを必要なだけsectionタグで記述します。セクションは1つのチェック内容を定義したものです。例えば、「valueプロパティの値が0以上100以下である」「textプロパティの値がnullや空文字列ならばエラー」といったチェック内容をそれぞれセクションとして記述します。

セクションの処理順序はcontrolタグのコンテントに書いたvalidateタグで定義します。validateのsectionアトリビュートでセクションの名前を指定します。validateを記述した順番でセクションが処理されます。

セクションで処理するチェックの内容は、termタグ、verifyタグなどで記述します。これらのタグは、チェック内容を「プロパティ□□に対して、条件○○が成立した場合に××する。」というように「プロパティ(□□)」と、チェックが成立する「条件(○○)」と、条件を満たした場合もしくは満たさなかった場合の「結果(××)」をセットで定義します。termタグでは条件を満たした場合の結果を、verifyタグでは満たさなかった場合の結果を定義します。

以下のtermタグでは、チェック対象のプロパティは「value」(property="value")、条件は「100以下」(op="LE" operand="100")、条件が成立した場合「例外を発生」(exception="...")することを意味します。exceptionに指定した文字列は例外のクラス(ESpecResultException)のgetStatusTextメソッドによって取得できます。

<term property="value" op="LE" operand="100" exception="#valueは0~100の間です"/>

blockタグは、アトリビュートで指定した条件を満たす場合にだけ、blockのコンテントに書いたチェックを処理することを意味します。

XMLデータ仕様記述で使用するタグの詳細は、“定義ファイルリファレンス”を参照してください。

チェックの実行方法を以下の例で説明します。

import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.xscript.ESpecValidator;
import com.fujitsu.uji.xscript.ESpecResultException;
import com.fujitsu.uji.xscript.ESpecException;

public void processOrder(DispatchContext context, OrderBean bean) {
    ....
    ESpecValidator validator = 
        ESpecValidator.getInstance(this.getClass().getClassLoader());       // (1)
    validator.setInfLoader(context.getApplicationProfile().getInfLoader()); // (2)

    validator.setXml("checkPrice.xml");                                     // (3)
    try {
        validator.validate("checkValue", bean);                             // (4)
    }
    catch (ESpecResultException e) {
        System.out.println(e.getStatusText());    // exception= で指定した文字列を出力
    }
    catch (ESpecException e) {
        System.out.println(e.toString());         // ランタイムエラーの出力
    }
    ....
}

(1) チェック定義エンジン(com.fujitsu.uji.xscript.ESpecValidator)を生成します。

(2) チェック定義エンジンにInfLoader (com.fujitsu.uji.util.InfLoader) をセットします。InfLoaderは設定ファイルフォルダからファイルを読み込むためのクラスです。設定ファイルフォルダは、コマンドマップ、リモートマップなどApcoordinatorの定義ファイルを置くフォルダです。例えば、Webアプリケーションの場合はWEB-INFフォルダです。InfLoaderはアプリケーションクラス (com.fujitsu.uji.ApplicationProfile) のgetInfLoaderメソッドで取得できます。アプリケーションクラスはcom.fujitsu.uji.DispatchContextクラスのgetApplicationProfileメソッドで取得できます。

(3) 使用するXMLデータ仕様記述ファイルを指定します。ファイル名は、設定ファイルフォルダからの相対パスで指定します。

(4) (3)で生成したエンジンにデータBeanと仕様の名前(specificationタグで指定したもの)を指定してチェックを実行します。チェック内容に従って例外の発生が指示された場合には、ESpecResultExceptionが発生します。

関連項目