前言
Servlet三大域对象的应用 request、session、application(ServletContext)
ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。
request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。
获取servletcontext对象:
1 | ServletContext sc = null; |
还有一种方法,通过ServletContextListener获得:
1 | public class MySCListener1 implements ServletContextListener { |
拓展:JavaEE中常见的***和事件
Servlet和JSP提供Listener接口8个,Event类6个
Listener**接口** | Event**类** |
---|---|
ServletContextListener | ServletContextEvent(上下文事件) |
ServletContextAtrributeListener | ServletContextAttributeEvent(上下文属性事件) |
HttpSessionListener | HttpSessionEvent |
HttpSessionActivationListener | |
HttpSessionAttributeListener | HttpSessionBindingEvent(会话绑定事件) |
HttpSessionBindingListener | |
ServletRequestListener | ServletRequestEvent |
ServletRequestAttributeListener | ServletRequestAttributeEvent |
一般来说也就是围绕着之前说的三大域对象:Request、Session、ServlerContext来进行的
源码级别了解ServletContextListener
类头注释
1 | /** |
意思很简单,就是说实现这个接口的类将会接收到servlet context的一些changes,也就是改变,为了能够接收到这些改变,必须实现这些对应的方法(废话)。
类中函数
1 | /** |
contextInitialized:
在web引用初始化的时候就启动了servlet context,也就是在servlet context初始化的时候调用了这个函数,我们可以在这里做一些项目初始化的操作,当然需要注意这些操作会占用长期的系统资源,谨慎使用
contextDestoryed:
在servlet context在将要关闭的时候,会执行这个方法,可以做一些资源的释放,达到安全的关闭应用,或者记录一些关键数据,或者备份
类中参数
ServletContextEvent:
这个类作为上述函数的参数,继承自extends java.util.EventObject
,显而易见,他是一个事件对象,类头的注释也很容易理解
1 | This is the event class for notifications about changes to the servlet |
他有着两个函数:
1 | /** |
而我们之前获取servlet context也正是调用了getServletContext()
这个函数,这个函数会返回ServletContext,如何返回?他通过调用他的父类方法(super)的getSource(),那么他的父类是EventObject
,这是一个可以序列化的类(因为它实现了:implements java.io.Serializable),它里面定义了一个不可序列化的保护对象:protected transient Object source;
并且通过getSource()
返回了这个source,也就”源”对象
ServletContext的特性
- 获取全局对象中的储存数据
- 所有用户贡献一个
优秀博文推荐(Api向)
这里有他很多用法,用的时候可以注意看一下
建议直接查看ServletContext源码