Validator für mehrere Komponenten in JSF 2.0

Multiple Components Validator in JSF 2.0

In JSF gibt es keine offizielle Möglichkeit, mehrere Komponenten oder Felder zu validieren. Um das Problem zu lösen, müssen Sie einen benutzerdefinierten Validator erstellen. In diesem Tutorial zeigen wir Ihnen zwei inoffizielle Möglichkeiten, einen Validator zur Validierung mehrerer Komponenten zu erstellen: Passwort und Passwort bestätigen.

Zwei Möglichkeiten:
1. RegisterPostValidateEvent, legt die Validierung in.
2. Erstellen Sie einen Standardvalidator und erhalten Sie andere Komponenten überf:attribute.

Dieses Beispiel wird unter folgenden Technologien getestet:

  1. JSF 2.1.11

  2. Tomcat 6, 7

  3. Java 1.6

  4. Maven 3

1. Validierung in PostValidateEvent

javax.faces.event.PostValidateEvent ist ein Systemereignis, das ausgelöst wird, nachdem alle Komponenten validiert wurden. Die Idee ist, einPostValidateEvent zu registrieren und an eine Validierungsmethode anzuhängen. siehe folgendes:

default.xhtml






Multiple-Components Validator in JSF 2.0

InPostValidateEvent muss die "Listener" -Methode diese Signaturpublic void method-name(ComponentSystemEvent event) "haben. Der Rest des Codes sollte selbsterklärend sein.

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. Benutzerdefinierter Validator & Attribut

Diese Methode wurde aus diesem Artikel kopiert -Validator for multiple fields.

Definiert die Komponente "verifyPassword" als#{confirmPassword} und hängt sie überf:attribute an die Komponente "password" an.



    
    



default.xhtml






  

Multiple-Components Validator in JSF 2.0

Eine benutzerdefinierte Validierungsklasse, und rufen Sie die Bestätigungskennwortkomponente übercomponent.getAttributes ab.

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

Obige zwei Lösungen machen dasselbe, validieren zwei Komponenten - Passwort und Passwort bestätigen.

Keine Eingabe,required="true" wird ausgelöst.

jsf2 multiple components validator

Überprüfen Sie mehrere Komponenten / Felder. Stellen Sie sicher, dass das Passwort gleich ist, um das Passwort zu bestätigen.

jsf2 multiple components validator

Quellcode herunterladen

Laden Sie es herunter -JSF-Validator-Multiple-Components-Example.zip (27 KB)