2

早上好,我只想知道像这样验证 JSF 组件之间的区别:

<h:form id="register">

    <h:message for="RegisterGroupPanel" style="color:red;" />

    <h:panelGrid columns="3" id="RegisterGroupPanel">

        <f:event listener="#{user.validatePassword}" type="postValidate" /> // diff between that and normal <h:command>

        <h:outputLabel for="username" value="Username : " />
        <h:inputText id="username" value="#{user.username}" required="true"
            requiredMessage="Please enter username" />
        <h:message for="username" style="color: red;" />


        <h:outputLabel for="password" value="Password : " />
        <h:inputSecret id="password" value="#{user.password}" required="true"
            requiredMessage="Please enter password" />
        <h:message for="password" style="color: red;" />


        <h:outputLabel for="confirmPassword" value="Confirm password : " />
        <h:inputSecret id="confirmPassword" required="true"
            requiredMessage="Please enter confirm password" />
        <h:message for="confirmPassword" style="color: red;" />

    </h:panelGrid>

    <h:commandButton action="thanks" value="register" />

</h:form>

在这里,我将动作放在按钮内并删除了<f:event listener="#{user.validatePassword}" type="postValidate" />

<h:form id="register">

    <h:message for="RegisterGroupPanel" style="color:red;" />

    <h:panelGrid columns="3" id="RegisterGroupPanel">


        <h:outputLabel for="username" value="Username : " />
        <h:inputText id="username" value="#{user.username}" required="true"
            requiredMessage="Please enter username" />
        <h:message for="username" style="color: red;" />


        <h:outputLabel for="password" value="Password : " />
        <h:inputSecret id="password" value="#{user.password}" required="true"
            requiredMessage="Please enter password" />
        <h:message for="password" style="color: red;" />


        <h:outputLabel for="confirmPassword" value="Confirm password : " />
        <h:inputSecret id="confirmPassword" required="true"
            requiredMessage="Please enter confirm password" />
        <h:message for="confirmPassword" style="color: red;" />

    </h:panelGrid>

    <h:commandButton action="#{user.validatePassword}" value="register" />

</h:form>

这增加了什么额外的功能 <f:event>

4

1 回答 1

3

提供了一种在给定事件发生时<f:event>调用给定listener方法的方法type。该postValidate事件在验证阶段结束时调用,在整个表单被处理、转换和验证之后,但模型更新之前。因此,如果您打算根据提交的值执行工作,则需要通过UIInput#getValue().

命令按钮的操作方法在调用应用程序阶段调用,在更新模型值阶段之后。因此,如果您需要提交的值,您可以直接访问 bean 属性。

请注意,这两种方法都没有提供一种在所需组件处自动显示消息的好方法,也没有在验证失败的情况下FacesContext#validationFailed()返回true

从这两种方式来看<f:event type="postValidate">,如果正确实现了侦听器方法,则该方式在技术上是执行工作的最正确方式。验证应该在验证阶段而不是在调用应用程序阶段执行。

但是,更好的方法是使用专门用于验证多个字段是否相等的组件。JSF 实用程序库OmniFaces有这样一个组件:<o:validateEqual>. 在您的特定情况下,您可以按如下方式使用它:

<h:form id="register">
    <h:panelGrid columns="3" id="RegisterGroupPanel">
        <h:outputLabel for="username" value="Username : " />
        <h:inputText id="username" value="#{user.username}" required="true"
            requiredMessage="Please enter username" />
        <h:message for="username" style="color: red;" />

        <h:outputLabel for="password" value="Password : " />
        <h:inputSecret id="password" value="#{user.password}" required="true"
            requiredMessage="Please enter password" />
        <h:panelGroup>
            <h:message for="password" style="color: red;" />
            <h:message for="validateConfirm" style="color:red;" />
        </h:panelGroup>

        <h:outputLabel for="confirmPassword" value="Confirm password : " />
        <h:inputSecret id="confirmPassword" required="true"
            requiredMessage="Please enter confirm password" />
        <h:message for="confirmPassword" style="color: red;" />
    </h:panelGrid>

    <o:validateEqual id="validateConfirm" components="password confirmPassword" message="Passwords are not equal" />    
    <h:commandButton action="thanks" value="register" />
</h:form>

没有任何自定义侦听器方法。

于 2013-03-31T12:40:14.197 回答