我有以下代码,使用 jsf2.2,primefaces 3.2。我的要求是根据更新标志更新项目。当我像下面的代码一样使用 c:if (xmlns:c="http://java.sun.com/jsp/jstl/core") 时,不会调用更新命令按钮的操作侦听器。但是如果我使用 <p:panel>而不是 <c:if>它就可以工作了。请帮助我得到它,我想我应该使用 c:if 但它不起作用。
<p:dialog widgetVar="projectUpdate" id="projectUpdatePanel" modal="false" >
<p:panel>
<c:if test="#{projectBean.updateFlag == false}">
<h:outputText value="Project Title" />
<p:inputText disabled="true" value="#{projectBean.selectedProjectDo.projectTitle}" />
<p:commandButton value="Update" disabled="true" />
<p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
</c:if>
<c:if test="#{projectBean.updateFlag == true}">
<h:outputText value="Project Title"/>
<p:inputText value="#{projectBean.selectedProjectDo.projectTitle}" />
<p:commandButton value="Update" actionListener="#{projectBean.updateProject}" />
<p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
</c:if>
</p:panel>
</p:dialog>
你最好按以下方式使用它(对禁用属性设置条件)
<p:panel>
<h:outputText value="Project Title"/>
<p:inputText disabled="#{not projectBean.updateFlag}"
value="#{projectBean.selectedProjectDo.projectTitle}" />
<p:commandButton disabled="#{not projectBean.updateFlag}" value="Update"
actionListener="#{projectBean.updateProject}" />
<p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
</p:panel>
一般来说:不要使用 JSTL 标签,除非你真的需要它们......
这是非 DRY 代码的典型示例,这很糟糕。丹尼尔完美地展示了如何使其干燥,但他没有解释问题的原因。
根据问题症状,当#{projectBean}
是视图范围的 Bean 时,将发生这种情况。视图作用域的 Bean 存储在 JSF 视图状态中。因此,视图作用域的 Bean 仅在还原视图阶段后可用。但是,JSTL 标记在恢复视图阶段运行,而视图范围的 Bean 尚不可用。这会导致创建一个全新的视图作用域 Bean 实例,该实例随后被存储在恢复的 JSF 视图状态中的实际视图作用域 Bean 替换。JSTL 使用的全新且单独的视图范围 Bean 将使其所有属性设置为默认值,因此将始终调用具有updateFlag=false
的块。
另请参阅:
- JSTL in JSF2 Facelets...意义?