struts1.1のバリデーションは融通が…
struts1.1のバリデーションを使ったことがなかった
struts1.1には、validation.xmlにチェック処理を記述すると、サーバサイドによるチェックとJavaScriptによるチェックを行って行ってくれる機能があります。
便利そうな機能なのに、なぜか実務で使用する機会に遭遇しないので使ってみました。
使ってみた印象
JavaScriptによるチェックは使えるシチュエーションが限られるような……。
使い方
1.validation.xmlを記載する。
2.JSPにJavaScriptを埋め込む旨を書き込む。下記のような感じ。
<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には順番を記載するところがない。ううーむ。
- 下記の項目について文字列最大長チェックをする。順はJavaScript実装次第(?)
- txtTitleName
- txtPlayerName
- txtPrice
- textAreaExplanation
- 文字列最大長チェックでエラーがあればまとめて表示する。
- 下記の項目について必須チェックをする。順はJavaScript実装次第(?)
- txtTitleName
- txtPlayerName
- txtPrice
- 必須チェックでエラーがあればまとめて表示する。
- 下記の項目について正規表現による書式チェックをする。
- txtPrice
- 書式チェックでエラーがあればまとめて表示する。
必須チェックを最初に行わない仕事には、今のところ遭遇したこと無いです。
なので、私にとっては「ううーん。使いにくい…」という印象に。
エラーメッセージのまとまり方が分かりにくい
下記は文字列最大長チェックのメソッドです。
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変数にためておいて、最後に結合して表示しています。
一見問題ないようですが、エラーメッセージをまとめて出すケースって以下単位でまとめることが経験上多いです。
- 必須チェックのエラー
- 文字列長、書式、値の大小チェックetcのエラー
- 項目間の相関(日付項目同士で大小チェックをするとか)
というわけで、単位がちょっと細かすぎる気がします。
今回のケースですと「文字列長のエラーを訂正して登録ボタンを押したと思ったら、今度は数字のエラーが出たよ!」みたいな事態に。
とはいえ、この辺は画面の入力項目によって事情が変わりそうですが。
まとめ
というわけでして、私にとってはかゆい所に手が届かないなぁという機能でした。
ただ、「基本的にはJavaScriptでチェックするのだけど、念のためサーバでもチェックする」という方針のアプリですと、サーバ側でのチェックの順序やエラーメッセージについて細かい要件は往々にしてないので使えそうです。