我尝试在点击ajax (PrimeFaces)三元组时使用ui:include
替换页面。默认情况下加载的第一个页面加载正确,所有组件都是活动的,但是当我点击另一个树节点来显示另一个页面时,后一个页面加载异常,就像下面的对话框可见和页面手一样。
我觉得如果我可以强制页面部分重新加载作为默认的nodeSelect
index.jsf
(登录时加载)
<p:layoutUnit position="west" size="270" header="Menu" collapsible="false" resizable="true">
<p:ajaxStatus style="width:16px;height:16px;">
<f:facet name="start">
<h:graphicImage value="../design/ajaxloading.gif"/>
</f:facet>
<f:facet name="complete">
<h:outputText value=""/>
</f:facet>
</p:ajaxStatus>
<h:form id="appsMainControl">
<ui:include src="/ui/appServices.jsf"/>
</h:form>
</p:layoutUnit>
<p:layoutUnit position="center">
<h:form id="centerControl">
<ui:include src="/ui/#{amb.appToGet}.jsf"/>
</h:form>
</p:layoutUnit>
具有侦听器动作的treeview组件。在节点选择时,我希望子页面能够适当加载
<p:layoutUnit position="west" size="270" header="Menu" collapsible="false" resizable="true">
<p:ajaxStatus style="width:16px;height:16px;">
<f:facet name="start">
<h:graphicImage value="../design/ajaxloading.gif"/>
</f:facet>
<f:facet name="complete">
<h:outputText value=""/>
</f:facet>
</p:ajaxStatus>
<h:form id="appsMainControl">
<ui:include src="/ui/appServices.jsf"/>
</h:form>
</p:layoutUnit>
<p:layoutUnit position="center">
<h:form id="centerControl">
<ui:include src="/ui/#{amb.appToGet}.jsf"/>
</h:form>
</p:layoutUnit>
后台bean:
public void onNodeSelect(NodeSelectEvent event) throws Exception {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
try {
appToGet = appsMainDAO.appToGet(event.getTreeNode().toString());
// ec.redirect("index.jsf");
// System.out.println("Got "+appToGet);
// appSubList = appsMainDAO.appsSubServicesList(appToGet, "Forms");
} catch (Exception ex) {
ex.printStackTrace();
Logger.getLogger(appsMainBean.class.getName()).log(Level.SEVERE, null, ex);
} finally {
}
}
不要那样做。您正在以错误的方式使用JSF,从而导致重大灾难。
在这里解释整个生命周期是不可能的,但是—在您真正了解JSF之前—只要假设facelet页面不应该像HTML页面那样工作。
相反,它们应该像窗口应用程序一样工作,在那里你有一定数量的小部件,它们不会真正出现或消失——它们可以放在选项卡中,它们可以被禁用,但它们会保持在最初的位置。
如果要包含的内容数量有限,最简单的选择是将它们全部包含并添加一些渲染="#{gui;Current =='component1'}",因此只有一个组件可见。