早上好,我只是想知道验证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>
添加了什么额外的功能?
答案 0 :(得分: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>
没有任何自定义侦听器方法。