动态<ui:include src>根据<ui:repeat var>不包含任何内容

3
我是一名新手JSF开发者,正在研究动态渲染包含的页面。我的代码如下:

菜单Bean

@ViewScoped
public class MenuBean implements Serializable {

    private MenuItem[] menuItems = new MenuItem[] {
        new MenuItem("page_1", "/page_1.xhtml"),
        new MenuItem("page_2", "/page_2.xhtml"),
    };

    private String selectedItemLabel;

    //...
}

菜单项

public class MenuItem implements Serializable {

    private String label;
    private String page;

    //...
}

index.xhtml

    <ui:repeat var="menuItem" value="#{menuBean.menuItems}">                                    
        <h:panelGroup rendered="#{menuBean.selectedItemLabel eq menuItem.label}" layout="block">
            <h:outputText value="#{menuBean.selectedItemLabel}" />                              
            <ui:include src="#{menuItem.page}" />                                           
        </h:panelGroup>                                                                     
    </ui:repeat>                                                                            

结果是渲染了2个按钮。每当我点击任何一个按钮时,条件性渲染的面板组内的标签出现,但包含的页面却没有显示。如果我从第一个ui:repeat中更改'menuItem1'变量,则可以正常工作,但这真的很不可预测。例如,如果我将setSelectedItemLabel参数硬编码为'page_1',那么当我点击button_1时,page_1会显示,但是即使我点击button_2,page_2(!?)也会显示...

1个回答

5
您面临的问题是视图构建时间与视图渲染时间的问题。这实质上是一个已经在JSTL in JSF2 Facelets... makes sense?中详细回答过的相同问题。在那个答案中,将“JSTL”替换为“ui:include”。简言之,在视图渲染时,<ui:repeat>运行,而<ui:include>已经在视图构建时运行。
您会理解,唯一的解决方案是用另一个在视图构建时运行的标签替换<ui:repeat>,例如JSTL的<c:forEach>
请注意,我不能保证它能解决您心目中的具体功能要求。使用JSTL可能会产生不良“副作用”(但这些副作用可以解释、理解和解决)。
另请参见:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接