是否可以在 before-invokeApplication-phaselistener 中获取对要执行的托管bean 的引用?
在调用应用程序阶段之前,应该明确哪个 ManagedBean 将执行该方法。
为了举例,假设有 1 个主管理 bean 来处理 1 个 jsf 页面。
所以我需要的基本上是:
- 用户从菜单访问程序
- 因为它是从菜单访问的,所以会调用主管理 bean 的 init() 方法来初始化诸如准备数据、执行授权检查之类的内容
- 后续提交不再需要调用 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/