微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JSF ajax验证与“正常”验证

我有这个小形式,并试图理解在JSF验证中使用ajax.这是表格. (支持bean只是一个带有两个变量firstName和lastName的简单bean.)

<h:form>
    <h:outputLabel for="firstName" value="First Name: " />
    <h:inputText id="firstName" value="#{userBean.firstName}">
        <f:validateLength minimum="5" />
        <f:ajax event="keyup" render="firstNameMsg" />
    </h:inputText>
    <h:message id="firstNameMsg" for="firstName" style="color: red" />
    <br />
    <h:outputLabel for="lastName" value="Last Name: " />
    <h:inputText id="lastName" value="#{userBean.lastName}">
        <f:validateLength minimum="5" />
        <f:ajax event="keyup" render="lastNameMsg" />
    </h:inputText>
    <h:message id="lastNameMsg" for="lastName" style="color: red" />
    <br />
    <h:commandButton value="Submit">
        <f:ajax execute="firstName lastName" render=":greeting" />
    </h:commandButton>
    <br />
</h:form>
<h:outputText id="greeting" value="#{userBean.greeting}" />

我有一个附加到我的按钮的ajax,它在提交时使用名字和姓氏呈现outputText标记,这很好.我的问题是为什么我需要使用带f:validateLength标签的f:ajax标签来验证这两个字段?我的理解是ajax执行渲染响应阶段之前的所有生命周期阶段,即它包括验证.无论是否来自ajax请求或常规提交/操作请求,验证阶段是否都不会重新呈现带有消息的页面?如果我删除附加到输入字段的ajax标记,则验证消息不会显示,但如果我完全删除ajax并且只使用commandButtons动作事件使用常规提交,它们就会显示.

谢谢,
艾伦

解决方法

这是因为在正常的请求处理中,向服务器提交值的唯一方法是(通过任何客户端脚本处理)是通过发送整个表单.当您删除所有< f:ajax>时会发生这种情况.只有输入输入字段才能从服务器(在本例中为验证消息)获得响应.

当你删除你的< f:ajax>来自组件firstName和lastName,只留下最后一个与< h:commandButton>然后,因为它说它将执行firstName和lastName,对这些字段进行服务器端验证,但结果它将仅渲染:问候组件.要修复它,您可以添加到< h:commandButton>这个:

<f:ajax execute="firstName lastName" render=":greeting firstNameMsg lastNameMsg"/>

但现在这些消息只会在您提交表单时显示,而不是在输入字段中键入键时显示.

要获得一些摘要:使用AJAX,您必须准确指定在发送请求后必须呈现哪些组件(及其所有子组件).

顺便说一句,在输入字段中为用户输入的每个键发送服务器请求不是一个好主意.更好地使用JavaScript或其他客户端技术来执行此操作,并且在服务器上仅验证整个最终值.

我希望我的解释会对你有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐