[英]Partial rendering JSF components
通過包含不同的源文件(帶有面板和組件)來討論如何部分渲染(div)。 取決於菜單操作。 如果正確理解 JSF 階段,則在最后一個階段Render Response期間重建視圖。 如果我有事件和動作,它們將在調用應用程序階段(之前的階段)被調用。
我要做的就是在重新渲染視圖之前通過 ajax 為特定菜單命令設置包含 xhtml 頁面。 但是ui:include總是在菜單操作之前被調用。 我嘗試過使用richfaces 4(a4j:param、rich:panel 等)和標准 JSF 2.0(f:param, h:panelGroup)組件,但ui:include總是在操作之前被調用。
在調用ui:include之前,我應該如何處理菜單操作(設置包含頁面)?
PS。 這必須是標准模式,而不是包含 static 內容。 但是我在網上找到的例子很少?!
菜單.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;
}
布局客戶端.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>
..
您還必須有一個模板頁面,因為您要在layoutClient.xhtml
中定義頂部和內容,所以我認為您試圖對layoutClient.xhtml
頁面過於籠統,因為它似乎也可以用作模板。 假設您的模板頁面名為template.xhtml
。 您逃避的標准模式是使您的模板頁面如下所示:
...
<ui:insert name="top">
<ui:include src="/resources/viewComponents/menuTop.xhtml"/>
</ui:insert>
...
<ui:insert name="content" />
...
這意味着您的所有頁面都包含位於“頂部”的菜單(默認情況下,它們可以覆蓋此菜單)並且它們必須指定自己的內容,這是有道理的。
現在,與其嘗試制作像layoutClient.xhtml
這樣的頁面來確定插入哪些內容,不如像這樣單獨創建每個頁面:
<ui:composition template="template.xhtml">
...
<ui:define name="content">
<p>This is a page that defines some content and also includes my menu that it inherits from template.xhtml</p>
</ui:define>
...
</ui:composition>
<ui:composition template="template.xhtml">
...
<ui:define name="content">
<p>This is another page that defines some content and also includes my menu that it inherits from template.xhtml</p>
</ui:define>
...
</ui:composition>
這兩個頁面都繼承了您的菜單並將內容放在適當的位置。
使用這種配置,您的menuAction()
方法需要做的就是返回指向page1.xhtml
或page2.xhtml
的鏈接。 此外,您不需要任何復雜的參數使用或手動調用renderResponse()
或a4j:param
標簽!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.