2011-09-20 25 views
15

Estoy tratando de validar dos campos de contraseña con JSF pero no sirve hasta ahora, lo busco en google pero todo fue sobre JSF 1.2 y bastante confuso, estoy usando JSF 2.0.¿Cómo validar dos campos de contraseña por ajax?

Esto es lo que estoy haciendo hasta ahora:

 <h:outputLabel for="password" value="Password:" /> 
     <h:inputSecret id="password" value="#{register.user.password}" > 
      <f:ajax event="blur" listener="#{register.validatePassword}" render="m_password" /> 
     </h:inputSecret> 
     <rich:message id="m_password" for="password"/> 

     <h:outputLabel for="password_2" value="Password (again):" /> 
     <h:inputSecret id="password_2" value="#{register.user.password_2}" > 
      <f:ajax event="blur"  listener="#{register.validatePassword}" /> 
     </h:inputSecret> 

Así es como yo, es mi controlador:

public void validatePassword() { 
    FacesMessage message; 

    if (!user.getPassword().equals(user.getPassword_2())){ 
     message = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "different password"); 
    }else{ 
     message = new FacesMessage(FacesMessage.SEVERITY_INFO, null, "ok"); 
    } 

    FacesContext.getCurrentInstance().addMessage("form:password", message); 
} 

alguna idea de los chicos?

+0

¿Qué quieres decir con que funciona, pero no tanto? ¿Es lento? No estoy seguro de entender lo que quiere cambiar y por qué. – jdias

+0

Hola @jdias, quiero decir que no funciona de la forma que debería ser. Gracias por eso podría ser un poco confuso. –

Respuesta

19

En primer lugar, utilice realValidator para validar la entrada. No lo hagas en un método de evento de acción.

En cuanto a su problema concreto, sólo tiene que especificar los ambos campos en el atributo execute del <f:ajax>, TI a saber por defecto es sólo el componente actual. Si conecta un validador a la primera entrada y envía el valor de la segunda entrada como <f:attribute>, podrá agarrarlo en el validador. Puede usar el atributo binding para vincular el componente a la vista. De esta forma, puede pasar su valor enviado junto al UIInput#getSubmittedValue().

Aquí está un ejemplo patada de salida:

<h:outputLabel for="password" value="Password:" /> 
<h:inputSecret id="password" value="#{bean.password}" required="true"> 
    <f:validator validatorId="confirmPasswordValidator" /> 
    <f:attribute name="confirm" value="#{confirmPassword.submittedValue}" /> 
    <f:ajax event="blur" execute="password confirm" render="m_password" /> 
</h:inputSecret> 
<h:message id="m_password" for="password" /> 

<h:outputLabel for="confirm" value="Password (again):" /> 
<h:inputSecret id="confirm" binding="#{confirmPassword}" required="true"> 
    <f:ajax event="blur" execute="password confirm" render="m_password m_confirm" /> 
</h:inputSecret> 
<h:message id="m_confirm" for="confirm" /> 

(tenga en cuenta que añadí required="true" a ambos componentes, y también en cuenta que no necesariamente tienen que unir el valor del componente de confirmación de contraseña a una propiedad de bean administrado, que es sin valor por allí de todos modos)

con este validador

@FacesValidator("confirmPasswordValidator") 
public class ConfirmPasswordValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     String password = (String) value; 
     String confirm = (String) component.getAttributes().get("confirm"); 

     if (password == null || confirm == null) { 
      return; // Just ignore and let required="true" do its job. 
     } 

     if (!password.equals(confirm)) { 
      throw new ValidatorException(new FacesMessage("Passwords are not equal.")); 
     } 
    } 

} 
+0

¿Qué es confirmPassword in binding = "# {confirmPassword}"? –

+1

@Jsword: enlazará el componente a la vista exactamente con el identificador proporcionado, de modo que esté disponible por '# {confirmPassword}' en cualquier parte de la vista (como en '' del primer campo para que pueda obtenerse en validador). – BalusC

+0

Ahora entiendo la función de 'atar' a BalusC, gracias por la ayuda amigo. –

0

Con la costura 2 tiene el componente <s:validateEquality> y no necesita escribir el código. Para JSF2, tiene módulos Seam 3, en particular Faces module y Validación de formulario de campo cruzado. Un ejemplo:

En primer lugar hay que utilizar la etiqueta s:validateForm:

<h:form id="passwordForm"> 
    <h:inputSecret id="newPassword" 
     required="true" 
     redisplay="true" 
     value="#{passwordController.newPassword}"> 
    </h:inputSecret>    
    <h:inputSecret id="confirmationPassword" 
     value="#{passwordController.confirmPassword}" 
     required="true" 
     redisplay="true"> 
    </h:inputSecret> 
    <h:commandButton id="submit" value="Submit" action="#{passwordController.submitPassword}" /> 
    <s:validateForm validatorId="passwordValidator" /> 
</h:form> 

y el Validador correspondiente para el formulario de contraseña anterior se vería así:

@FacesValidator("PasswordValidator") 
public class PasswordValidator implements Validator 
{ 
    @Inject 
    @InputField 
    private String newPassword; 

    @Inject 
    @InputField 
    private String confirmPassword; 

    @Override 
    public void validate(final FacesContext context, final UIComponent comp, final Object values) throws ValidatorException 
    { 
     if (!confirmPassword.equals(newPassword)) 
     { 
     throw new ValidatorException(new FacesMessage("Passwords do not match!")); 
     } 
    } 
} 
+0

Busqué una solución similar en JSF2 puro, pero no pude encontrarlo. ¿Sabes si esto existe en JSF2? Especialmente la anotación @InputField parece útil. –

0

Usted puede u se Primefaces p: etiqueta de contraseña. Por favor, vea la demostración example. Tiene coincide con el atributo que debería ser el id. De confirmación de contraseña.

<p:panel header="Match Mode"> 
    <p:messages id="messages" showDetail="true" autoUpdate="true"/> 

    <h:panelGrid columns="2" id="matchGrid">      
       <h:outputLabel for="pass" value="Password " /> 
       <p:password id="pass" value="#{passwordBean.password}" match="confirmPass" required="true"/> 

       <h:outputLabel for="confirmPass" value="Confirm Password " /> 
       <p:password id="confirmPass" value="#{passwordBean.confirmPassword}" required="true"/> 
    </h:panelGrid> 

    <p:commandButton id="saveButton" update="matchGrid" value="Save" /> 
</p:panel> 
Cuestiones relacionadas