gpt4 book ai didi

JSF 2 : Accessing managed bean's instance in the phase listener object?

转载 作者:行者123 更新时间:2023-12-02 15:02:56 27 4
gpt4 key购买 nike

是否可以在 before-invokeApplication-phaselistener 中获取对要执行的托管bean 的引用?

在调用应用程序阶段之前,应该明确哪个 ManagedBean 将执行该方法。

为了举例,假设有 1 个主管理 bean 来处理 1 个 jsf 页面。

所以我需要的基本上是:

  1. 用户从菜单访问程序
  2. 因为它是从菜单访问的,所以会调用主管理 bean 的 init() 方法来初始化诸如准备数据、执行授权检查之类的内容
  3. 后续提交不再需要调用 init() 方法,直到从菜单重新访问它

为了实现第 2 点,我正在考虑拦截其中一个阶段

我已经检查了有关在阶段实现中获取托管 bean 的 API 文档,但我似乎找不到任何内容。

输入这个问题后,我意识到我可以在 @PostConstruct 或托管 bean 的构造函数中执行此操作,但这只会在第一次构造 bean 时执行,而我的需要是每次 jsf 运行时都调用该方法从菜单访问。

有什么建议吗?

问候,
金伟强

最佳答案

您可以通过 ELContext/ELResolver 访问托管 Bean。这在 MyFaces wiki 中有很好的解释。 (也适用于普通 JSF)。

例如:

ELContext elContext = FacesContext.getCurrentInstance().getELContext();
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication()
.getELResolver().getValue(elContext, null, "neededBean");

请参阅MyFaces wiki entry进一步的解释,以及其他 JSF 版本的实现。

你使用@PostConstruct的想法是一个很好的想法。考虑将您的范围更改为 @ViewScoped 之类的内容,以便每次您导航到该 View 时都会执行逻辑。

此外,请查看 PreRenderViewEvent (对于 JSF 2)。此代码嵌入在您的 Facelet 页面中:

<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}"/>
<f:event type="preRenderView" listener="#{bean.doSomething}"/>
</f:metadata>

f:event 监听器在每次页面 View 之前执行。

关于JSF 2 : Accessing managed bean's instance in the phase listener object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303912/

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