4 Servlet生命周期
4.1 Servlet生命周期概述
- 应用程序中的对象不仅在空间上有层次结构的关系,在时间上也会因为处于程序运行过程中的不同阶段而表现出不同的状态和不同的行为——这就是对象的生命周期
- 简单的叙述生命周期,就是对象在容器中从开始创建到销毁的过程
4.2 Servlet容器
Servlet对象是Servlet容器创建的,生命周期方法都是由容器调用的。这一点和我们之前所编写的代码有很大不同。在今后的学习中我们会看到,越来越多的对象交给容器或框架来创建,越来越多的方法由容器或框架来调用,开发人员要尽可能多的将精力放在业务逻辑的实现上。
4.3 Servlet生命周期的主要过程
-
Servlet对象的创建:构造器
默认情况下,Servlet容器第一次收到HTTP请求时创建对应Servlet对象。容器之所以能做到这一点是由于我们在注册Servlet时提供了全类名,容器使用反射技术创建了Servlet的对象。
-
Servlet对象初始化:init()
- Servlet容器创建Servlet对象之后,会调用init(ServletConfig config)方法。
- 作用:是在Servlet对象创建后,执行一些初始化操作。例如,读取一些资源文件、配置文件,或建立某种连接(比如:数据库连接) 。
- init()方法只在创建对象时执行一次,以后再接到请求时,就不执行了。
- 在javax.servlet.Servlet接口中,public void init(Reconfigurable config)方法要求容器将Reconfigurable的实例对象传入,这也是我们获取Reconfigurable的实例对象的根本方法。
-
处理请求:service()
- 在javax.servlet.Servlet接口中,定义了service(ServletRequest req, ServletResponse res)方法处理HTTP请求。
- 在每次接到请求后都会执行。
- 上一节提到的Servlet的作用,主要在此方法中体现。
- 同时要求容器将ServletRequest对象和ServletResponse对象传入。
-
Servlet对象销毁:destroy()
- 服务器重启、服务器停止执行或Web应用卸载时会销毁Servlet对象,会调用public void destroy()方法。
- 此方法用于销毁之前执行一些诸如释放缓存、关闭连接、保存内存数据持久化等操作。
4.4 Servlet请求过程
- 第一次请求
- 调用构造器,创建对象
- 执行init()方法
- 执行service()方法
- 后面请求
- 执行service()方法
- 对象销毁前
- 执行destroy()方法
5 Servlet的两个接口
5.1 ServletConfig接口
- 概述:
- ServletConfig接口封装了Servlet配置信息,这一点从接口的名称上就能够看出来。
- 每一个Servlet都有一个唯一对应的ServletConfig对象,代表当前Servlet的配置信息。
- 对象由Servlet容器创建,并传入生命周期方法init(ServletConfig config)中。可以直接获取使用。
- 代表当前Web应用的ServletContext对象也封装到了ServletConfig对象中,使ServletConfig对象成为了获取ServletContext对象的一座桥梁。
2. ServletConfig对象的主要功能
- 获取Servlet名称:getServletName();
- 获取全局上下文ServletContext对象:getServletContext()
- 获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。
5.2 ServletContext接口
- Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。
- 由于一个Web应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象也被称为 application 对象(Web应用程序对象)。
- 对象由Servlet容器在项目启动时创建,通过ServletConfig对象的getServletContext()方法获取。在项目卸载时销毁。
- ServletContext对象的主要功能
① 获取项目的上下文路径(带/的项目名): getContextPath()
@Override
public void init(ServletConfig config) throws ServletException {
ServletContext application = config.getServletContext();
System.out.println("全局上下文对象:"+application);
String path = application.getContextPath();
System.out.println("全局上下文路径:"+path);// /06_Web_Servlet
}
② 获取虚拟路径所映射的本地真实路径:getRealPath(String path)
-
虚拟路径:浏览器访问Web应用中资源时所使用的路径。
-
本地路径:资源在文件系统中的实际保存路径。
-
作用:将用户上传的文件通过流写入到服务器硬盘中。
@Override public void init(ServletConfig config) throws ServletException { //1.获取ServletContext对象 ServletContext context = config.getServletContext(); //2.获取index.html的本地路径 //index.html的虚拟路径是“/index.html”,其中“/”表示当前Web应用的根目录, //即WebContent目录 String realPath = context.getRealPath("/index.html"); //realPath=D:\DevWorkSpace\MyWorkSpace\.metadata\.plugins\ //org.eclipse.wst.server.core\tmp0\wtpwebapps\MyServlet\index.html System.out.println("realPath="+realPath); }
③ 获取WEB应用程序的全局初始化参数(基本不用)
-
设置Web应用初始化参数的方式是在web.xml的根标签下加入如下代码
<web-app> <!-- Web应用初始化参数 --> <context-param> <param-name>ParamName</param-name> <param-value>ParamValue</param-value> </context-param> </web-app>
-
获取Web应用初始化参数
@Override public void init(ServletConfig config) throws ServletException { //1.获取ServletContext对象 ServletContext application = config.getServletContext(); //2.获取Web应用初始化参数 String paramValue = application.getInitParameter("ParamName"); System.out.println("全局初始化参数paramValue="+paramValue); }
④ 作为域对象共享数据
- 作为最大的域对象在整个项目的不同web资源内共享数据。
- setAttribute(key,value):以后可以在任意位置取出并使用
- getAttribute(key):取出设置的value值