2009-09-29 53 views
3

如何創建一個驗證器來驗證用戶是否在密碼字段和密碼確認字段中輸入了相同的值?使用ADF的JSF密碼驗證驗證11

我做到了在託管bean,但我更喜歡使用JSF驗證做...

真正的問題是,如何創建訪問除組件以外的其他JSF組件的驗證程序所驗證?

我使用的ADF Faces 11

謝謝...

回答

4

真正的問題是,如何建立有效的被訪問成分以外的其他JSF組件的驗證程序?

不要試圖直接訪問組件;你會後悔的。 JSF的驗證機制在防止垃圾進入模型方面效果最佳。

您可以使用不同類型的託管bean;形式的東西:

/*Request scoped managed bean*/ 
public class PasswordValidationBean { 
    private String input1; 
    private String input2; 
    private boolean input1Set; 

    public void validateField(FacesContext context, UIComponent component, 
     Object value) { 
    if (input1Set) { 
     input2 = (String) value; 
     if (input1 == null || input1.length() < 6 || (!input1.equals(input2))) { 
     ((EditableValueHolder) component).setValid(false); 
     context.addMessage(component.getClientId(context), new FacesMessage(
      "Password must be 6 chars+ & both fields identical")); 
     } 
    } else { 
     input1Set = true; 
     input1 = (String) value; 
    } 
    } 
} 

這是使用方法綁定機制的束縛:

<h:form> 
    Password: <h:inputSecret 
    validator="#{passwordValidationBean.validateField}" 
    required="true" /> 
    Confirm: <h:inputSecret 
    validator="#{passwordValidationBean.validateField}" 
    required="true" /> 
    <h:commandButton value="submit to validate" /> 
    <!-- other bindings omitted --> 
    <h:messages /> 
</h:form> 

在未來,你應該能夠做到使用Bean驗證(JSR 303)這樣的事情。

+0

似乎有點難看,但沒關係 – razenha 2009-09-29 19:21:42

+0

JSF驗證在外地工作,而不是頁面(JSF 2 + JSR 303旨在改變的東西)。雖然,這個bean可能會有所改進。另一種選擇是自定義渲染器和/或組件,但這對於這樣的事情可能太多了。 – McDowell 2009-09-30 10:04:24

2

您可以隨時從上下文映射中抽取其他字段的值,並在多個字段上執行驗證。類似下面:

public void validatePassword2(FacesContext facesContext, UIComponent uIComponent, Object object) throws ValidatorException{ 
    String fieldVal = (String)object; 

    String password1 = (String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("password1"); 
    if(!password1.equalsIgnoreCase(fieldVal)){ 
     FacesMessage message = new FacesMessage("Passwords must match"); 
     throw new ValidatorException(message); 
    } 
} 

和JSF看起來是這樣的:

<h:inputSecret value="#{profile.password2}" validator="#{brokerVal.validatePassword2}" required="true" requiredMessage="*required" id="password2" /> 

HTH

+0

這不工作vor我:(我有一個Bean與Bean.password和bean.password2,但如果我驗證password2,並嘗試獲取密碼值,我得到空 – Markus 2010-10-19 15:58:08