gpt4 book ai didi

events - JSF f :event preRenderView in template f:metadata, 每次访问页面时都不会调用监听器

转载 作者:行者123 更新时间:2023-12-02 06:41:26 24 4
gpt4 key购买 nike

Mojarra-2.1.3 按照 Glassfish3.1.1(与 Netbeans7.1 一起分发)

我有一个 @SessionScoped 支持 bean 跟踪器,带有一个监听器 void reset()。

以下内容在使用 template.xhtml 的所有 XHTML 页面的 f:metadata 中运行良好,例如/block/view.xhtml,它也采用查询参数 id:

<f:view>
<f:metadata>
<f:viewParam name="id" value="#{blockManager.id}"/>
<f:event type="preRenderView" listener="#{tracker.reset}"/>
</f:metadata>
</f:view>

<ui:composition template="/template.xhtml">

正如预期的那样,每当我加载 (GET) 或重新加载页面时,无论 id 查询参数是什么,都会调用 #{tracker.reset} 监听器(如调试日志记录所示)。

但是,必须在每个 XHTML 页面(我有数百个)中包含该 f:event 是很乏味的,我首先尝试将其放在 template.xhtml 的 f:metadata 中。但当我这样做时,奇怪的事情发生了。它只调用了 #{tracker.reset} 一次,第一次加载/block/view.xhtml 时(无论 id 查询参数是什么),此后它不会再次调用,直到我加载另一个具有不同 viewId 的页面,例如/actor/view.xhtml、/block/list.xhtml 或/index.html。

我在 template.xhtml 中使用 #{facesContext.viewRoot.viewId} 检查了 viewId。从viewId的角度可以明显看出,查询参数id对于区分不同的block/view.xhtml?id=[id]页面使用不同的id查询参数调用没有起到任何作用,viewId始终只是'/block/view.xhtml'。

在撰写这篇 stackoverflow 帖子期间,我发现了问题的解决方案:只需将 f:event 放在 template.xhtml 的 f:metadata 之外(我在 template.xhtml 中使用 f:metadata 进行分组) f:事件)。这适用于 template.xhtml:

<f:metadata>
..
</f:metadata>
<f:event type="preRenderView" listener="#{tracker.reset}"/>
<h:head>

但我还有以下问题:

问:为什么我是否将 f:event 放置在模板的 f:metadata 内会产生影响?

我问的原因是 Stackoverflow 上有很多在 template.xhtml 中使用 f:metadata 的示例,以及在模板中的 f:metadata 内使用 f:event 的示例。

BalusC 状态为 When to use f:viewAction / preRenderView versus PostConstruct? :

The preRenderView event is invoked on every HTTP request.

只有当我在最终 XHTML 页面的 f:metadata 中或在模板的 f:metadata 之外但不在 f: 内部有 preRenderView f:event 时,这才似乎是正确的(按预期工作)模板的元数据。

对于是否应该在模板的 f:metadata 中包含 f:event,还是在模板中使用 f:metadata,似乎存在一些争论。

JSF2 完整引用(Burns 和 Schalk)第 540 页指出:

The f:metadata tag encapsulates the set of elements used to specify the metadata for a Facelets view, and therefore must be the child of the f:view tag and may not appear in a template. As of JSF2.0, the only purpose of this tag is to encapsulate f:viewParam tags.

但是 Stackoverflow 上有很多在模板内使用 f:metadata 的示例,并且有很多在 f:metadata 内使用 f:event 的示例。这里也讨论了:

Does it matter whether place f:event inside f:metadata or not?

BalusC 的帮助解释:

.. the <f:event> is not strictly required to be placed inside <f:metadata>. It can be attached to any component. .. It's indeed for pure self-documentary purposes placed inside the <f:metadata> whenever you have a bunch of <f:viewParam>s and would like to hook a <f:event> to invoke an action after all those view parameters have been set. ..

但是我上面的经验表明,将 f:event 放置在模板的 f:metadata 中会产生稍微不同(奇怪)的行为。为什么?

最佳答案

<f:metadata>本身只能在模板客户端中使用,不能在主模板中使用。 IE。它必须在您实际通过 URL 请求的页面中声明,而不是在 <ui:composition template> 后面的页面内声明。 ,否则它将被忽略。此特定限制与 <f:event> 无关。 .

另请参阅:

关于events - JSF f :event preRenderView in template f:metadata, 每次访问页面时都不会调用监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11069484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com