我有这个小形式,我试图理解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,它在提交时用名字和姓氏呈现输出文本标签,这很好。 我的问题是为什么我需要将 f:ajax
标签与 f:validateLength
标签一起使用才能验证这两个字段? 我的理解是,ajax 执行所有生命周期阶段,直到渲染响应阶段,即它包括验证。 验证阶段是否无论如何都不会重新呈现带有消息的页面,无论它来自 ajax 请求还是常规提交/操作请求? 如果我删除附加到输入字段的 ajax 标签,则验证消息不会显示,但如果我完全删除 ajax 并仅使用 commandButton 操作事件使用常规提交,则验证消息会显示。
这是因为在正常的请求处理中,向服务器提交值的唯一方法(任何客户端脚本处理)是发送整个表单。当您删除所有<f:ajax>
时会发生这种情况。仅通过键入输入字段无法从服务器获取响应(在本例中为验证消息)。
当您从组件中删除<f:ajax>
时firstName
和lastName
并且只将最后一个保留为<h:commandButton>
,然后因为它说它将执行firstName
和lastName
,对这些字段进行服务器端验证,但结果它将仅呈现:greeting
组件。要修复它,您可以添加以下内容<h:commandButton>
:
<f:ajax execute="firstName lastName" render=":greeting firstNameMsg lastNameMsg"/>
但是现在,这些消息只会在您提交表单时显示,而不会在您输入字段中键入键时显示。
要获得一些摘要:使用 AJAX,您必须准确指定在发送请求后必须呈现哪些组件(及其所有子组件)。
顺便说一下,为用户在输入字段中键入的每个键发送服务器请求不是一个好主意。最好使用 JavaScript 或其他客户端技术来执行此操作,并且仅在服务器上验证整体的最终值。