动态<ui:include src =“”>取决于<ui:repeat var =“”>不包含任何内容</ui:repeat> </ui:include>

时间:2013-02-16 23:52:12

标签: jsf dynamic jsf-2 uirepeat uiinclude

我是JSF的新手,我正在努力使用动态渲染包含的页面。我的代码如下所示:

MenuBean使用

@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个按钮。每当我单击任何按钮时,条件状态内呈现的panelGroup会出现但是包含的页面没有。如果我从第一个ui更改'menuItem1'var:重复它可以工作,但它确实是不可预测的。例如,如果我将setSelectedItemLabel参数硬编码为'page_1',那么当我点击button_1 page_1时,即使我点击了button_2 page_2(!?),也会显示...

1 个答案:

答案 0 :(得分:4)

您正面临视图构建时间与视图渲染时间问题。这基本上是同样的问题,已在JSTL in JSF2 Facelets... makes sense?中详细解答。在该答案中,将“JSTL”替换为“ui:include”。到目前为止,<ui:repeat>在视图渲染时运行,而<ui:include>在视图构建时间之前已经运行。

您将理解唯一的解决方案是将<ui:repeat>替换为在视图构建期间运行的另一个标记,例如JSTL <c:forEach>

请注意,我不保证它会解决您考虑的具体功能要求。使用JSTL可能会产生不良的“副作用”(但这些副作用是可以解释的,可理解的并且可以解决)。

另见: