このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
フィルタアドレスの検証ルールを実際に作っていこう。
検証コードの作成には柔軟性があるので、
簡単にクラスを用意することができるが、
Struts を介して利用するためには従うべきルールがある。
Struts では、エラーを ActionMessages で表現する。
Commons Validator には ValidatorResults クラスがあるが、
これは使わず ActionMessages に直接格納することになる。
なので、ActionMessages を引数として受け取る必要がある。
では、ルールの枠組みを作ってみよう。
最初は、常にエラーとなるようなルールとしておき、
ちゃんと呼び出されているかどうかを確認する
まずは、ルールクラスの実装だ。
========== FilterNetworkValidator.java ==========
package jp.loafer.test.validators;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
public class FilterNetworkValidator {
public FilterNetworkValidator() {
}
public boolean execute(Object bean, Field field,
ActionMessages messages) {
String property = field.getProperty();
// プロパティ値を取得
String value =
ValidatorUtils.getValueAsString(bean,
property);
// 値を検証
if (value == null || value.length() == 0 || validate(value))
return true;
// エラーメッセージの用意
ActionMessage msg =
new ActionMessage("値が正しくありません", false);
// プロパティを指定してメッセージを追加
messages.add(field.getKey(), msg);
// 失敗
return false;
}
private boolean validate(String value) {
// TODO: 値を検証
// 失敗
return false;
}
}
========== end of FilterNetworkValidator.java ==========
クラス名・メソッド名とも自由裁量なので、
FilterNetworkValidator#execute とする。
初期化するようなものはないのだが、
動作することを確認するため、インスタンスメソッドにした。
execute の引数は、現時点での必要最小限とした。
bean は検証対象の ActionForm (ValidatorForm)、
field は、<field> 要素の設定情報、
そして、messages がエラーメッセージを格納するクラス。
最初に、bean のプロパティを取得しなければならない。
プロパティ名は <field> 要素の property 属性なので、
field.getProperty() で取得できるが文字列である。
通常は、こういう用途に Commons BeanUtils を使うのだが、
Commons Validator には、値を文字列をして取得ための、
便利なユーティリティメソッドが用意されている。
ValidatorUtils#getValueAsString を呼び出すことで、
インスタンスのプロパティを文字列化したものが得られる。
後は、required ルールとの組み合わせを考え、
空文字列の場合は OK とし、true を返す。
それ以外の場合、ルールによる検証の処理が行われるので、
validate というメソッドを用意しておいた。
ここは後で実装するので、今回は無条件に不許可とした。
条件に適合しない場合は、エラーメッセージを用意する。
Struts の場合は、ActionMessage のインスタンスだ。
これを作るためには、<field> 要素の設定を読み取り、
色々と処理を行う必要があるのだが、
とりあえずは、「値が正しくありません」にしておいた。