我们有一个复杂的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
答案 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