JSF 2:在阶段监听器对象中访问托管bean的实例?

时间:2010-11-29 12:55:28

标签: jsf jsf-2

是否可以在before-invokeApplication-phaselistener中获取对待执行的managedbean的引用?

在调用应用程序阶段之前,应该清楚哪个managedBean将执行该方法。

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

所以我需要的基本上是:

  1. 用户从菜单
  2. 访问该程序
  3. 因为它是从菜单访问的,所以调用主管理bean的init()方法来初始化诸如准备数据,进行授权检查之类的东西
  4. 后续提交不再需要调用init()方法,直到从菜单中重新启动
  5. 为了实现第2点,我想要拦截其中一个阶段

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

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

    有什么建议吗?

    的问候,
    Albert Kam

1 个答案:

答案 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:事件侦听器在每个页面视图之前执行。