我是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获得),从我的“aTab”获取视图路径而不是硬编码,然后在我的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 with with render子句,硬编码。 非常流畅的解决方案,效果很好,可能允许在每个选项卡中包含动态内容,其中包含另一个c:foreach循环,以及支持bean中包含xhtml名称和布尔值的对列表(用于渲染)变得有点疯狂。)
答案 0 :(得分:0)
第一个选项,视图构建时间条件,在某些情况下可能会导致问题。例如。你不能在条件表达式中依赖f:param。
这听起来比第一个选项
更糟糕
情况并没有太糟糕。创建一堆组件并不是那么昂贵。
这不是一个黑白分明的事情,但我的一般建议是不进行优化,除非你确实遇到性能问题并且分析确认这是瓶颈(不太可能)。坚持使用rendered
最简单的路径。
对于Mojarra,您可以像这样配置日志记录:
<logger category="javax.enterprise.resource.webcontainer.jsf.timing">
<level name="DEBUG"/>
</logger>
然后,您将确切地了解构建视图的时间(还原视图JSF生命周期阶段)与逻辑和渲染(其他阶段)的比较:
19:47:57,026 DEBUG [timing](默认任务-3)[TIMING] - [ 7ms ]: 阶段的执行时间(包括任何PhaseListeners) - &gt; RESTORE_VIEW 1
...
19:47:57,198 DEBUG [计时](默认任务-3) [时间] - [ 172ms ]:阶段的执行时间(包括任何 PhaseListeners) - &gt; RENDER_RESPONSE 6