jsf2:访问托管bean';阶段侦听器对象中的实例?

jsf2:访问托管bean';阶段侦听器对象中的实例?,jsf,jsf-2,Jsf,Jsf 2,是否可以在before invokeApplication phaselistener中获取对要执行的managedbean的引用 在调用应用程序阶段之前,应该清楚哪个managedBean将执行该方法 在本例中,假设有1个主管理bean来处理1个jsf页面 所以我需要的基本上是: 用户可从菜单访问该程序 因为它是从菜单访问的,所以会调用主ManageBean的init()方法来初始化诸如准备数据、执行授权检查之类的工作 在从菜单重新访问init()方法之前,后续提交不再需要调用该方法 为了实现

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

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

在本例中,假设有1个主管理bean来处理1个jsf页面

所以我需要的基本上是:

  • 用户可从菜单访问该程序
  • 因为它是从菜单访问的,所以会调用主ManageBean的init()方法来初始化诸如准备数据、执行授权检查之类的工作
  • 在从菜单重新访问init()方法之前,后续提交不再需要调用该方法
  • 为了实现第2点,我想拦截其中一个阶段

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

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

    有什么建议吗

    问候,

    Albert Kam

    您可以通过ELContext/ELResolver访问托管bean。这在中得到了很好的解释(也适用于香草JSF)

    例如:

    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication()
        .getELResolver().getValue(elContext, null, "neededBean");
    
    有关更多说明,请参见,其他JSF版本的实现请参见

    您使用@PostConstruct的想法很好。考虑将您的范围更改为“@ VIEW”,因此每次导航到该视图时都要执行逻辑。 另外,请看一下(对于JSF2)。此代码嵌入到facelet页面中:

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

    f:event侦听器在每个页面视图之前执行。

    我看不出它如何准确返回操作方法中涉及的实例。您的方法要求预先知道bean名称。顺便说一下,我更喜欢速记而不是
    ELResolver/ELContext
    。另请参见。如果他的阶段侦听器正在调用前应用程序阶段侦听,那么阶段侦听器将实例化对象实例。这个实例将在应用程序方法(在调用应用程序阶段被调用)中引用,因为托管be仍然在范围内(相同的请求)。我回答了如何做的问题,但我不主张这是最好的解决办法。我提供了似乎更适合实现最终目标的备选方案。