4

我有一个页面,我想根据视图参数给出的值包含页面的一部分(在本例中为页脚)。

ViewScoped在 preRenderView 上初始化了我的支持 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:includeh:outputText.

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

问题仍然存在。我怎样才能完成这样的事情。让 bean 使用 viewParam,查询数据库并在 a 中使用该值ui:include

4

2 回答 2

3

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

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

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

@PostConstruct
public void init() {
    // ...
}
于 2012-10-04T14:26:15.320 回答
1

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

如果您使用 a<ui:include value="#{myBean.myViewId}" />动态切换包含,则不能使用 PreRenderView 事件侦听器来设置myViewId.myBean

如果您需要这样做,请使用<f:phaseListener>.

于 2012-10-04T14:09:27.493 回答