Java 使用ADF 11进行JSF密码确认验证

Java 使用ADF 11进行JSF密码确认验证,java,validation,jsf,oracle-adf,Java,Validation,Jsf,Oracle Adf,如何创建验证程序,验证用户是否在密码字段和密码确认字段中输入了相同的值 我是在托管bean中完成的,但我更喜欢使用JSF验证器来完成 真正的问题是,如何创建一个验证程序来访问除被验证组件之外的其他JSF组件 我使用的是ADF Faces 11 谢谢 真正的问题是,如何创建一个验证程序来访问除被验证组件之外的其他JSF组件 不要试图直接访问组件;你会后悔的。JSF的验证机制最能防止垃圾进入模型 您可以使用不同类型的托管bean;某种形式: /*Request scoped managed bean

如何创建验证程序,验证用户是否在密码字段和密码确认字段中输入了相同的值

我是在托管bean中完成的,但我更喜欢使用JSF验证器来完成

真正的问题是,如何创建一个验证程序来访问除被验证组件之外的其他JSF组件

我使用的是ADF Faces 11

谢谢

真正的问题是,如何创建一个验证程序来访问除被验证组件之外的其他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;
    }
  }
}
/*请求作用域受管bean*/
公共类PasswordValidationBean{
私有字符串输入1;
私有字符串输入2;
私有布尔输入1集;
public void validateField(FacesContext上下文、UIComponent、,
对象值){
如果(输入1集){
input2=(字符串)值;
如果(input1==null | | input1.length()<6 | |(!input1.equals(input2))){
((EditableValueHolder)组件).setValid(false);
context.addMessage(component.getClientId(context)),new FacesMessage(
“密码必须为6个字符+两个字段相同”);
}
}否则{
input1Set=true;
input1=(字符串)值;
}
}
}
这是使用方法绑定机制绑定的:

<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 Validation()完成这类工作。

您始终可以从上下文映射中提取其他字段的值,并对多个字段执行验证。如下所示:

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

看起来有点难看,但这是在字段级别而不是页面级别进行JSF验证(JSF2+JSR303的目标是改变这一点)。不过,这种豆子还是可以改进的。另一种选择是自定义呈现程序和/或组件,但这对于类似的东西来说可能太多了。这对我来说不起作用:(我有一个带有bean.password和bean.password2的bean,但是如果我验证password2并尝试获取密码值,我会得到null