【问题标题】:Create a listener for all pages为所有页面创建监听器
【发布时间】:2015-03-31 03:27:36
【问题描述】:

我必须使用一些监听器类来监听所有页面。根据url,我必须拆分它并获取一些信息。

例如:

x.domain.com/$member

我想通过url获取成员名,获取以下bean并检索一些数据库信息。

所以,我创建了一个 PhaseListener 来完成这项工作,但并不是每次我需要它时都会调用它,例如在 404 错误的情况下。

我该如何继续?

非常感谢:)

PS:我使用的是 Glassfish 4.1。

【问题讨论】:

  • 据我所知,在 404 事件中不会调用任何侦听器或任何其他 JavaEE 应用程序组件。一旦 URL 出现,应用服务器不会让未匹配的请求继续进行无法匹配。剩下的就是标准的网络应用错误页面来处理你​​的 404
  • 感谢您的回复!所以我必须为自定义 404 错误页面调用我的侦听器并渲染一些合成。我怎么能实现呢?我的监听器在页面加载时被调用?

标签: jsf-2 listener


【解决方案1】:

使用映射到正常和错误页面请求的servlet filter

<filter-mapping>
    <filter-name>yourFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

在过滤器中,您可以检查是否存在以RequestDispatcher#ERROR_REQUEST_URI 为键的请求属性,它是否在错误页面上被触发。

String errorRequestURI = (String) request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);

if (errorRequestURI != null) {
    // Error page was triggered on the given URI.
}

【讨论】:

  • 谢谢BalusC,你是个传奇!我现在可以处理我的应用程序中的所有页面!但是告诉我,我怎样才能从 doFilter() 方法中获取 bean?我必须访问某些控制器中的方法,并且可以使用 PhaseListener 来完成。我在网上寻找答案,但我不明白一切。再次感谢。
  • @Inject 如果是@Named stackoverflow.com/q/2633112 是最简单的
  • 我已经弄清楚如何使用Inject方法,再次感谢您。我认为注入一些 EntityManager 来访问数据库是不安全的。我将不得不像你在这里提到的那样从 cookie 中获取 FacesContext:stackoverflow.com/questions/14045242/…
  • “从 cookie 中获取 FacesContext”?不知道我明白.. 你呢?至于注入实体管理器,只能在服务类(EJB)中进行,而不是在托管 bean 中。
  • 我的意思是您从上面的链接中回答的第二部分。由于缺乏对该主题的了解,我很难理解您的回答。我将在网上寻找以找到一些带有 EM 的注入。谢谢你的时间:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多