像.net的java / tomcat / JSP的“Application_Start”和“Begin_Request”这样的事件?

时间:2010-09-07 23:36:49

标签: java jsp tomcat servlets page-lifecycle

有没有办法在Java / Tomcat / JSP Web项目中附加到asp.net的“Application_Start”和“Begin_Request”等事件?我真的不想使用JSF或额外的框架(Spring,Struts)。我不希望在每页的基础上使用“jspInit”之类的东西来执行此操作,目标是全局事件处理程序。

如果我坚持使用.net方式,那么重点是拥有初始化IoC容器(Application_Start)的中心位置,并实现“每个请求一个数据库事务”工作流程(Begin_Request)。

感谢。

5 个答案:

答案 0 :(得分:6)

在Java EE(Servlets + JSP)世界中,可以通过实现Java EE规范标准化的相关接口来获得等效功能。

Application概念的等价物是Web Context或Servlet context。会话和请求在Java EE中与.Net相同。需要实现相关的侦听器类才能挂钩

中的相关事件
  • 应用程序的生命周期( ServletContextListener ServletContextAttributeListener ),
  • 应用程序提供的请求( ServletRequestListener ServletRequestAttributeListener )或
  • 由相同的会话建立的会话( HttpSessionListener HttpSessionActivationListener )。

有关此内容的更多信息,请参阅Java EE 5 tutorial on the Servlet lifecycle。接口继续适用于Java EE 6

过滤器与ServletRequestListener

如果您已阅读评论,您会注意到可以通过实施ServletRequestListenerFilter来对请求进行预处理和后处理。

我建议您使用Filter s(和BalusC一样)。这是因为每次将请求发送到特定URL时都会调用Filter,这通常是确保对URL的所有请求都获得相同“处理”的最有效方法。

可以在ServletRequestListener上的Java EE API文档中找到原因:

  

接收通知的界面   有关请求进入和的事件   超出网络范围   应用

     

ServletRequest被定义为即将到来   进入Web应用程序的范围时   它即将进入第一个servlet   或过滤Web应用程序,和   因为它退出范围,因为它退出了   最后一个servlet或第一个过滤器   链条。

当您使用ServletRequestListener时,您必须注意每个请求仅触发 requestInitialized requestDestroyed 事件一次(与Filter不同每次在处理管道中调用Filter时,都会调用 doFilter 方法。由于过滤器是在请求之前和之后执行操作的常用方法(我没有看到很多人使用ServletRequestListeners),我建议您在这样的上下文中使用过滤器。

答案 1 :(得分:1)

用于处理请求的

http://download.oracle.com/javaee/5/api/javax/servlet/Filter.html

我认为,如果您研究可以解决许多问题的框架,最终您将获得更好的运气和更易于维护的代码

答案 2 :(得分:1)

要在“应用程序启动”中执行某些操作,您需要实现ServletContextListener。它是标准servlet API的一部分。正如其他人已经提到的那样,您可以在“过滤器链”中实现一个或多个过滤器,以便在servlet处理每个传入请求之前进行特殊处理。

答案 3 :(得分:1)

Servlet API中有“类似”事件(事件不是最好的词)。对于应用程序启动,您应该使用Context侦听器 http://download.oracle.com/javaee/5/api/javax/servlet/ServletContextListener.html
并要求: http://download.oracle.com/javaee/5/api/javax/servlet/ServletRequestListener.html

答案 4 :(得分:1)

Servlets为您解决这个问题提供了更多帮助。在Java世界中,事件称为侦听器。有一些有用的听众:

<强> javax.servlet.ServletContextListener

void contextDestroyed(ServletContextEvent sce)当servlet上下文即将被销毁时调用。

void contextInitialized(ServletContextEvent sce)在Web应用程序准备好处理请求时调用。

<强> javax.servlet.ServletContextAttributeListener

void attributeAdded(ServletContextAttributeEvent scae)在将新属性添加到servlet上下文时调用。

void attributeRemoved(ServletContextAttributeEvent scae)从servlet上下文中删除属性时调用。

void attributeReplaced(ServletContextAttributeEvent scae)在替换servlet上下文的属性时调用。

<强> javax.servlet.http.HttpSessionListener

void sessionCreated(HttpSessionEvent se)创建会话时调用。

void sessionDestroyed(HttpSessionEvent se)会话失效时调用。

<强> javax.servlet.http.HttpSessionAttributeListener

void attributeAdded(HttpSessionBindingEvent se)将属性添加到会话时调用。

void attributeRemoved(HttpSessionBindingEvent se)从会话中删除属性时调用。

void attributeReplaced(HttpSessionBindingEvent se)在会话中替换属性时调用。