Cubby では以下のように、アクションメソッドに対して入力検証のルールを定義します。
入力検証でエラーを検出した場合は、アクションのプロパティerrorsにメッセージが設定され、errorPageで指定されたページに遷移します。
また、Cubbyにクライアントサイドバリデーションはありません。
// 検証ルールのプロパティとしてデフォルトの「VALIDATION」が使用されます。 // 検証エラー発生時は「confirm.jsp」に遷移します。 @Form @Validation(errorPage = "confirm.jsp") public ActionResult save1() { ... } // 検証ルールのプロパティとして「validation2」が使用されます。 // 検証エラー発生時は「confirm.jsp」に遷移します。 @Validation(rulesField="validation2", errorPage = "confirm.jsp") public ActionResult save2() { ... }
バリデーションの定義はJavaコードで記述します。以下のようにDefaultValidationRulesを継承して、 initializeメソッド内で addメソッドで フィールドごとにバリデーションのルールを追加します。
バリデーションの一覧はorg.seasar.cubby.validator.validatorsを参照してください。
public class LoginAction extends Action { public static ValidationRules VALIDATION = new DefaultValidationRules() { @Override public void initialize() { add("userId", new RequiredValidator(), new MaxLengthValidator(10)); add("password", new RequiredValidator(), new MaxLengthValidator(10)); } }; ... }
Cubbyで定義済みのバリデーションクラスは以下のものがあります。 詳細は定義済みバリデーションのAPIドキュメントをご覧下さい。
定義済みバリデーションクラス一覧
クラス名 | 説明 |
ArrayValidator | 配列のパラメータに対して入力検証を行います。 |
DateFormatValidator | 日付に対する検証を行います。 |
EmailValidator | Eメールアドレスに対する検証を行います。 |
EqualsValidator | 指定した文字列と等しいかどうかを検証します。 |
FileRegexpValidator | ファイルアップロードのファイル名が指定された正規表現にマッチするか検証します。 |
MaxLengthValidator | 最大文字数を検証します。 |
MaxSizeValidator | 配列の最大サイズを検証します。 |
MinSizeValidator | 配列の最小サイズを検証します。 |
NumberValidator | 数値かどうかを検証します。 |
RangeLengthValidator | 文字列の長さの範囲を指定して検証します。 |
RangeValidator | 数値の範囲を指定して検証します。 |
RegexpValidator | 指定された正規表現にマッチするか検証します。 |
RequiredValidator | 必須検証します。 |
バリデーションのエラーメッセージは以下のルールで作成されます。
public class LoginAction extends Action { // 項目のメッセージキーを指定 public static ValidationRules VALIDATION = new DefaultValidationRules() { @Override public void initialize() { // メッセージキー"userId"の値がエラーメッセージ中の項目名として使用されます。 add("userId", new RequiredValidator(), new MaxLengthValidator(10)); // メッセージキー"login.password"の値がエラーメッセージ中の項目名として使用されます。 add("password", "login.password", new RequiredValidator(), new MaxLengthValidator(10)); } }; // 項目名のメッセージキーのプリフィックスを指定 public static ValidationRules VALIDATION2 = new DefaultValidationRules("login.") { @Override public void initialize() { // メッセージキー"login.userId"の値がエラーメッセージ中の項目名として使用されます。 add("userId", new RequiredValidator(), new MaxLengthValidator(10)); } }; // 各バリデーションにメッセージキーを指定 public static ValidationRules VALIDATION3 = new DefaultValidationRules() { @Override public void initialize() { // メッセージキー"err.myrequired"がエラーメッセージとして使用されます。 add("password", new RequiredValidator("err.myrequired")); } }; ... }
ほとんどが同じでいくつかの項目が異なる複数のルールを作りたい場合、以下のように他のルールをコピーして使用することができます。
public class LoginAction extends Action { // ベースのルール public static ValidationRules BASE_VALIDATION = new DefaultValidationRules() { @Override public void initialize() { add("userId", new RequiredValidator(), new MaxLengthValidator(10)); add("password", "login.password", new RequiredValidator(), new MaxLengthValidator(10)); } }; // ベースのルールに「nickname」の検証を追加 public static ValidationRules VALIDATION1 = new DefaultValidationRules() { @Override public void initialize() { // BASE_VALIDATIONのルールをコピーして追加 getRules().addAll(BASE_VALIDATION.getRules()); add("nickname", new RequiredValidator(), new MaxLengthValidator(10)); } }; // ベースのルールに「password2」の検証を追加 public static ValidationRules VALIDATION2 = new DefaultValidationRules() { @Override public void initialize() { // BASE_VALIDATIONのルールをコピーして追加 getRules().addAll(BASE_VALIDATION.getRules()); add("password2", new RequiredValidator(), new MaxLengthValidator(10)); } }; ... }
独自のバリデーションはValidatorを実装して作成します。 通常はBaseValidatorを継承して作成します。
public class MaxLengthValidator extends BaseValidator { private final int max; public MaxLengthValidator(final int max) { this(max, "valid.maxLength"); } public MaxLengthValidator(final int max, final String messageKey) { this.max = max; this.setMessageKey(messageKey); } // 検証メソッド、戻り値はエラーメッセージ。戻り値がnullなら検証エラーなし。 public String validate(final ValidationContext ctx) { final Object value = ctx.getValue(); if (value instanceof String) { String str = (String) value; if (StringUtil.isEmpty((String) value)) { return null; } if (str.length() <= max) { return null; } } else if (value == null) { return null; } return getMessage(getPropertyMessage(ctx.getName()), max); } }