2011-09-20 31 views
15

我試圖用JSF驗證兩個密碼字段,但直到現在沒有好的,我在谷歌搜索它,但一切都是關於JSF 1.2和相當混亂,我使用JSF 2.0。如何通過ajax驗證兩個密碼字段?

這是我在做什麼至今:

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

這是我怎麼是我的控制器:

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

任何想法的傢伙?

+0

你是什麼意思,它工作,但不是很好?它慢嗎?不知道我明白你想改變什麼,爲什麼。 – jdias

+0

嗨@jdias,我的意思是不按照它假設的方式工作。謝謝你可能有點困惑。 –

回答

19

首先,使用realValidator來驗證輸入。不要在動作事件方法中使用它。

關於你的具體問題,你只需要在<f:ajax>execute屬性來指定領域,它即默認爲僅當前組件。如果您將驗證程序附加到第一個輸入並將第二個輸入的值作爲<f:attribute>發送,那麼您將能夠在驗證程序中獲取它。您可以使用binding屬性將組件綁定到視圖。通過這種方式,您可以將提交的值傳遞給UIInput#getSubmittedValue()

這裏有一個開球例如:

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

(請注意,我說required="true"這兩個部件,也請注意,你不一定需要確認密碼組件值綁定到託管bean的屬性,它的毫無價值那邊反正)

與此驗證

@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

確認密碼在binding =「#{confirmPassword}」中是什麼? –

+1

@Jword:它將通過給定的標識符將組件綁定到視圖,以便它可以通過視圖中其他位置的「#{confirmPassword}」獲得(例如在第一個字段的「」中,以便它可以在驗證器)。 – BalusC

+0

我現在明白'捆綁'BalusC的功能,感謝幫助夥計。 –

0

縫2你有組件<s:validateEquality>,你不需要編寫代碼。對於JSF2,你有Seam 3模塊,特別是Faces module和Cross-field Form Validation。舉個例子:

首先,你必須使用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> 

和上述密碼錶單對應的驗證程序是這樣的:

@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

我在純JSF2中尋找類似的解決方案,但找不到它。你知道這是否存在於JSF2中?特別是@InputField註解似乎很有用。 –

0

您可以ü se Primefaces p:密碼標籤。請參閱演示example。它有匹配屬性,它應該是確認密碼的ID。

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