【发布时间】:2010-12-02 08:35:48
【问题描述】:
如何创建一个验证器来验证用户是否在密码字段和密码确认字段中输入了相同的值?
我是在托管 bean 中完成的,但我更喜欢使用 JSF 验证器...
真正的问题是,如何创建一个验证器来访问除被验证组件之外的其他 JSF 组件?
我正在使用 ADF Faces 11。
谢谢...
【问题讨论】:
标签: java validation jsf oracle-adf
如何创建一个验证器来验证用户是否在密码字段和密码确认字段中输入了相同的值?
我是在托管 bean 中完成的,但我更喜欢使用 JSF 验证器...
真正的问题是,如何创建一个验证器来访问除被验证组件之外的其他 JSF 组件?
我正在使用 ADF Faces 11。
谢谢...
【问题讨论】:
标签: java validation jsf oracle-adf
真正的问题是,如何创建一个验证器来访问除被验证组件之外的其他 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) 来执行此类操作。
【讨论】:
您始终可以从上下文映射中提取其他字段的值,并对多个字段执行验证。如下所示:
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
【讨论】: