【问题标题】:How to call bean method on every page request如何在每个页面请求上调用 bean 方法
【发布时间】:2014-01-29 19:38:08
【问题描述】:

在我的工作中,我们开发了一个 JSF 2 应用程序。而且我需要使用一种方法创建一个侦听器 bean,该方法必须在每个页面请求上执行。如何完成这项任务?

【问题讨论】:

  • 更具体的要求,也许你根本不需要 bean
  • 您可以为此实现filter
  • @Vasil Lukach,如何实现过滤器?
  • 您究竟需要执行什么?根据这一点,您可以使用过滤器或 PhaseListener。如何做到这一点完全取决于您的方法要求。
  • 方法有很多。请说明具体的功能要求,以便提出正确的方法。你到底想解决什么问题?

标签: jsf-2 jboss listener


【解决方案1】:

您的问题的答案可以在here找到。

这个方法很关键:

public void beforePhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        // Do here your job which should run right before the RENDER_RESPONSE.
    }
}

在这里,您可以对每个生命周期阶段做出反应,并在所需的 PhaseId 中调用您的适当函数。希望对你有帮助。

我看到您使用 JSF 2,您也可以使用以下方法:

在你的 xhtml 页面中使用它:

<f:event type="preRenderView" listener="#{bean.preRenderView}" />

并在您的 bean 中调用适当的方法:

public void preRenderView() {
    // Do here your job which should run right before the RENDER_RESPONSE.
}

【讨论】:

  • 这就是问题“如何实现在生命周期结束时运行的 PhaseListener?” 这不一定与 “如何调用相同的问题”的答案每个页面请求上的 bean 方法”。即使那样,如果该答案适用,您最好投票赞成 close as duplicate 而不是公然复制粘贴其他人的答案。
  • @BalusC 当然这不是同一个问题,但它可以在 bean 中使用。正如您在回答中提到的那样,preRenderView 方法也可以满足他的需求
【解决方案2】:

一种方法是filter。创建类:

public class MonitoringFilter implements Filter {
    @Override
    public void doFilter(ServletRequest _request, ServletResponse _response,
        FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)_request;
        HttpServletResponse response = (HttpServletResponse)_response;

        // your code here
        chain.doFilter(_request, _response);
    }
}

web.xml中注册:

  <filter>
    <filter-name>monitoringFilter</filter-name>
    <filter-class>xyz.MonitoringFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>monitoringFilter</filter-name>
    <url-pattern>/*.jsf</url-pattern>
  </filter-mapping>

(在 url-pattern 中设置正确的路径)。

【讨论】:

    【解决方案3】:

    我解决了。起初我尝试使用过滤器,但它没有,因为过滤器在请求开始时被调用,但当时 FacesContext 没有初始化,我需要,因为我必须检索请求的 url。所以在那之后我尝试了相位监听器并且它有效!在 beforePhase() 方法中,我监听 PhaseId.RENDER_RESPONSE。谢谢大家的指导。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-24
      • 2023-03-28
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2015-01-10
      相关资源
      最近更新 更多