为什么我无法从组件绑定中获取提交的值?

时间:2011-12-03 09:43:58

标签: java jsf-2 primefaces validation

在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

1 个答案:

答案 0 :(得分:1)

JSF组件按它们在组件树中出现的顺序进行处理。在验证阶段,对于每个组件,提交的值将由getSubmittedValue()检索,转换和验证。如果在转换和验证期间未发生任何异常,则提交的值将设置为null,并且转换和验证的值将按setValue()设置为本地值。

您尝试引用已提交已经的组件的提交值。当转换/验证失败时,提交的值只有非null。您需要改为引用其本地值。

<f:attribute name="oriPassword" value="#{mrBean.passwordComponent.value}"/>

另见: