背景 - 我正在开发一个使用JSP作为视图技术的遗留JSF应用程序。既然我们已经决定转向JSF 2.2 / 2.3,那么我们也将JSP页面更改为facelets。
问题 - 我们有以下模板 - Layout.xhtml - 包含如下布局 -
<ui:insert name="header"></ui:insert>
<ui:insert name="body"></ui:insert>
<ui:insert name="footer"></ui:insert>
以下是示例文件(例如,index.xhtml) -
<ui:composition template="/layout.xhtml">
<ui:define name="header"><h1>Sample Header</h1></ui:define>
<ui:define name="body"><ui:include src="/searchRecord.xhtml"></ui:define>
<ui:define name="footer"><h3>Sample foorter</h3></ui:define>
</ui:compositio>
问题是 - 所有页面的页眉和页脚都是相同的,但是主体会有所不同。即,首次启动应用程序时,将显示searchRecord页面。用户输入信息后,需要显示数据。在此页面上,如果用户按下退出,则正文应包含退出页面。如果按了previous,则会再次显示searchRecord页面。
简而言之,我正在寻找包含动态<ui:include>
的方法。否则,我必须为每个操作创建3-4个xhtml页面。
研究 -
我经历了几个问题 -
<ui:include> with dynamic src ... complete madness
但似乎没有什么能解决我的问题。当我使用如下 -
<ui:fragment rendered="#{bean.searchRecord}>
<ui:include src="/searchRecord.xhtml">
</ui:fragment>
<ui:fragment rendered="#{bean.showDetails}>
<ui:include src="/showdetails.xhtml">
</ui:fragment>
<ui:fragment rendered="#{bean.exit}">
<ui:include src="/exit.xhtml">
</ui:fragment>
首先,由于未初始化bean,我在启动第一页时遇到了困难。我试图通过使用初始化bean并设置标志的<f:event type="preRenderComponent">
来解决这个问题。它解决了启动问题,我正确地获得了searchRecord页面。但是当我现在点击show details按钮时,要么它保持在同一页面上,要么它转到showDetails页面(使用postback()方法),细节不会显示(即不调用showDetails bean)。
有人可以指导我如何实现如上所述的动态布局吗?