我是JSF的新手,我想了解如何以最佳方式实现我需要的建议 . 也是StackOverflow的第一篇文章,所以如果我不清楚某些事情,请原谅 .
我有一个带有动态数量的选项卡的p:tabView,使用c:foreach以下面的方式生成,带有视图范围的辅助bean .
<p:tabView id="tabViewId">
<c:forEach items="#{controller.list}" var="aTab">
<p:tab title="#{aTab.label}">
<ui:include src="#{aTab.firstUrl}"/>
</p:tab>
</c:forEach>
</p:tabView>
这很有效,我很满意 . 现在问题是我的每个选项卡都有两个可能的视图,当某个事件被触发时(在其中一个视图中单击了ap:commandLink)我想将选项卡中显示的内容更改为该选项卡的另一个视图具有;换句话说,我想用ui:include更改选项卡内加载的src视图 . 我试图在控制器中与此commandLink关联的方法中返回我想要的视图路径,但正如预期的那样,它会重定向到新页面而不是将其加载到选项卡中 .
我想在切换选项卡内容(我的控制器是视图范围)时保持相同的控制器实例,并避免绑定 .
我有两种选择 .
首先尝试类似于此的东西(从primefaces tabView different tab content with dynamic tabs获取),从我的_2595699获取视图路径而不是硬编码,然后在更改在两个页面之间切换的布尔值后尝试更新我的commandLink上的选项卡或整个tabView在控制器中:
<ui:include
src="#{curSearch.closeable ? '/sections/search/searchInstanceTab.xhtml' : '/sections/search/firstSearchTab.xhtml'}">
</ui:include>
第二个是在每个选项卡中包含两个页面,但只使用控制器中的布尔值来渲染一个页面 . 这听起来比第一个选项更糟糕(它在我之前链接的问题中被建议作为答案) .
在此先感谢,请随时建议更轻松/更好的方式 .
:::编辑:::
最后确实选择将每个选项卡放在一个单独的xhtml文件中(加载c:foreach循环),并在每个xhtml / tab中包含所有可能的视图(也在单独的xhtmls中)ui:include'd with rendered子,硬编码 . 非常流畅的解决方案,效果很好,可能允许在每个选项卡中包含动态内容,其中包含另一个c:foreach循环,以及支持bean中包含xhtml名称和布尔值的对列表(用于渲染)变得有点疯狂) .
1 回答
第一个选项,即视图构建时间条件,在某些情况下可能会导致问题 . 例如 . 你将无法在条件表达式中依赖f:param .
这并没有太糟糕 . 创建一堆组件并不是那么昂贵 .
这不是一个黑白分明的事情,但我的一般建议是不进行优化,除非你确实遇到性能问题并且分析确认这是瓶颈(不太可能) . 坚持最简单的路径,即使用
rendered
.对于Mojarra,您可以像这样配置日志记录:
然后,您将看到构建视图的确切时间(还原视图JSF生命周期阶段)与逻辑和渲染(其他阶段)相比: