【问题标题】:JSF password confimation validation using ADF 11使用 ADF 11 的 JSF 密码确认验证
【发布时间】:2010-12-02 08:35:48
【问题描述】:

如何创建一个验证器来验证用户是否在密码字段和密码确认字段中输入了相同的值?

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

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

我正在使用 ADF Faces 11。

谢谢...

【问题讨论】:

    标签: java validation jsf oracle-adf


    【解决方案1】:

    真正的问题是,如何创建一个验证器来访问除被验证组件之外的其他 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 Validation (JSR 303) 来执行此类操作。

    【讨论】:

    • 看起来有点丑,不过没关系
    • JSF 验证在字段级别而不是页面上工作(JSF 2 + JSR 303 旨在改变)。不过,这颗豆子可能会有所改进。另一种选择是自定义渲染器和/或组件,但对于这样的事情来说,这可能是太多的工作。
    【解决方案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

    【讨论】:

    • 这对我不起作用:(我有一个带有 Bean.password 和 bean.password2 的 bean,但如果我验证 password2 并尝试获取密码值,我会得到 null
    猜你喜欢
    • 2013-09-18
    • 2015-04-03
    • 2023-02-23
    • 2012-12-08
    • 2011-08-23
    • 2017-12-06
    • 2021-07-24
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多