JSF ui:include无法正确呈现


问题内容

我正在使用 JSF 2.1.8 实现Web应用程序,而 ui:include 标记存在问题。我有这个代码

<h:panelGroup id="panelContenido">

        <ui:fragment rendered="#{!empty navigationManagerSystem._Navegable}">
            <ui:include src="#{navigationManagerSystem._Navegable._IncludePath}" />

        </ui:fragment>
        <ui:fragment rendered="#{empty navigationManagerSystem._Navegable}">
            <ui:include src="/system/navigation/error.xhtml" />
        </ui:fragment>
    </h:panelGroup>

navigationManagerSystem
bean是JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容。如果我以这样的常量执行此操作,则包括这些工作,<ui:include /system/home/index.xhtml" />但是如果我将其放入变量中则不行,即使我已经看到变量在屏幕打印之前就保持了该值。我不知道它是否可以与包含/system/home/index.xhtml页面(即
View Scoped) 的bean相关。

无论如何,如果我在页面渲染后立即刷新页面,则正确包含了xthml。顺便说一句,我简化了要包含的页面,以使其没有任何jstl标记,因为我知道它们会导致View
Scope问题。

有什么想法吗?


问题答案:

关于问题的原因,<ui:include>在视图构建时间(还原视图阶段)中运行,而不是在您期望的视图渲染时间(渲染响应阶段)中运行。因此,如果包含路径在例如调用操作阶段甚至渲染响应阶段发生更改,那么除非将其完全重建,否则它将不会反映在视图中。

当前,最好的选择是使用多个静态<ui:include>标签,每个标签在视图渲染期间有条件地渲染。没错,这最终导致不必要的大组件树。对于此问题,仍然没有“圣杯”解决方案。可以清楚地理解问题,但是鉴于JSF
/
Facelets生命周期,解决方案很难。我也为OmniFaces进行了一些实验,但是最简单的尝试在MyFaces中失败了,而在Mojarra中(一定程度上)起作用了。