3

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

<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:ajax标签标签一起使用f:validateLength才能验证这两个字段?我的理解是,ajax 执行所有生命周期阶段直到呈现响应阶段,即它包括验证。验证阶段是否无论如何都不会重新呈现带有消息的页面,无论它来自 ajax 请求还是常规提交/操作请求?如果我删除附加到输入字段的 ajax 标记,则不会显示验证消息,但如果我完全删除 ajax 并仅使用 commandButtons 操作事件进行常规提交,它们就会显示。

4

1 回答 1

7

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

当你<f:ajax>从组件中删除你的firstName并且lastName只留下最后一个,<h:commandButton>因为它说它将执行firstNameand lastName,对这些字段进行服务器端验证,但结果它只会呈现:greeting组件。要修复它,您可以添加到您的<h:commandButton>这个:

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

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

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

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

于 2013-01-23T11:07:45.577 回答