我有以下代码,使用jsf2.2,primefaces 3.2。 我的要求是根据updateFlag更新项目。 当我使用c:if(xmlns:c =“http://java.sun.com/jsp/jstl/core”)时,如下面的代码,不会调用Update commandButton的动作侦听器。但如果我使用< p:panel rendered =“#{projectBean.updateFlag}”>而不是< c:如果>有用。请帮助我得到它,我想我应该使用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>
答案 0 :(得分:2)
这是非DRY代码的典型示例,这很糟糕。丹尼尔完美地展示了如何让它变干,但是他并没有解释你的问题的原因。
基于问题症状,当#{projectBean}
是视图范围的bean时会发生这种情况。视图范围内的bean存储在JSF视图状态中。因此,视图范围内的bean仅在还原视图阶段后可用。但是,JSTL标记在还原视图阶段运行,而视图范围Bean尚不可用。这会导致创建一个全新的视图范围bean实例,然后由实际视图范围bean替换,该实例存储在已恢复的JSF视图状态中。 JSTL使用的全新且独立的视图范围bean将其所有属性设置为默认值,因此具有updateFlag=false
的块将始终被调用。