[JSF]バリデーションクラス

Java

JavaのWebアプリケーションフレームワークであるJSFを仕事で使う機会があったので、
備忘録を残そうと思います。

         使用環境

  • NetBeans8.2
  • JavaEE7.0
  • GlassFish4.1.1
スポンサーリンク

JSFのバリデーションクラス

前回の続きでJSFでのバリデータの紹介になります。
今回はバリデーション用のクラスの作成を行い、バリデーションを定義したメソッドを自作します。

【バリデーションクラス】

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator(value = "testValidator")
public class TestValidator implements Validator{
    
    public TestValidator(){
        
    }
    
    @Override
    public void validate(FacesContext context, UIComponent component, Object value){
        //半角英数字チェック
        Pattern p = Pattern.compile("^[a-zA-Z0-9]+$");
        Matcher m = p.matcher((String)value);
        if(!m.matches()){
            throw new ValidatorException(new FacesMessage("半角英数字で入力してください"));
        }
        
        //半角英数字8桁以上チェック
        p = Pattern.compile("^[a-zA-Z0-9]{8,}+$");
        m = p.matcher((String)value);
        if(!m.matches()){
            throw new ValidatorException(new FacesMessage("半角英数字8桁以上の入力が必要です"));
        }
        
        //半角英数字8桁以上 大文字小文字数字1種類以上使用
        p = Pattern.compile("^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\\d)[a-zA-Z\\d]{8,}+$");
        m = p.matcher((String)value);
        if(!m.matches()){
            throw new ValidatorException(new FacesMessage("アルファベット大文字小文字と数字が最低1桁ずつ必要です(合計8桁以上)"));
        }
    }
}

【view】

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>validation sample</title>
    </h:head>
    <h:body>
        <h:form>
            テキストボックス:
            <h:inputText id="inputText" value="#{managedBean.txtInput}" validator="testValidator" />
            <h:message for="inputText" style="color: #FF0000"/>
            <div><h:commandButton value="バリデータテスト" /></div>
        </h:form>
    </h:body>
</html>

【ManagedBean】(前回と変わりませんが一応)

import javax.inject.Named;
import javax.enterprise.context.Dependent;

@Named(value = "managedBean")
@Dependent
public class ManagedBean {
    private String txtInput;

    public String getTxtInput() {
        return txtInput;
    }

    public void setTxtInput(String txtInput) {
        this.txtInput = txtInput;
    }
}

【実行例】
JSF5-1
JSF5-2
JSF5-3

必要な作業は主に3つです。

  • バリデーションクラスを作成し、FacesValidatorのvalue属性で名前を設定
  • Validatorインターフェースを実装し、validateメソッドをオーバーライド。(バリデータ定義を行う)
  • viewにて作成したバリデータを適用したいコンポーネントのvalidator属性に、バリデーションクラスに設定した名前を指定
  • 以上の工程でそれぞれのコンポーネントに自由にバリデータの設定ができます。

    スポンサーリンク

    Bean Validationの利用

    ここまでに紹介したバリデータの設定方法以外にもJavaにはBeanValidationという
    一般的によく知られた方法があります。
    こちらはJSFに限らずどのプロジェクトでも使用可能な方法なので、個人的に一番おすすめです。

    【view】

    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://xmlns.jcp.org/jsf/html">
        <h:head>
            <title>validationbeansample</title>
        </h:head>
        <h:body>
            <h:form>
                <h:messages/>
                <h:inputText value="#{managedBean.input}"  />
                <h:commandButton value="テスト" actionListener="#{managedBean.test()}" />
            </h:form>
        </h:body>
    </html>
    

    【BeanValidation】

    package perfect.javaee.mavenproject2;
    
    import javax.inject.Named;
    import javax.enterprise.context.Dependent;
    import javax.validation.constraints.Size;
    
    @Named(value = "managedBean")
    @Dependent
    public class ManagedBean {
    
        @Size(max = 5)
        private String input;
    
        public String getInput() {
            return input;
        }
    
        public void setInput(String input) {
            this.input = input;
        }
        
        public void test(){
            System.out.print("入力値OK");
        }  
    }
    

    【実行例】
    JSF5-1

    BeanValidationの変数inputの宣言の際、@Size制約を付与しています。
    こちらは標準で定義された制約条件で、他にも以下のようなものが存在します。

    • @Null:nullであることを検証
    • @NotNull:nullでないことを検証
    • @AssertFalse:値がFalseであることを検証
    • @AssertTrue:値がTrueであることを検証
    • @Size:Stringは文字数を検証。Collectionなどは要素数を検証
    • @Min:指定の最小値以上であることを検証
    • @Max:指定の最大値以下であることを検証
    • @DecimalMin:最小値を設定。@Minと違い境界値を含まないように設定可能
    • @DecimalMax:最大値を設定。@Maxと違い境界値を含まないように設定可能
    • @Digits:数値の整数部の桁数、小数部の桁数を検証
    • @Past:日時が過去であるか検証
    • @Future:日付が未来であることを検証
    • @Pattern:正規表現を指定

    これらの制約条件を設定すると、そのパラメータに対し値を設定する際に自動で検証が行われます。
    もし満たせてない場合はリクエストが中断され、上記サンプルで本来実行されるべき
    actionListener=”#{managedBean.test()}のtestメソッドの呼び出しは行われず、
    デフォルトで設定されたエラーメッセージを付与したレスポンスが返ります。

    バリデーションについては以上になります。

    コメント

    タイトルとURLをコピーしました