【问题标题】:JSF ajax validation vs "normal" validationJSF ajax 验证与“正常”验证
【发布时间】:2021-12-03 12:26:24
【问题描述】:

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

【问题讨论】:

    标签: ajax jsf


    【解决方案1】:

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

    当您从组件 firstNamelastName 中删除您的 &lt;f:ajax&gt; 并仅将最后一个保留为 &lt;h:commandButton&gt; 时,正如它所说,它将执行 firstNamelastName,对这些组件进行服务器端验证字段,但结果它只会呈现:greeting 组件。要修复它,您可以添加到您的 &lt;h:commandButton&gt; 这个:

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

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

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

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

    【讨论】:

    • 感谢工作。是的,我知道 keyup 事件不是一个好主意,我只是想要一些与 ajax 一起工作的东西,你的解决方案更好。干杯
    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 2011-01-29
    • 1970-01-01
    • 2012-04-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多