我正在关注this以了解JSF生命周期。我想在下面提到的各种情况下检查我对JSF immediate="true"
属性的理解是否正确。我用简单的JSF表单和bean来尝试这些案例。
案例1:立即="真"在commandButton
<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:立即=&#34;真&#34;在inputText上
<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"
的字段和另一个没有立即属性集的字段中,两个值都在模型中更新。有什么区别,怎么理解这个?对于应用请求值阶段中具有immediate属性的输入字段,是否优先进行验证,并且对于 Process Validations 阶段中没有immediate属性的第二个输入字段进行验证?
案例3:立即=&#34;真&#34;在inputText和commandButton
上
<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>
表单也提交空值,意味着它没有验证,执行了操作方法,并且我看到在提交期间输入时模型值也没有更新。因此,尽管在应用请求值中调用了操作方法,但仍会跳过所有阶段,例如流程验证,更新模型值,调用应用程序 阶段。
我不确定我的理解是否正确。