目次へ

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によるチェックに適応させること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp