1

我正在使用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 相关,即View Scoped

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

有什么想法吗?

4

1 回答 1

6

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

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

也可以看看:

于 2012-12-21T14:54:02.267 回答