在register.xhtml页面中,我有2个inputText
组件用于密码和确认密码如下:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:form>
<h:outputText style="font-weight: bold" value="Password: " />
<p:password feedback="true" minLength="9"
binding="#{mrBean.passwordComponent}"
id="password" value="#{mrBean.password}"/>
<p:message for="password" id="passwordMsg" />
<h:outputText style="font-weight: bold" value="Confirm password: " />
<p:password feedback="false" minLength="9"
id="confirmPassword" value="#{mrBean.confirmPassword}"
validator="#{mrBean.validateConfirmPassword}>
<f:attribute name="oriPassword" value="#{mrBean.passwordComponent.submittedValue}"/>
<p:ajax process="password confirmPassword" update="confirmPasswordMsg" />
</p:password>
<p:message for="confirmPassword" id="confirmPasswordMsg" />
</h:form>
</html>
这是我的mrBean:
@ManagedBean
@RequestScoped
public class MrBean {
private String password;
private String confirmPassword;
private UIInput passwordComponent;
public void validateConfirmPassword(FacesContext context, UIComponent toValidate,
Object value) throws ValidatorException {
String passwordStr = (String) toValidate.getAttributes().get("oriPassword");
String confirmPasswordStr = (String) value;
if (!confirmPasswordStr.equals(passwordStr)) {
FacesMessage message = new FacesMessage("The 2 passwords do not match.");
throw new ValidatorException(message);
}
}
}
在另一个页面中,我还有一个类似的bean,它具有类似的验证功能,适用于电子邮件和确认电子邮件,它完美无缺。但是,我不知道为什么它不能在这里工作。 passwordStr
始终为null
,即使我已输入密码。
如果有人能告诉我这里做错了什么,我将非常感激。
祝你好运, James Tran
答案 0 :(得分:1)
JSF组件按它们在组件树中出现的顺序进行处理。在验证阶段,对于每个组件,提交的值将由getSubmittedValue()
检索,转换和验证。如果在转换和验证期间未发生任何异常,则提交的值将设置为null
,并且转换和验证的值将按setValue()
设置为本地值。
您尝试引用已提交已经的组件的提交值。当转换/验证失败时,提交的值只有非null
。您需要改为引用其本地值。
<f:attribute name="oriPassword" value="#{mrBean.passwordComponent.value}"/>