h:commandButton f:ajax执行触发另一种形式的表达式

时间:2019-01-30 17:11:36

标签: performance jsf primefaces

我们有一个复杂的JSF页面,其中包含可重复的素词组件,例如p:dataTable,p:tabView,ui:repeat,c:foreach,javascript等。 该页面由两个单独的表单组成,其ID为 formHeader formBPM 奇怪的是,执行h:commandButton(放置在 formHeader 表单中)会导致以 formBPM 形式调用所有getter,render和test表达式。在RestoreView和RenderResponse阶段都调用表达式。

<h:form id="formHeader" enctype="multipart/form-data;charset=UTF-8">            
 <h:commandButton value="Call this"  type="button">
                        <f:ajax execute="@this"  />
 </h:commandButton>
</h:form>
<h:form id="formBpm">
 <p:tabView...>
  <p:dataTable....>
  </p:dataTable>
 ....
 </p:tabView>
</h:form>

原始页面太复杂,动态组件和Java脚本超载了页面。 但是我以简化的结构为上述页面建模并检查了日志记录

<h:form id="formHeader" enctype="multipart/form-data;charset=UTF-8">            
    <h:commandButton value="Call this"  type="button">
                <f:ajax execute="@this"  />
    </h:commandButton>
    <h:commandButton value="Call form render form"  type="button">
                <f:ajax execute="@form" render="@form"/>
    </h:commandButton>
    <h:commandButton value="Call formBpm"  type="button">
                <f:ajax execute=":formBpm"/>
    </h:commandButton>
    <h:commandButton value="Call formBpm render formBpm"  type="button">
                <f:ajax execute=":formBpm" render=":formBpm"/>
    </h:commandButton>
    <p:outputLabel id="labelThisid" value="#{testBean.varThis}"></p:outputLabel>
</h:form>
<h:form id="formBpm">
    <p:outputLabel id="labelid" value="#{testBean.var1}"></p:outputLabel>
    <p:tabView  id="tabViewId" >
        <p:tab id="tabId1" title="#{testBean.tab1}">
        </p:tab>
        <p:tab id="tabId2" title="#{testBean.tab2}" rendered="#{testBean.tab2Show}">
        </p:tab>
    </p:tabView>
</h:form>

根据日志记录,在简化的页上,单击“调用此”时不会执行任何吸气剂,只有在呈现适当的形式时才执行吸气剂,而不执行。而且,仅在RenderResponse阶段调用吸气剂。 不合适的吸气剂调用原始复合物页面的原因可能是什么?

Primefaces 6.1 jBoss EAP 6.4 JSF Mojarra 2.1.28

1 个答案:

答案 0 :(得分:0)

解决方案是,无论单击的commandButton的执行容器如何,都将执行jstl标记中的表达式。在我们的原始页面中,有时将相同的表达式既用作值的获取器,又用于jstl标签的测试表达式。因此,在下面的代码表达式中,单击按钮“调用此”将执行#{testBean.tab2Show}。此外,在RestoreView和RenderResponse阶段两次调用测试表达式。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui"
    >     
    <h:head>
        <h2>Check jstl with AJAX </h2>
    </h:head>    
    <h:body>
        <h:form id="formHeader" enctype="multipart/form-data;charset=UTF-8">            
            <h:commandButton value="Call this">
                        <f:ajax execute="@this"  />
            </h:commandButton>
            <p:outputLabel id="labelThisid" value="#{testBean.varThis}"></p:outputLabel>
        </h:form>
        <h:form id="formBpm">
            <c:if test="#{testBean.tab2Show}">
                <p:outputLabel id="labelid" value="#{testBean.var1}"></p:outputLabel>
            </c:if>
            <p:tabView  id="tabViewId" >
                <p:tab id="tabId1" title="#{testBean.tab1}">
                </p:tab>
                <p:tab id="tabId2" title="#{testBean.tab2}">
                </p:tab>
            </p:tabView>
        </h:form>
    </h:body>
</html>

TestBean

public String getVar1() {
    log.debug("getVar1");
    return "getVar1";
}

public String getVarThis() {
    log.debug("getVarThis");
    return "getVarThis";
}

public String getTab1() {
    log.debug("getTab1");
    return "getTab1";
}

public String getTab2() {
    log.debug("getTab2");
    return "getTab2";
}

public boolean isTab2Show() {
    log.debug("isTab2Show");
    return true;
}

PhaseListener登录,单击“调用此按钮”

18:30:27,298 DEBUG [utils.LifeCycleListener:26] - START PHASE RESTORE_VIEW 1
18:30:27,300 DEBUG [utils.TestBean:48] - isTab2Show
18:30:27,300 DEBUG [utils.LifeCycleListener:30] - END PHASE RESTORE_VIEW 1
18:30:27,301 DEBUG [utils.LifeCycleListener:26] - START PHASE APPLY_REQUEST_VALUES 2
18:30:27,302 DEBUG [utils.LifeCycleListener:30] - END PHASE APPLY_REQUEST_VALUES 2
18:30:27,303 DEBUG [utils.LifeCycleListener:26] - START PHASE PROCESS_VALIDATIONS 3
18:30:27,303 DEBUG [utils.LifeCycleListener:30] - END PHASE PROCESS_VALIDATIONS 3
18:30:27,303 DEBUG [utils.LifeCycleListener:26] - START PHASE UPDATE_MODEL_VALUES 4
18:30:27,303 DEBUG [utils.LifeCycleListener:30] - END PHASE UPDATE_MODEL_VALUES 4
18:30:27,303 DEBUG [utils.LifeCycleListener:24] - START INVOKE_APPLICATION
18:30:27,303 DEBUG [utils.LifeCycleListener:26] - START PHASE INVOKE_APPLICATION 5
18:30:27,303 DEBUG [utils.LifeCycleListener:30] - END PHASE INVOKE_APPLICATION 5
18:30:27,303 DEBUG [utils.LifeCycleListener:26] - START PHASE RENDER_RESPONSE 6
18:30:27,303 DEBUG [utils.TestBean:48] - isTab2Show
18:30:27,304 DEBUG [utils.LifeCycleListener:30] - END PHASE RENDER_RESPONSE 6