有没有办法在Java / Tomcat / JSP Web项目中附加到asp.net的“Application_Start”和“Begin_Request”等事件?我真的不想使用JSF或额外的框架(Spring,Struts)。我不希望在每页的基础上使用“jspInit”之类的东西来执行此操作,目标是全局事件处理程序。
如果我坚持使用.net方式,那么重点是拥有初始化IoC容器(Application_Start)的中心位置,并实现“每个请求一个数据库事务”工作流程(Begin_Request)。
感谢。
答案 0 :(得分:6)
在Java EE(Servlets + JSP)世界中,可以通过实现Java EE规范标准化的相关接口来获得等效功能。
Application概念的等价物是Web Context或Servlet context。会话和请求在Java EE中与.Net相同。需要实现相关的侦听器类才能挂钩
中的相关事件有关此内容的更多信息,请参阅Java EE 5 tutorial on the Servlet lifecycle。接口继续适用于Java EE 6。
如果您已阅读评论,您会注意到可以通过实施ServletRequestListener
或Filter
来对请求进行预处理和后处理。
我建议您使用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)
在会话中替换属性时调用。