Commons-Validatorは汎用的なエラーチェック処理のライブラリです。
StrutsのVlidatorは内部でこれを使っているのでStruts経験者はどんな物か
分かると思います。
各種エラーチェック処理とエラーチェック処理対象、エラーメッセージを
xmlで指定できます。
これによってエラーチェック処理が一元化でき、作成修正が簡単になります。
「使い方」
以下の場所からダウンロードしてJarをビルドパスに加えましょう。
http://commons.apache.org/proper/commons-validator/download_validator.cgi
左のメニューのDependenciesというメニューを押すと依存しているアプリケーション
が表示されます。
今回落としたCommons-Validator 1.4では
commons-beanutils 1.8.3
commons-digester 1.8
commons-logging 1.1.1
が必要なのでそれらもビルドパスに。
が必要なのでそれらもビルドパスに。
「ソース例」
[validator-name-required.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1.dtd">
<global>
<validator name="required"
classname="NameValidator"
method="validateRequired"
methodParams="java.lang.Object, org.apache.commons.validator.Field"
msg="required.field"/>
</global>
<formset>
<form name="userInfo">
<field property="name" depends="required">
<arg0 key="userInfo.username.displayname"/>
</field>
</form>
</formset>
</form-validation>
エラーチェック関連をまとめたxmlです。
globalタグのvalidatorがエラーチェックを行う要素です。
classname:クラス名
name:論理名
method:メソッド名
methodParams:メソッドの引数型
msg:エラー時に出力するメッセージ
エラーチェックを行うものがもっと必要ならば、その分validatorタグを
用意します。
下のformsetタグがエラーチェックの対象です。
formタグname:対象をひとめとめにした論理名
fieldタグproperty:チェック対象となるクラスのプロパティ(メンバ)
depends:使用したいvalidatorの論理名(複数可)
「NameValidator.java」
public class NameValidator {
public static boolean validateRequired(Object bean, Field field)
{
String value =
ValidatorUtils.getValueAsString(bean, field.getProperty());
boolean isNotBlankOrNull = !GenericValidator.isBlankOrNull(value);
boolean isValidLength = GenericValidator.minLength(value, 4)
&& GenericValidator.maxLength(value, 16);
return isNotBlankOrNull && isValidLength;
}
}
en → ja
( 17
エラーチェックを実際に行うValidatorです。
POJO(特定クラスを継承しなくてよい)です。
ここでは空白、Nullでなく4文字以上16文字以下のものを正常(True)としてます。
先ほどのvalidator-name-required.xmlに登録する必要があります。
エラーチェック&結果表示
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle(" applicationresource");
ResourceBundle resource = ResourceBundle.getBundle(" applicationresource");
Bean user = new Bean();
user.setName("TTT");
try {
InputStream in = user.getClass().getResourceAsStream("validator-name-required.xml");
ValidatorResources resources = new ValidatorResources(in);
Validator validator = new Validator(resources, "userInfo");
validator.setParameter(Validator.BEAN_PARAM, user);
ValidatorResults results = validator.validate();
// 検証結果を表示
Set<?> propertyNames = results.getPropertyNames();
for (Object propertyName: propertyNames) {
ValidatorResult result = results.getValidatorResult((String)propertyName);
Iterator<?> actions = result.getActions();
while (actions.hasNext()) {
String actionName = (String) actions.next();
if (!result.isValid(actionName)) {
ValidatorAction action = resources.getValidatorAction(actionName);
System.out.println("ERROR: " + resource.getString(action.getMsg()
}
}
}
}
} catch (SAXException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ValidatorException ex) {
ex.printStackTrace();
};
}
説明すると
ValidatorResourcesでvalidatorの設定ファイルを読込み、validatorクラスを作成し
コンストラクタやsetParameterでvalidateの設定後、validete(エラーチェック)。
結果はValidatorResultで帰ってくる。
getPropertyNamesで各プロパティを取得する(filedタグのproperty)。
次にプロパティが行ったチェック(depands)の結果をgetActionsで取得し
isValideでエラーだったか見てエラーだった場合getMsgでメッセージ(msg)を取得。
メッセージはプロパティファイル(applicationresource)から検索して取ってくる。
という流れ
StrutsのValidatorに近い感じにしてみました。
「applicationResource.properties」
required.field=4文字以上16文字以下で入力して下さい
設定ファイルはこのようにキー=値という形式で入力します。
「実行結果」