Validateur à plusieurs composants dans JSF 2.0

Validateur de composants multiples dans JSF 2.0

Dans JSF, il n'y a aucun moyen officiel de valider plusieurs composants ou champs. Pour le résoudre, vous devez créer un validateur personnalisé. Dans ce didacticiel, nous vous montrerons deux façons non officielles de créer un validateur pour valider plusieurs composants - mot de passe et confirmation du mot de passe.

Deux façons:
1. RegistrePostValidateEvent, place la validation à l'intérieur.
2. Créez un validateur standard et obtenez d'autres composants viaf:attribute.

Cet exemple est testé sous les technologies suivantes:

  1. JSF 2.1.11

  2. Tomcat 6, 7

  3. Java 1.6

  4. Maven 3

1. Validation dans PostValidateEvent

Lejavax.faces.event.PostValidateEvent est un événement système, qui se déclenche une fois que tous les composants sont validés. L'idée est d'enregistrer unPostValidateEvent et de l'attacher à une méthode de validation. voir suivant:

default.xhtml






Multiple-Components Validator in JSF 2.0

DansPostValidateEvent, la méthode «auditeur» doit avoir cette signaturepublic void method-name(ComponentSystemEvent event) ». Le reste du code devrait être explicite.

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. Validateur et attribut personnalisés

Cette méthode est copiée de cet article -Validator for multiple fields.

Définit le composant «confirmPassword» comme#{confirmPassword}, attachez-le au composant «password» viaf:attribute.



    
    



default.xhtml






  

Multiple-Components Validator in JSF 2.0

Une classe de validateur personnalisée et obtenez le composant de confirmation du mot de passe viacomponent.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

Au-dessus de deux solutions font la même chose, valider deux composants - mot de passe et confirmer le mot de passe.

Aucune entrée,required="true" est déclenché.

jsf2 multiple components validator

Validez plusieurs composants / champs. Assurez-vous que le mot de passe est égal pour confirmer le mot de passe.

jsf2 multiple components validator

Télécharger le code source