Entering Passive Mode

カテゴリ 'Java' の記事
< 1 2 3 4 5... >

Java とオーバーフロー

今日はネタをひとつ。以下のプログラムを実行すると、
標準出力には何が出力されるだろうか。

public class Test {
  static public void main(String[] args) {
    System.out.println((long)(80000 * 90000));
  }
}

これを即答できた人は、今日の日記に用はない。

独自ルール #4: ルールの XML 定義

エラーメッセージ

続いて、作ったルールを 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>

独自ルール #3: ルールクラスの枠組み

フィルタアドレスの検証ルールを実際に作っていこう。

検証コードの作成には柔軟性があるので、
簡単にクラスを用意することができるが、
Struts を介して利用するためには従うべきルールがある。

Struts では、エラーを ActionMessages で表現する。
Commons Validator には ValidatorResults クラスがあるが、
これは使わず ActionMessages に直接格納することになる。
なので、ActionMessages を引数として受け取る必要がある。

独自ルール #2: 引数の扱い

Commons Validator は、引数の扱いに特徴がある。

Commons Validator はインタフェースの実装等を強制せず、
引数や戻り値を、メソッド側が自由に決めることができる。
そのため、既存の検証コードを簡単に利用しやすい。

でも、検証を実行するクラスは呼び出される側なので、
その引数を用意するのは呼び出す側である。
では、どのように引数が与えられるのだろうか。

自分のコードで Commons Validator を使う場合、
検証コードを呼び出す方法を制御できるのだが、
Struts では ValidatorForm が検証メソッドを呼び出すので、
独自ルールの実装者は、引数を自由に制御できない。

独自ルール #1: validator 要素

検証ルールは <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"/>

Validator のルール

ポートの次は、アドレスの書式の制限と言いたいところだが、
これを正規表現でやるのはさすがにしんどい。

(?:\*|(?:(?: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))?)

完全に、バグの元だな、こりゃ。
こんなもん設定ファイルに書いたところで、
多分、後で保守するやつが発狂する程度の効果しかない。

ということで、別の手を考えよう。

Validator 設定 #8: constant 要素

値の形式を調べなければならない項目はほかにもある。

今日取り上げるのは、発信ポートと宛先ポートだ。
これは両方同じ形式であり、全てのポートを示す 「*」、
または 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})

Validator 設定 #7: maxlength ルールとリテラル arg

今日は maxlength ルールだ。

このルールは名前の通り、入力文字数を制限することができる。

maxlength ルールの持つパラメータ変数は 2 つある。

1 つは、ルールと同じ名前の maxlength 変数で、
制限する文字数を数値で指定する。
これは必須のパラメータである。

もう 1 つは省略可能な lineEndLength 変数だ。
これは、改行文字を何文字と計算するかを示す。

Validator 設定 #6: 可変長要素へのルール適用

引き続き、集合型の検証ついて考える。

集合型を扱う場合、そこに含まれる要素数だけでなく、
各要素が取る値も検証しなければならない場合がある。

Validator 設定の <field> 要素で指定するプロパティ名は、
集合型の要素を直接指定することが可能である。

例えば、プロトコルの場合プロパティ名は rule.protocols。
このプロパティが示す値は String[] 型なので、
最初の要素は、rule.protocols[0]、
次の要素は rule.protocols[1] で表現することができる。

Validator 設定 #5: 集合型へのルール適用

そういえば、プロトコルを保留していた。
というのも、プロトコルは集合型の型(String[])なのだ。

こういった単純値ではないプロパティの検証の場合、
ルールがどのように機能するかどうかを知る必要がある。

Struts の Validator が用意しているほとんどのルールは、
文字列に対して適用するものなので、
評価する前に強制的に文字列化される。
文字列以外の場合、toString() の値が評価されるのだ。

< 1 2 3 4 5... >
このページのトップへ戻る
© 2008 Project Loafer/Project Fireball and all blog writers. Powered by Nucleus CMS