3

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

菜单豆

@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;

    //...
}

索引.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:repeat 更改 'menuItem1' var,它会起作用,但它确实是不可预测的。例如,如果我将 setSelectedItemLabel 参数硬编码为“page_1”,那么当我点击 button_1 时会显示 page_1,但即使我点击 button_2 page_2 (!?) 也会显示...

4

1 回答 1

5

您正面临视图构建时间与视图渲染时间的问题。这本质上与已在 JSF2 Facelets 中的 JSTL 中详细回答的问题相同......有意义吗?在该答案中,将“JSTL”替换为“ui:include”。到目前为止,<ui:repeat>在视图渲染期间运行,而<ui:include>之前已经在视图构建期间运行。

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

请注意,我不保证它会解决您想到的具体功能要求。使用 JSTL 可能会产生不希望的“副作用”(不过这些副作用是可以解释的、可以理解的和可以解决的)。

也可以看看:

于 2013-02-17T03:13:04.693 回答