ブラウザ上でフォームの送信直前にチェックする方法と、サーバー側でチェックする方法とがあります。
ブラウザ上でチェックする(フィールドタグ)
フィールドタグ、クライアントスクリプトタグを使用すると、入力された文字種や値の範囲をチェックできます。チェックはフォームが送信されるときに行なわれ、チェックでエラーになった場合は警告を表示し送信を中止するといった処理が可能です。
フィールドタグでチェックを行なう場合は、タグのアトリビュートでチェック内容を指定します。フォームは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 |
チェック内容をタグのアトリビュートではなく、項目クラスで指定することもできます。項目クラスで指定すると、チェック内容をビジネスクラスで指定することが可能になります。項目クラスについては、“14.4.2 フィールドタグの利用”を参照してください。
ブラウザ上でチェックする(クライアントスクリプトタグ)
クライアントスクリプトタグを使ったチェックでは、チェックでエラーとなった場合の動作をJavaScriptで記述することができます。また、チェックをするタイミングを指定できます。入力項目をuji:input, uji:select, uji:textareaタグで作成した場合に、この方法が利用できます。
チェック内容はuji:validateタグまたはuji:actionタグで記述します。
uji:validateタグは最大値、最小値のチェックなど、あらかじめ準備された数種のチェックをしたい場合に使用します。コンテントには、チェックでエラーとなった場合に実行するJavaScriptを記述します。
uji:actionタグはチェック内容をJavaScriptで自由に記述できます。JavaScriptはコンテントに記述します。
これらのタグは、チェックの対象となるuji:input, uji:select, uji:textareaタグのコンテントに記述します。
また、HTMLのFORMタグの代わりにuji:formタグでフォームを作成する必要があります。
入力項目がフォーカスを失ったときに入力値をチェックして、エラーならステータスバーにメッセージを表示する例
<uji:form name="someform" method="post" ... > 入力項目: <uji:input name="someinput"> <uji:validate event="blur" type="int" minInclusive="10" maxInclusive="20" >
window.status="入力項目には10~20の整数を指定せよ";
target.focus();
</uji:validate> </uji:input> .... </uji:form>
uji:validateのeventアトリビュートには、チェックの契機となるイベントを指定します。type="int"は入力が数値であることを、minInclusive, maxInclusiveの指定は入力が10以上20以下であることをチェックします。チェックがエラーとなった場合はuji:validateのコンテントに書かれたJavaScriptが実行されます。このJavaScriptの中では、入力項目であるINPUTタグのオブジェクトをtargetという変数名で参照できます。
フォーム送信前に入力値をチェックして、特定の値の場合はステータスバーにメッセージを表示する例
<uji:form name="someform" method="post" ... > 入力項目: <uji:input name="someinput"> <uji:action event="..submit">
if(target.value == 15) {
window.status="この場合15は指定できない";
target.focus();
return false;
}
</uji:action> </uji:input> .... </uji:form>
uji:actionのeventアトリビュートには、チェックの契機となるイベントを指定します。"..submit"はフォームの送信を意味します。このイベントの発生時にuji:actionのコンテントに記述したJavaScriptが実行されます。このJavaScriptの中では、入力項目であるINPUTタグのオブジェクトをtargetという変数名で参照できます。JavaScriptがfalseを返して終了すると、フォームの送信を中止します。trueの場合は続行します。
クライアントスクリプトタグを使用する場合の注意事項や、 uji:validate, uji:actionの詳細は、“UJIタグリファレンス”、“14.3 クライアントスクリプト”を参照してください。
サーバー側でチェックする
サーバー側でチェックする場合は、ビジネスクラスのメソッドで、受け取ったデータBeanをチェックします。チェックの内容はJavaでプログラムすることもできますが、ApcoordinatorのXMLデータ仕様記述を使用してチェックすることもできます。 XMLデータ仕様記述を使うと、チェックの内容をXMLで定義できます。そのため、チェック内容が変更された場合でも、プログラムを変更と再コンパイルが不要であり保守性の向上が期待できます。
ポイント
チェックの実行速度を重視する場合には、チェック内容を記述したXMLから、そのチェックを実行するJavaソースを生成することもできます。Javaソースの生成にはXMLデータ仕様記述コンパイラ を使用します。
データのチェックを行うには、以下のようにアプリケーションを作成します。
チェックの内容をXMLで定義します。
ビジネスクラスのメソッドで、そのXMLファイルとチェック対象のデータBeanを指定してチェックの実行を指示します。
チェックの基本的な記述方法を以下の例で説明します。チェックはXMLデータ仕様記述ファイルにXMLで記述します。XMLデータ仕様記述については“第9章 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が発生します。
関連項目
APIリファレンスのESpecValidatorクラス
APIリファレンスのESpecResultExceptionクラス
UJIタグリファレンス
定義ファイルリファレンス