【发布时间】:2011-09-03 06:44:34
【问题描述】:
通过包含不同的源文件(带有面板和组件)来讨论如何部分渲染(div)。取决于菜单操作。如果正确理解 JSF 阶段,View 将在最后一个阶段 Render Response 期间重建。如果我有事件和动作,它们将在 Invoke Application 阶段(之前的阶段)被调用。
我要做的就是在重新渲染视图之前通过 ajax 为特定菜单命令设置包含 xhtml 页面。但是 ui:include 总是在菜单操作之前被调用。我尝试过使用richfaces 4(a4j:param、rich:panel 等)和标准 JSF 2.0(f:param、h:panelGroup)组件,但是 ui:include 总是在之前被调用行动。
在调用 ui:include 之前,我应该如何处理菜单 action(设置包含页面)?
PS。这必须是标准模式,而不是包含静态内容。但是我在网上找到的例子很少?!
Menu.xhtml
<rich:toolbar itemSeparator="line">
...
<rich:dropDownMenu mode="ajax">
<f:facet name="label">
<h:panelGroup>
<h:outputText value="Menu 1" />
</h:panelGroup>
</f:facet>
<rich:menuItem id="newActivityMenu" action="#{navigationBean.menuAction}" render="content" label="New">
<a4j:param id="newActivityParam" name="includeContentPage" value="/user/Create.xhtml" />
</rich:menuItem>
...
NavigationBean.Java
@ManagedBean
@RequestScoped
public class NavigationBean {
public String menuAction() {
String param = JsfUtil.getRequestParameter("includeContentPage");
this.includedContentPage = param;
JsfUtil.log(this, "Including Content Page : " +param);
FacesContext.getCurrentInstance().renderResponse();
return "";
}
public String getIncludedContentPage() {
if(includedContentPage == null)
return "";
else if(!includedContentPage.endsWith(".xhtml"))
includedContentPage += ".xhtml";
JsfUtil.log(this, "Get Content Page : " +includedContentPage);
return includedContentPage;
}
layoutClient.xhtml
...
<ui:define name="top">
<ui:include src="/resources/viewComponents/menuTop.xhtml"/>
</ui:define>
<ui:define name="content">
<ui:include src="#{navigationBean.includedContentPage}"/>
</ui:define>
...
masterLayout.xhtml(已添加)
...
<h:body>
<div id="top" >
<ui:insert name="top">Top Default</ui:insert>
</div>
<div id="left">
<ui:insert name="left">Left Default</ui:insert>
</div>
<ui:insert name="content">Content Default</ui:insert>
</h:body>
..
【问题讨论】:
-
实际上,ui:include 标记是为页面上的其他 ajax 操作(不是菜单操作)调用的,我没有显式呈现“内容”div。