JSF ui:包括未正确呈现

时间:2012-12-21 13:20:15

标签: java jsf-2 facelets

我正在使用 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页面的bean有关,这是查看Scoped

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

有任何想法吗?

1 个答案:

答案 0 :(得分:5)

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

目前,您最好的选择是使用多个静态<ui:include>标记,这些标记在视图渲染时间内有条件地呈现。没错,最终会产生一个不必要的大型组件树。对于这个问题,仍然没有“圣杯”解决方案。问题已被清楚地理解,但考虑到JSF / Facelets生命周期,解决方案很难。我也为OmniFaces做了一些实验,但是最简单的尝试在MyFaces中很难在Mojarra中工作(在某种程度上)。

另见: