使用ADF11进行JSF密码确认验证

3

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

我已经在托管bean中完成了此操作,但我更喜欢使用JSF验证器...

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

我正在使用ADF Faces 11。

谢谢...

2个回答

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 Validation (JSR 303)来完成此类事情。


看起来有点丑,但没关系。 - razenha
JSF验证是在字段级别而不是页面级别工作的(JSF 2 + JSR 303旨在改变这一点)。虽然可以改进bean,但可能的替代方案是自定义渲染器和/或组件,但对于像这样的东西来说,这可能是太多的工作了。 - McDowell

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接