我正在关注这个以了解 JSF 生命周期。我想检查一下我对 JSFimmediate="true"
属性的理解是否正确,如下所述。我用简单的 JSF 表单和一个 bean 尝试了这些案例。
案例 1:commandButton 上的 Immediate="true"
<h:form>
<table>
<tr>
<td><h:outputLabel value="Name"/></td>
<td><h:inputText value="#{userLogin.name}"/></td>
</tr>
<tr>
<td><h:outputLabel value="Password"/></td>
<td><h:inputText value="#{userLogin.password}"/></td>
</tr>
<tr>
<td><h:commandButton value="Sign In" action="#{userLogin.saveData}" immediate="true"/></td>
</tr>
</table>
</h:form>
它直接调用应用程序,即执行saveData
动作方法,无需任何表单处理。此活动在应用请求值生命周期阶段完成。跳过流程验证、更新模型值、调用应用程序等阶段。
案例 2:inputText 上的 Immediate="true"
<h:form>
<table>
<tr>
<td><h:outputLabel value="Name"/></td>
<td><h:inputText value="#{userLogin.name}" required="true" immediate="true"/></td>
</tr>
<tr>
<td><h:outputLabel value="Password" required="true"/></td>
<td><h:inputText value="#{userLogin.password}"/></td>
</tr>
<tr>
<td><h:commandButton value="Sign In" action="#{userLogin.saveData}"/></td>
</tr>
</table>
</h:form>
当任何字段为空时,将不会提交表单。这意味着对具有immediate="true"
立即属性集的字段和另一个字段进行验证,这两个值都在模型中更新。有什么区别,如何理解?验证是否在应用请求值阶段针对具有立即属性的输入字段优先进行,并且在流程验证阶段是否针对没有立即属性的第二个输入字段进行验证?
案例 3:inputText 和 commandButton 上的 Immediate="true"
<h:form>
<table>
<tr>
<td><h:outputLabel value="Name"/></td>
<td><h:inputText value="#{userLogin.name}" required="true" immediate="true"/></td>
</tr>
<tr>
<td><h:outputLabel value="Password" required="true"/></td>
<td><h:inputText value="#{userLogin.password}"/></td>
</tr>
<tr>
<td><h:commandButton value="Sign In" action="#{userLogin.saveData}" immediate="true"/></td>
</tr>
</table>
</h:form>
表单也使用空值提交,这意味着它没有验证,操作方法被执行,我看到模型值在提交期间输入时也没有更新。因此,尽管在Apply Request Values阶段调用了 action 方法,但所有阶段(如Process Validations、Update model values 、invoke application )都被跳过。
我不太确定我的理解是否正确。