我是JSF的新手并经历了一个JSF应用程序。
我想为空字符串验证一个密码字段。
我知道不是在Javascript中执行此操作,而是调用函数进行验证。
我需要的是,如果密码字段的值为空,那么它将从验证器功能验证,直到现在它正确运行但在验证之后它到达UI bav = ck,此时密码字段应为空。
如果密码字段为空(仅包含空格),那么我希望它将其设置为空白,或者保持数据不变。
我的尝试到现在为止, JSF查看页面singin.xhtml
<h:outputText styleClass="outputBox" style="margin: 3px;"
value="Password" />
<h:inputSecret id="password" required="true"
requiredMessage="Please enter your password"
value="#{userActionManager.dto.password}"
validator="#{userActionManager.validateSamePassword}">
<a4j:ajax event="change" execute="@this" bypassUpdates="true" />
</h:inputSecret>
验证方法。
public void validateSamePassword(FacesContext fc, UIComponent component, Object obj) {
System.out.println("UserActionManager.validateSamePassword()");
String confirmPassword = (String)obj;
System.out.println("Password is :" + confirmPassword);
if(confirmPassword!=null && confirmPassword.trim().equals("")) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Password cannot be blank", " detail Passwords do not match!");
// System.out.println(component.getFamily());
// String field1Id = (String) component.getAttributes().get("password");
// Find the actual JSF component for the client ID.
// UIInput textInput = (UIInput) fc.getViewRoot().findComponent("password");
// textInput.setValue("");
dto.setPassword(null);
throw new ValidatorException(message);
}else{
dto.setPassword(confirmPassword);
}
}
我尝试了选项dto.setPassword(null);但当它返回到视图时,密码字段中的空格仍然存在,我必须手动删除。
我缺少什么?
答案 0 :(得分:1)
在验证程序中,在resetValue()
的实例上调用UIComponent
作为参数传递
public void validateSamePassword(FacesContext fc, UIComponent component, Object obj) {
System.out.println("UserActionManager.validateSamePassword()");
String confirmPassword = (String)obj;
System.out.println("Password is :" + confirmPassword);
if(confirmPassword!=null && confirmPassword.trim().equals("")) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Password cannot be blank", " detail Passwords do not match!");
component.resetValue();
throw new ValidatorException(message);
}else{
dto.setPassword(confirmPassword);
}
}
dto.setPassword(null)
不会影响密码框中的值,因为输入组件旨在保留导致验证失败的值。 resetValue()
是一种方法,会导致组件将其值重置为未初始化状态
编辑:上述解决方案过早地重置输入值。从技术上讲,验证在引发ValidationException
之前不会失败。要有效地重置字段:
定义一个侦听器事件,该事件仅在验证失败后重置组件的值
public void resetPwd(ComponentSystemEvent evt) throws IOException {
HtmlInputSecret txt = (HtmlInputSecret) evt.getComponent();
if(!txt.isValid()){ //make sure that the validation failed
txt.resetValue();
}
}
将侦听器事件附加到密码组件上的postValidate
事件侦听器。这将确保仅在验证失败后重置该值。
<h:inputSecret id="password" required="true"
requiredMessage="Please enter your password"
value="#{userActionManager.dto.password}"
validator="#{userActionManager.validateSamePassword}">
<f:event name="postValidate" listener="#{userActionManager.resetPwd}"/>
<a4j:ajax event="change" execute="@this" bypassUpdates="true" />
</h:inputSecret>
这里的关键是在正确的时间重置值。其他时间选项包括preRenderView
事件和postAddToView
事件。一切都在时机
答案 1 :(得分:1)
如果组件标记为无效,则它不会重新显示模型值(在您的情况下,是dto
的值)。相反,它将重新显示其submitted value。您只需将提交的值设置为空字符串。
替换
dto.setPassword(null);
通过
((UIInput) component).setSubmittedValue("");