ui:include依赖于viewParam

时间:2012-10-04 14:03:28

标签: java jsf jsf-2 viewparams

我有一个页面,我想要包含页面的一部分(在此实例中为页脚),这取决于从view参数给出的值。

我在preRenderView上初始化了ViewScoped支持bean

<f:metadata>
    <f:viewParam name="racecode" value="#{displayResults.racecode}" />
    <f:event type="preRenderView" listener="#{displayResults.init}" />  
</f:metadata>

这将查询数据库以获取要包含的页脚的名称。然后,以这种方式使用:

<h:panelGroup id="customFooter" display="block">
    <ui:include src="#{displayResults.customFooter}" />
</h:panelGroup>

这总是给我一个缺页。但是如果我手动输入页面名称就可以了。如果我将ui:include替换为h:outputText,则相同。

我知道它与JSF的各个阶段有关,并且在ui:include完成时,该值尚未设置。 (阅读和更好地理解阶段是我的TODO列表中的内容)。

问题仍然存在。我怎样才能完成某些事情。让bean使用viewParam,查询数据库并在ui:include

中使用该值

2 个答案:

答案 0 :(得分:3)

@wemu已经解释了原因。在调用<ui:include src>方法之前评估init()。然而,他提议的<f:phaseListener>解决方案很笨拙。

只需在@ManagedProperty bean上使用@PostConstruct / @RequestScoped

@ManagedProperty("#{param.racecode}")
private String racecode;

@PostConstruct
public void init() {
    // ...
}

答案 1 :(得分:1)

在调用TagHandler之后,在渲染组件之前,在RenderResponsePhase中调用PreRenderView侦听器。这意味着TagHandlers不会在PreRenderView事件中看到初始化的数据。

如果使用<ui:include value="#{myBean.myViewId}" />动态切换包含,则无法使用PreRenderView事件侦听器设置myViewId的{​​{1}}属性。

如果您需要使用myBean