是否可以在before-invokeApplication-phaselistener中获取对待执行的managedbean的引用?
在调用应用程序阶段之前,应该清楚哪个managedBean将执行该方法。
为了举例,假设有一个主要的管理bean来处理1个jsf页面。
所以我需要的基本上是:
为了实现第2点,我想要拦截其中一个阶段
我已经检查了有关在阶段实现中获取托管bean的API文档,但我似乎找不到任何内容。
输入这个问题之后,我意识到我可以在@PostConstruct或托管bean的构造函数中执行此操作,但这只会在第一次构造bean时执行,我需要在每次jsf生成时调用该方法从菜单中访问。
有什么建议吗?
的问候,
Albert Kam
答案 0 :(得分:3)
您可以通过ELContext / ELResolver访问您的托管bean。这在MyFaces wiki中很好地解释(也适用于vanilla JSF)。
例如:
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication()
.getELResolver().getValue(elContext, null, "neededBean");
有关其他JSF版本的进一步说明和实现,请参阅MyFaces wiki entry。
您使用@PostConstruct的想法很好。考虑将范围更改为喜欢@ViewScoped的内容,因此每次导航到该视图时都会执行逻辑。
另外,看一下PreRenderViewEvent(对于JSF 2)。此代码嵌入在facelet页面中:
<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}"/>
<f:event type="preRenderView" listener="#{bean.doSomething}"/>
</f:metadata>
f:事件侦听器在每个页面视图之前执行。