簡體   English   中英

部分渲染 JSF 組件

[英]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 您逃避的標准模式是使您的模板頁面如下所示:

模板.xhtml

...
<ui:insert name="top">
    <ui:include src="/resources/viewComponents/menuTop.xhtml"/>
</ui:insert>
...
<ui:insert name="content" />
...

這意味着您的所有頁面都包含位於“頂部”的菜單(默認情況下,它們可以覆蓋此菜單)並且它們必須指定自己的內容,這是有道理的。

現在,與其嘗試制作像layoutClient.xhtml這樣的頁面來確定插入哪些內容,不如像這樣單獨創建每個頁面:

page1.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>

page2.xhtml

<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.xhtmlpage2.xhtml的鏈接。 此外,您不需要任何復雜的參數使用或手動調用renderResponse()a4j:param標簽!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM