JSF 2 : Accessing managed bean's instance in the phase listener object?

标签 jsf jsf-2

是否可以在 before-invokeApplication-phaselistener 中获取对要执行的托管bean 的引用?

在调用应用程序阶段之前,应该明确哪个 ManagedBean 将执行该方法。

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

所以我需要的基本上是:

  1. 用户从菜单访问程序
  2. 因为它是从菜单访问的,所以会调用主管理 bean 的 init() 方法来初始化诸如准备数据、执行授权检查之类的内容
  3. 后续提交不再需要调用 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/

相关文章:

java - <p :lineChart> Tag Library supports namespace: http://primefaces. org/ui,但没有为名称定义标签:lineChart

java - 访问变量 EL 表达式中的嵌套属性

jsf - 如果目标 url 必须最初从服务器获取,如何使用 JSF 打开外部 url 的空白页面?

java - 如何创建模块化 JSF 2.0 应用程序?

用于 valueChangeListener 的 Ajax

使用 <ui :repeat> 进行 ajax 更新后 CSS 无法正确呈现

java - 以丰富的方式显示 bean 值 :popupPanel

java - 在 JSF 和 Richfaces 中处理过期的 ViewState

java - CommandLink 不在 jsf 表单中,因为我已将它添加到模板中。但是它被禁用了。有没有其他方法可以启用它?

java - 如何在 JSF 2.0 中创建自定义 404 消息?