如何在每个页面请求上调用bean方法

时间:2014-01-29 19:38:09

标签: jsf-2 jboss listener

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

3 个答案:

答案 0 :(得分:0)

您的问题的答案可以找到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.
}

答案 1 :(得分:0)

一种方法是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中设置正确的路径)。

答案 2 :(得分:0)

我解决了。起初我尝试过滤器,但它没有,因为在请求开始时调用过滤器,但那时FacesContext没有初始化,我需要因为我必须检索请求的URL。所以在那之后我尝试了阶段监听器,它的工作原理!在beforePhase()方法中,我监听PhaseId.RENDER_RESPONSE。谢谢大家的指导。