svo*_*l13 3 jsf dynamic jsf-2 uirepeat uiinclude
我是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;
//...
}
Run Code Online (Sandbox Code Playgroud)
菜单项
public class MenuItem implements Serializable {
private String label;
private String page;
//...
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
结果是渲染了2个按钮。每当我单击任何按钮时,都有条件渲染的panelGroup内部的标签会出现,但包含的页面却不会。如果我从第一个ui:repeat更改'menuItem1'var,它可以工作,但实际上是不可预测的。例如,如果我将setSelectedItemLabel参数硬编码为“ page_1”,则当我单击按钮_1时,将显示page_1,即使单击按钮_2,也会显示page_2(!?)。
您面临着视图构建时间与视图渲染时间的问题。这本质上是相同的问题,已经在JSF2 Facelets的JSTL中得到了详细解答...有意义吗?在该答案中,将“ JSTL”替换为“ ui:include”。到目前为止,<ui:repeat>在视图渲染期间运行,而<ui:include>之前在视图构建期间已经运行。
您将了解,唯一的解决方案是将其替换为<ui:repeat>在视图构建期间运行的另一个标签,例如JSTL <c:forEach>。
请注意,我不保证它将解决您所想到的具体功能要求。使用JSTL可能会产生不良的“副作用”(但是,这些副作用是可以解释,可理解和可解决的)。
| 归档时间: |
|
| 查看次数: |
3466 次 |
| 最近记录: |