struts1.1のバリデーションは融通が…

struts1.1のバリデーションを使ったことがなかった

 struts1.1には、validation.xmlにチェック処理を記述すると、サーバサイドによるチェックとJavaScriptによるチェックを行って行ってくれる機能があります。
 便利そうな機能なのに、なぜか実務で使用する機会に遭遇しないので使ってみました。

 

使ってみた印象

 JavaScriptによるチェックは使えるシチュエーションが限られるような……。

使い方

1.validation.xmlを記載する。

2.JSPJavaScriptを埋め込む旨を書き込む。下記のような感じ。

    <head>
        <html:javascript formName="/JsA/JsA0020New" method="validateAction" />
        <html:base/>
    </head>

3.submit時にチェックメソッドが呼ばれるようにする。

使い勝手の悪い点

デフォルトのチェック順序が日常で遭遇しない感じのパターンである

 下記はStrutsに生成させたチェック用JavaScriptの例です。

     var bCancel = false; 

    function validateAction(form) {                                                                   
        if (bCancel) 
      return true; 
        else 
       return validateMaxLength(form) && validateRequired(form) && validateMask(form); 
   }
    function maxlength () { 
     this.aa = new Array("txtTitleName", "null can not be greater than null characters.", new Function ("varName", "this.maxlength='60';  return this[varName];"));
     this.ab = new Array("txtPlayerName", "null can not be greater than null characters.", new Function ("varName", "this.maxlength='60';  return this[varName];"));
     this.ac = new Array("txtPrice", "null can not be greater than null characters.", new Function ("varName", "this.maxlength='8'; this.mask=/^[0-9]+$/;  return this[varName];"));
     this.ad = new Array("textAreaExplanation", "null can not be greater than null characters.", new Function ("varName", "this.maxlength='400';  return this[varName];"));
    } 

    function required () { 
     this.aa = new Array("txtTitleName", "null is required.", new Function ("varName", "this.maxlength='60';  return this[varName];"));
     this.ab = new Array("txtPlayerName", "null is required.", new Function ("varName", "this.maxlength='60';  return this[varName];"));
     this.ac = new Array("txtPrice", "null is required.", new Function ("varName", "this.maxlength='8'; this.mask=/^[0-9]+$/;  return this[varName];"));
    } 

    function mask () { 
     this.aa = new Array("txtPrice", "定価は半角数値で入力してください。", new Function ("varName", "this.maxlength='8'; this.mask=/^[0-9]+$/;  return this[varName];"));
    }
(後略)

 今回の例では下記のような感じで処理をするのですが、このチェック順は私が決めたのではありません。  surutsが決めてます。
 validation.xmlには順番を記載するところがない。ううーむ。

  1. 下記の項目について文字列最大長チェックをする。順はJavaScript実装次第(?)
    1. txtTitleName
    2. txtPlayerName
    3. txtPrice
    4. textAreaExplanation
  2. 文字列最大長チェックでエラーがあればまとめて表示する。
  3. 下記の項目について必須チェックをする。順はJavaScript実装次第(?)
    1. txtTitleName
    2. txtPlayerName
    3. txtPrice
  4. 必須チェックでエラーがあればまとめて表示する。
  5. 下記の項目について正規表現による書式チェックをする。
    1. txtPrice
  6. 書式チェックでエラーがあればまとめて表示する。

 必須チェックを最初に行わない仕事には、今のところ遭遇したこと無いです。
 なので、私にとっては「ううーん。使いにくい…」という印象に。

エラーメッセージのまとまり方が分かりにくい

 下記は文字列最大長チェックのメソッドです。

function validateMaxLength(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMaxLength = new maxlength();
                for (x in oMaxLength) {
                    var field = form[oMaxLength[x][0]];
                    
                    if (field.type == 'text' ||
                        field.type == 'textarea') {
                        
                        var iMax = parseInt(oMaxLength[x][2]("maxlength"));
                        if (field.value.length > iMax) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMaxLength[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }

 対象項目のチェック結果をfields変数にためておいて、最後に結合して表示しています。
 一見問題ないようですが、エラーメッセージをまとめて出すケースって以下単位でまとめることが経験上多いです。

  1. 必須チェックのエラー
  2. 文字列長、書式、値の大小チェックetcのエラー
  3. 項目間の相関(日付項目同士で大小チェックをするとか)

 というわけで、単位がちょっと細かすぎる気がします。
 今回のケースですと「文字列長のエラーを訂正して登録ボタンを押したと思ったら、今度は数字のエラーが出たよ!」みたいな事態に。

 とはいえ、この辺は画面の入力項目によって事情が変わりそうですが。

まとめ

 というわけでして、私にとってはかゆい所に手が届かないなぁという機能でした。
 ただ、「基本的にはJavaScriptでチェックするのだけど、念のためサーバでもチェックする」という方針のアプリですと、サーバ側でのチェックの順序やエラーメッセージについて細かい要件は往々にしてないので使えそうです。