在<c:if> </c:if>中没有调用actionListener

时间:2012-12-19 11:28:32

标签: jsf-2 primefaces jstl actionlistener facescontext

我有以下代码,使用jsf2.2,primefaces 3.2。 我的要求是根据updateFlag更新项目。 当我使用c:if(xmlns:c =“http://java.sun.com/jsp/jstl/core”)时,如下面的代码,不会调用Update commandButton的动作侦听器。但如果我使用&lt; p:panel rendered =“#{projectBean.updateFlag}”&gt;而不是&lt; c:如果&gt;有用。请帮助我得到它,我想我应该使用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>

1 个答案:

答案 0 :(得分:2)

这是非DRY代码的典型示例,这很糟糕。丹尼尔完美地展示了如何让它变干,但是他并没有解释你的问题的原因。

基于问题症状,当#{projectBean}是视图范围的bean时会发生这种情况。视图范围内的bean存储在JSF视图状态中。因此,视图范围内的bean仅在还原视图阶段后可用。但是,JSTL标记在还原视图阶段运行,而视图范围Bean尚不可用。这会导致创建一个全新的视图范围bean实例,然后由实际视图范围bean替换,该实例存储在已恢复的JSF视图状态中。 JSTL使用的全新且独立的视图范围bean将其所有属性设置为默认值,因此具有updateFlag=false的块将始终被调用。

另见: