slim3で正規表現による入力チェックを行う。

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");
        }

まとめ

これが最善策かどうかわかりませんが、当面はこれでいいのかなぁ。なんて思っています。
もっと良い方法があったら、ご一報ください!(・ω・)/