slim3では、Controllerにて入力チェックを行う[Validators]が用意されています。
使い方については、公式サイトを参考にしてください。
ここで、[Validators]にはSAStrutsの検証用アノテーションにあったような
正規表現による入力チェックが実装されていません。
そこで、[Validators]の入力チェックを拡張します。
作成ファイル
1. チェック処理を行うValidatorクラスを作成します。
MaskValidator.java
public class MaskValidator extends AbstractValidator { /** 正規表現パターン */ protected String pattern; /** * コンストラクタ * @param pattern 正規表現パターン */ public MaskValidator(String pattern) { this(pattern, null); } /** * コンストラクタ * @param pattern 正規表現パターン * @param message エラー時表示メッセージ */ public MaskValidator(String pattern, String message) { super(message); this.pattern = pattern; } /** * 入力チェック * @param parameters org.slim3.util.RequestMap.RequestMap(request) * @param name チェック対象名 */ public String validate(Map<String, Object> parameters, String name) { Object value = parameters.get(name); if(value == null || "".equals(value)) return null; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(value.toString()); if(m.find()){ return null; }else{ if(message != null) return message; else return ApplicationMessage.get("validator.invalid", new Object[] { //validator.invalid : application_ja.properties内のKey getLabel(name) }); } } }
2. application_ja.propertiesにデフォルトの表示メッセージを追加します。
application_ja.properties
validator.invalid={0}が不正です。
3. org.slim3.controller.validator.Validatorsクラスを拡張します。
ExValidators.java
public class ExValidators extends Validators { public ExValidators(HttpServletRequest request) { super(request); } @SuppressWarnings("unchecked") public ExValidators(Map parameters) throws NullPointerException, IllegalStateException { super(parameters); } /** * 正規表現バリデータ * @param pattern 正規表現パターン * @return 正規表現バリデータ */ public MaskValidator mask(String pattern) { return new MaskValidator(pattern); } /** * 正規表現バリデータ * @param pattern 正規表現パターン * @param message エラー時表示メッセージ * @return 正規表現バリデータ */ public MaskValidator mask(String pattern, String message) { return new MaskValidator(pattern, message); }
使用方法
[Validators]と同様に使うことができます。
protected boolean validate() { ExValidators v = new ExValidators(request); v.add("hoge", v.mask("^[a-zA-Z0-9]+$")); return v.validate(); } @Override public Navigation run() { /* 入力チェック */ if (!validate()) { return forward("XXX.jsp"); }
まとめ
これが最善策かどうかわかりませんが、当面はこれでいいのかなぁ。なんて思っています。
もっと良い方法があったら、ご一報ください!(・ω・)/