我有一个页面,我想要包含页面的一部分(在此实例中为页脚),这取决于从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
?
答案 0 :(得分:3)
<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
。