2011-09-20 17 views
15

JSF ile iki parola alanını doğrulamaya çalışıyorum ama şu ana kadar iyi bir şey yok, google'da arama yaptım ama her şey JSF 1.2 ve oldukça kafa karıştırıcıydı, JSF 2.0 kullanıyorum. ajax tarafından iki şifre alanı nasıl doğrulanır?

Bu

şimdiye kadar ne yaptığımı edilir:

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); 
} 

herhangi bir fikir adamlar:

 <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> 

Bu Bunun benim denetleyicisi olduğunu nasıl?

+0

o çalışma ama çok iyi değil de ne demek? Yavaş mı? Ne değiştirmek istediğinizi ve nedenini anladığımdan emin değilim. – jdias

+0

Merhaba @jdias, demek istediğim şekilde çalışmıyor. Bunun için biraz kafa karıştırıcı olabilir. –

cevap

19

İlk: Bir örnek:

Önce s:validateForm etiketi kullanmak zorunda:

<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> 

ve üzeri şifre formu için ilgili Validator şu şekilde görünür Girişi doğrulamak için gerçekValidator kullanın. Bir eylem etkinliği yönteminde bunu yapma.

somut soruna gelince, sadece şimdiki bileşene sadece o yani varsayılan olarak <f:ajax> arasında execute Özellikte hem alanları belirtmek gerekir. İlk girdiye bir doğrulayıcı eklerseniz ve ikinci girişin değerini <f:attribute> olarak gönderirseniz, bunu doğrulayıcıda yakalayabilirsiniz. Bileşeni görünüme bağlamak için binding özniteliğini kullanabilirsiniz. Bu sayede gönderdiği değeri UIInput#getSubmittedValue() ile geçirebilirsiniz. İşte

bir başlama örnek:

<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" /> 

(not ben hem bileşenlere required="true" ve ayrıca mutlaka yönetilen bir fasulye özelliğine onayla şifre bileşeni değerini bağlamak gerekmez unutmayın ekledi, bu kadar değersiz bu denetleyici ile

) zaten orada

@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

Şifreyionayla = "# {Şifreyionayla}" bağlayıcı içinde ne var? –

+1

@Jsword: Bileşeni, tam olarak belirtilen tanımlayıcıyla bağlar, böylece görünümde başka bir yerde bulunan # # confirmPassword} tarafından kullanılabilir (örneğin, "türünde olduğu gibi doğrulayıcı). – BalusC

+0

Şimdi anladığım kadarıyla 'bağlayıcı' BalusC'nin işlevi, dostum için teşekkürler. –

0

Dikiş 2'de, <s:validateEquality> bileşenine sahipsiniz ve kod yazmanıza gerek yoktur. JSF2 için, Seam 3 modüllerine, özellikle Faces module ve Çapraz Alan Form Doğrulama'ya sahip olursunuz. Her şeyden

@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

Saf JSF2 benzer bir çözüm aradık, ama bulamadık. Bunun JSF2'de var olduğunu biliyor musunuz? Özellikle @InputField ek açıklaması yararlı görünüyor. –

0

Sen u can se Primefaces p: şifre etiketi. Lütfen demoya bakın example. Şifreyi onaylama kimliği olması gereken eşleşmesi eşleşmesine sahiptir.

<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> 
İlgili konular