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