JSF 2.0の複数コンポーネントバリデーター

JSF 2.0の複数コンポーネントバリデーター

JSFには、複数のコンポーネントまたはフィールドを検証する公式の方法はありません。 それを解決するには、カスタムバリデーターを作成する必要があります。 このチュートリアルでは、複数のコンポーネントを検証するためのバリデーターを作成する2つの非公式な方法、パスワードとパスワードの確認を示します。

2つの方法:
1。 PostValidateEventを登録し、検証を内部に配置します。
2。 標準のバリデーターを作成し、f:attributeを介して他のコンポーネントを取得します。

この例は、次のテクノロジーでテストされています。

  1. JSF 2.1.11

  2. Tomcat 6、7

  3. Java 1.6

  4. メーベン3

1. PostValidateEventでの検証

javax.faces.event.PostValidateEventはシステムイベントであり、すべてのコンポーネントが検証された後に発生します。 アイデアは、PostValidateEventを登録し、検証メソッドにアタッチすることです。 以下を参照してください。

default.xhtml






Multiple-Components Validator in JSF 2.0

PostValidateEventでは、「リスナー」メソッドにこの署名public void method-name(ComponentSystemEvent event)が必要です。 コードの残りの部分は一目瞭然です。

UserBean.java – It has a method to validate password and confirm password components.

package com.example;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

@ManagedBean(name = "user")
@SessionScoped
public class UserBean {

    public String username;
    public String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void validatePassword(ComponentSystemEvent event) {

      FacesContext fc = FacesContext.getCurrentInstance();

      UIComponent components = event.getComponent();

      // get password
      UIInput uiInputPassword = (UIInput) components.findComponent("password");
      String password = uiInputPassword.getLocalValue() == null ? ""
        : uiInputPassword.getLocalValue().toString();
      String passwordId = uiInputPassword.getClientId();

      // get confirm password
      UIInput uiInputConfirmPassword = (UIInput) components.findComponent("confirmPassword");
      String confirmPassword = uiInputConfirmPassword.getLocalValue() == null ? ""
        : uiInputConfirmPassword.getLocalValue().toString();

      // Let required="true" do its job.
      if (password.isEmpty() || confirmPassword.isEmpty()) {
        return;
      }

      if (!password.equals(confirmPassword)) {

        FacesMessage msg = new FacesMessage("Password must match confirm password");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        fc.addMessage(passwordId, msg);
        fc.renderResponse();

      }

    }
}

2. カスタム検証と属性

このメソッドは、この記事からコピーされています–Validator for multiple fields

「confirmPassword」コンポーネントを#{confirmPassword}として定義し、f:attributeを介して「password」コンポーネントに接続します。



    
    



default.xhtml






  

Multiple-Components Validator in JSF 2.0

カスタムバリデータークラス、およびcomponent.getAttributesを介してパスワード確認コンポーネントを取得します。

PasswordValidator.java – JSF Custom validator

package com.example;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator("passwordValidator")
public class PasswordValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {

      String password = value.toString();

      UIInput uiInputConfirmPassword = (UIInput) component.getAttributes()
        .get("confirmPassword");
      String confirmPassword = uiInputConfirmPassword.getSubmittedValue()
        .toString();

      // Let required="true" do its job.
      if (password == null || password.isEmpty() || confirmPassword == null
        || confirmPassword.isEmpty()) {
            return;
      }

      if (!password.equals(confirmPassword)) {
        uiInputConfirmPassword.setValid(false);
        throw new ValidatorException(new FacesMessage(
            "Password must match confirm password."));
      }

    }
}

3. Demo

上記の2つのソリューションは同じことを行い、2つのコンポーネント(パスワードと確認パスワード)を検証します。

入力なし、required="true"が発生します。

jsf2 multiple components validator

複数のコンポーネント/フィールドを検証します。 パスワードが確認パスワードと等しいことを確認してください。

jsf2 multiple components validator

ソースコードをダウンロード

ダウンロード–JSF-Validator-Multiple-Components-Example.zip(27 KB)