最近の記事
- 9/1 - 将棋始めました
- 5/16 - サーバー引っ越し
- 4/24 - 優先順位
- 3/17 - vbNullString と 空文字列 ""
- 3/15 - InputBox 関数の戻り値
- 3/13 - 紙と Excel と VBA
- 3/9 - 未だに Visual Basic 6
- 11/14 - ぼて閉鎖
- 11/9 - 関数オブジェクトの呼び出し
- 9/7 - メソッドとしての関数オブジェクト
Entering Passive Mode
今日はネタをひとつ。以下のプログラムを実行すると、
標準出力には何が出力されるだろうか。
public class Test {
static public void main(String[] args) {
System.out.println((long)(80000 * 90000));
}
}
これを即答できた人は、今日の日記に用はない。
続いて、作ったルールを Validator 設定に追加する。
別にファイルを用意してもよかったのだが、
とりあえず /WEB-INF/validation.xml に追記しよう。
========== /WEB-INF/validation.xml ==========
(…省略…)
<form-validation>
<global>
<validator name="filterNetwork"
classname="jp.loafer.test.validators.FilterNetworkValidator"
method="execute"
methodParams="
java.lang.Object,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages
"
msg="errors.invalid" />
</global>
フィルタアドレスの検証ルールを実際に作っていこう。
検証コードの作成には柔軟性があるので、
簡単にクラスを用意することができるが、
Struts を介して利用するためには従うべきルールがある。
Struts では、エラーを ActionMessages で表現する。
Commons Validator には ValidatorResults クラスがあるが、
これは使わず ActionMessages に直接格納することになる。
なので、ActionMessages を引数として受け取る必要がある。
Commons Validator は、引数の扱いに特徴がある。
Commons Validator はインタフェースの実装等を強制せず、
引数や戻り値を、メソッド側が自由に決めることができる。
そのため、既存の検証コードを簡単に利用しやすい。
でも、検証を実行するクラスは呼び出される側なので、
その引数を用意するのは呼び出す側である。
では、どのように引数が与えられるのだろうか。
自分のコードで Commons Validator を使う場合、
検証コードを呼び出す方法を制御できるのだが、
Struts では ValidatorForm が検証メソッドを呼び出すので、
独自ルールの実装者は、引数を自由に制御できない。
検証ルールは <validator> 要素で定義されている。
独自のルールを作る場合は、自前で用意しなければならない。
そこで、既存のルールを参考にしながら調べてみよう。
とりあえず、required ルールの設定を眺めてみる。
<validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="errors.required"/>
ポートの次は、アドレスの書式の制限と言いたいところだが、
これを正規表現でやるのはさすがにしんどい。
(?:\*|(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\/(?:3[0-2]|[0-2]?\d))?)
完全に、バグの元だな、こりゃ。
こんなもん設定ファイルに書いたところで、
多分、後で保守するやつが発狂する程度の効果しかない。
ということで、別の手を考えよう。
値の形式を調べなければならない項目はほかにもある。
今日取り上げるのは、発信ポートと宛先ポートだ。
これは両方同じ形式であり、全てのポートを示す 「*」、
または 0 から 65535 までの数値を取る。
少し複雑な条件だが、正規表現を使って無理やり書いてみよう。
正規表現さえ使えれば mask ルールを適用することができる。
(?:\*|6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d{3}|[0-5]?\d{1,4})
今日は maxlength ルールだ。
このルールは名前の通り、入力文字数を制限することができる。
maxlength ルールの持つパラメータ変数は 2 つある。
1 つは、ルールと同じ名前の maxlength 変数で、
制限する文字数を数値で指定する。
これは必須のパラメータである。
もう 1 つは省略可能な lineEndLength 変数だ。
これは、改行文字を何文字と計算するかを示す。
引き続き、集合型の検証ついて考える。
集合型を扱う場合、そこに含まれる要素数だけでなく、
各要素が取る値も検証しなければならない場合がある。
Validator 設定の <field> 要素で指定するプロパティ名は、
集合型の要素を直接指定することが可能である。
例えば、プロトコルの場合プロパティ名は rule.protocols。
このプロパティが示す値は String[] 型なので、
最初の要素は、rule.protocols[0]、
次の要素は rule.protocols[1] で表現することができる。
そういえば、プロトコルを保留していた。
というのも、プロトコルは集合型の型(String[])なのだ。
こういった単純値ではないプロパティの検証の場合、
ルールがどのように機能するかどうかを知る必要がある。
Struts の Validator が用意しているほとんどのルールは、
文字列に対して適用するものなので、
評価する前に強制的に文字列化される。
文字列以外の場合、toString() の値が評価されるのだ。