在我到达页面之前执行了preRenderView方法

时间:2012-05-13 19:57:46

标签: jsf-2

我在用于编辑'事件'

的页面中有这个
<f:metadata>
    <f:viewParam id="event_id" name="eventId" value="#{eventController.eventId}"/>
    <f:event type="preRenderView" listener="#{eventController.loadEvent}" />
</f:metadata>

...和我的“ViewScoped”bean中的相应loadEvent方法。

在“列出事件”页面中,用户可以选择要编辑的事件,我会建立这样的链接

<h:link value="Full details" outcome="/calendar/viewEvent" includeViewParams="true">
    <f:param name="eventId" value="#{calendarController.event.eventId}" />
</h:link>

我不希望在我点击某个链接之前调用loadEvent方法,但是当我访问“list events”页面时,它会被调用一次,而且只调用一次。

当然这是以某种方式归结为JSF生命周期......但为什么呢?

1 个答案:

答案 0 :(得分:3)

我也在使用Mojarra 2.1.10(我假设你也是Mojarra?)。该错误已经作为JAVASERVERFACES-2158提交,在撰写本文时没有修复或解决方法。问题是:在使用包含视图参数的UIOutcomeTargeth:link h:button组件进行渲染时执行抢先导航期间,目标视图将被编译为提取{来自f:viewParam元素的{1}} / UIViewParameter个组件。此编译还有一个副作用,即根据h:metadata元素在当前 UIViewRoot上设置事件订阅。在正常情况下 - 也就是在编译响应中返回给用户的视图时 - 这一切都很好。但是,当为了获取其视图参数而编译另一个视图时,在当前视图根目录上注册事件订阅(如在f:event中)则完全没有问题。