jsf2:访问托管bean';阶段侦听器对象中的实例?
是否可以在before invokeApplication phaselistener中获取对要执行的managedbean的引用 在调用应用程序阶段之前,应该清楚哪个managedBean将执行该方法 在本例中,假设有1个主管理bean来处理1个jsf页面 所以我需要的基本上是:jsf2:访问托管bean';阶段侦听器对象中的实例?,jsf,jsf-2,Jsf,Jsf 2,是否可以在before invokeApplication phaselistener中获取对要执行的managedbean的引用 在调用应用程序阶段之前,应该清楚哪个managedBean将执行该方法 在本例中,假设有1个主管理bean来处理1个jsf页面 所以我需要的基本上是: 用户可从菜单访问该程序 因为它是从菜单访问的,所以会调用主ManageBean的init()方法来初始化诸如准备数据、执行授权检查之类的工作 在从菜单重新访问init()方法之前,后续提交不再需要调用该方法 为了实现
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仍然在范围内(相同的请求)。我回答了如何做的问题,但我不主张这是最好的解决办法。我提供了似乎更适合实现最终目标的备选方案。