Struts 15章 Javascriptでの検証/検証ルールの追加
- 15.1. Javascriptでのチェック
- 15.2. 独自の検証ルールの追加
- 15.3. 独自の検証ルールに対するJavascriptの作成
15.3. 独自の検証ルールに対するJavascriptの作成
独自の検証ルールに関しても、1節で説明したようにJavascriptを用いた検証を行うことができます。そのためには検証ルールの設定ファイルに、検証を行うためのJavascriptの関数を定義します。以下は、前節で作成した検証ルールに関する定義です。(Struts1.2では異なるので注意してください。)
... <validator name="validateA" classname="sample.ValidateA" method="validate" methodParams="java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionErrors, javax.servlet.http.HttpServletRequest" msg="errors.invalidate"> <javascript><![CDATA[ function validate(form) { var isValid = true; var focusField = null; var i = 0; var fields = new Array(); // validateA関数から検証の対象となる入力フィールド等、必要な情報を受け取る oValidate = new validateA(); // 検証の対象となる入力フィールドの数だけ繰り返す for (x in oValidate) { var field = form[oValidate[x][0]]; // 入力フィールドがtextかtextareaの場合のみチェック if (field.type == 'text' || field.type == 'textarea') { // 前後の空白を除いた値が「a」であるかチェック if (trim(field.value)!= 'a') { if (i == 0) { focusField = field; } fields[i++] = oValidate[x][1]; // 検証に失敗したことを示すフラグを立てる isValid = false; } } } if (fields.length > 0) { focusField.focus(); alert(fields.join('\n')); } return isValid; }]]> </javascript> </validator> ...
一から関数を作成するのは大変ですので、提供されている検証ルールの中から類似したものをコピーして修正するのが良いです。その上で修正する箇所は以下の通りです。
- 関数名。関数名は<validator>要素のmethod属性に指定されている値と同じでなければなりません。
- 検証ルール名と同じ関数を実行している箇所が必ず1つあります。例えばrequiredルールの場合、
oRequired = new required();
となっています。この実行する関数名を<validator>要素のname名、つまり検証ルール名と同じにしなければなりません。ただし<validator>要素にjsFunctionName属性が指定されている場合には、その名前と同じにします。以下はjsFunctionName属性が指定されている場合の例です。
... <validator name="validateA" ... jsFunctionName="test"> <javascript><![CDATA[ ... oValidateA = new test(); ...
返り値の値を格納する変数名も変更した場合には、以降で該当する変数名も変更しなければなりません。
- forループの中身は検証の本体です。この部分を、作成した検証ルールに沿うものに変えなければなりません。具体的には対象とする入力フィールドをチェックするif文と、フィールドの値をチェックするif文の2つを変更することになると思います。以下は該当する箇所を先ほどの例から抜き取ったものです。
// 入力フィールドがtextかtextareaの場合のみチェック if (field.type == 'text' || field.type == 'textarea') { // 前後の空白を除いた値が「a」であるかチェック if (trim(field.value)!= 'a') {
必要な作業は設定ファイルに検証のためのJavascript関数を作成するだけです。あとは入力ページで<html:javascript>タグと<htm:form>タグのonsubmit属性を定義すれば、Javascriptによるチェックを行うことができます。ただし検証のためのJavascript関数を作成することは極めて難しい作業です。Javascript関数が無くてもサーバでの検証は動作しますので、無理に作成する必要はありません。
(実習課題3)
実習課題2のWebアプリケーションを改良しなさい。
- 作成した検証ルールに対応するJavascript関数を作成し、Javascriptによるチェックに適応させること。