为什么附加到inputSecret标记时不传递属性标记的值?

时间:2012-03-15 17:48:39

标签: java jsf-2 facelets

我正在尝试找出为什么f:attribute标记的值在附加到h:inputSecret标记时未传递。我对jsf很新,但据我所知,属性可以附加到任何类型的组件上。这是代码:

<h:panelGrid>
            <h:outputLabel for="email" value="email:"/>
            <h:inputText id="email" value="#{advertAdder.userEmail}" required="true"/>

            <h:outputLabel for="passw" value="password:"/>
            <h:inputSecret id="passw" title="Password" value="#{advertAdder.userPass}" 
                           required="true" validator="#{advertAdder.validatePasswords}">
                <f:attribute name="confirmedPass" value="#{advertAdder.passConfirmator.value}"/>
            </h:inputSecret>

            <h:outputLabel for="passwConfirm" value="confirm password:"/>
            <h:inputSecret id="passwConfirm" required="true" 
                           binding="#{advertAdder.passConfirmator}"/>

</h:panelGrid>

以及想要访问此属性的方法:

public void validatePasswords(FacesContext context, UIComponent component, Object value)
    {
        if (!value.equals(component.getAttributes().get("confirmedPass")))
        {
            FacesMessage mess = new FacesMessage("Password and it's confirmation are not the same!");
            context.addMessage(component.getClientId(context), mess);
            ((UIInput) component).setValid(false);
        }

    }

在上面的代码component.getAttributes()中,始终返回仅包含两个属性的地图: javax.faces.component.VIEW_LOCATION_KEYcom.sun.faces.facelets.MARK_ID

我已经将属性标签添加到h:commandButton来检查它,然后一切都很好。我错过了什么,或者无法为非动作标签添加属性? 我正在使用Mojarra 2.0.2和Glassfish 3.0.1。

提前致谢。

1 个答案:

答案 0 :(得分:2)

输入组件按组件树中显示的顺序进行处理。 UIInput#getValue()仅在已经处理组件时可用。否则,您需要改为使用UIInput#getSubmittedValue()

<f:attribute name="confirmedPass" value="#{advertAdder.passConfirmator.submittedValue}"/>

请注意,这会为您提供未转换和未经验证的值。将验证器放在确认密码字段上并传递第一个密码字段的值会更有意义。另请参阅JSF Validator compare to Strings for Equality

或者,您也可以试用OmniFaces <o:validateEqual>组件。您可以在this article中找到具体示例。


对具体问题

无关,没有必要以这种方式将组件绑定到bean。将所有#{advertAdder.passConfirmator}替换为#{passConfirmator}。保持控制器不受内部使用的属性的影响。