Servlet的开发标准来说,Servlet是有自己的小框架的,一个标准的Servlet程序要有完整的生命周期,生命周期是什么东西呢?我们来看一下标准的Servlet开发是怎样的。
Servlet生命周期
生命周期,是一个程序存在的周期,Servlet由于受到容器的管理,所以容器来决定生命周期。
Servlet程序是运行在服务器端的一段Java程序,其生命周期将受到WEB容器的控制,生命周期包括: 加载程序、初始化、服务、销毁、卸载五个部分
生命周期就是如上图所示的,它是一个程序的一个周期。
1. 加载Servlet
WEB容器负责加载Servlet,容器就是tomcat,当WEB容器启动时或者是在第一次使用这个Servlet时,容器负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置(Servlet所在的包.类名称),成功加载后,WEB容器会通过反射的方式对Servlet进行实例化。
2. 初始化
当一个Servlet被实例化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如果初始化失败,则Servlet将直接被下载掉
3.处理服务
当有请求提交时,Servlet将调用service()方法(常用的是doGet()和doPost())进行处理。当service()方法中,Servlet可以通过ServletRequest接受客户的请求,也可以利用ServletResponse设置响应信息
4.销毁
当WEB容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源
5.卸载
当一个Servlet调用完destroy()方法后,此实例将等待被垃圾收回器所回收
关于Servlet的生命周期,就像一个人的一生一样,读者可以和人的一生一样理解,如下图所示:
Servlet生命周期对应的方法:
一个实例来说明一下:
- package ServletDemo;
- import java.io.*;
- import javax.servlet.*;
- import javax.servlet.http.*;
- import javax.servlet.http.*;
- public class Servletzhouqi extends HttpServlet{
- public void init()throws ServletException{
- System.out.println("**Servlet初始化-->init()");
- }
- public void doGet(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{
- System.out.println("**Servlet服务-->doGet()、doPost()");
- }
- public void doPost(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{ //处理POST请求
- this.doGet(req, resp); //调用doGet()方法
- }
- public void destroy(){ //Servlet销毁
- System.out.println("**Servlet销毁-->destroy");
- }
- }
一个基本的生命周期编写完成之后,下面就是编写web.xml文件了
- <servlet>
- <servlet-name>Servlet</servlet-name>
- <servlet-class>ServletDemo.Servletzhouqi</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>Servlet</servlet-name>
- <url-pattern>/ServletLife</url-pattern>
- </servlet-mapping>
运行一下,在浏览器中输入: http://localhost:8080/test/ServletLife
浏览器只是一个空白页,但是我们看tomcat服务器,如下图:
在服务器中Servlet是初始化了,在正常情况下,一个Servlet程序是在第一次运行的时候才会初始化。
这个时候反复刷新页面,可以发现只有服务器了,如下图所示:
关于销毁有两种情况:
1. 容器关闭; 也就是tomcat容器关闭了。
2. 一个Servlet长时间不使用;当一个Servlet长时间不使用的使用就会关闭了。就像一个人一样,让一个人失踪了50年,那么这个人的信息肯定被社会删除了,但是当这个人突然出现了,那怎么办,这个人的信息当然是重新编写,就想刚出生的孩子一样重新给这个人×××对吧。Servlet也是一样的。
但是,需要特别强调的是,如果现在的程序覆写了services()方法的话,则doGet和doPost就没用了
- package ServletDemo;
- import java.io.*;
- import javax.servlet.*;
- import javax.servlet.http.*;
- import javax.servlet.http.*;
- public class Servletzhouqi extends HttpServlet{
- public void init()throws ServletException{
- System.out.println("**Servlet初始化-->init()");
- }
- public void doGet(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{
- System.out.println("**Servlet服务-->doGet()、doPost()");
- }
- public void doPost(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{ //处理POST请求
- this.doGet(req, resp); //调用doGet()方法
- }
- public void destroy(){ //Servlet销毁
- System.out.println("**Servlet销毁-->destroy");
- }
- public void service(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{
- System.out.println("***服务***");
- }
- }
在浏览器中运行一下,看一下服务器,如下图所示:
可以发现,没有原来的doGet和doPost的了,只有服务这一项了,就是因为覆写了services()方法的话,则doGet和doPost就没用了
实际上,这种做法更像是一种设计的模板操作,因为只需要按照他的要求将方法覆写完成了,那么就可以实现相应的功能
当然,还有一点需要注意的是,在正常情况下初始化方法是servlet第一次使用的时候才调用的,如果现在希望容器启动的时候Servlet直接进行初始化操作的话,则可以在web.xml中增加一个相应的配置参数,表示的是容器启动的时候进行加载
- <servlet>
- <servlet-name>Servlet</servlet-name>
- <servlet-class>ServletDemo.Servletzhouqi</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Servlet</servlet-name>
- <url-pattern>/ServletLife</url-pattern>
- </servlet-mapping>
可以发现在启动中就初始化了。
注意: 有的同学说Tomcat到底是容器还是服务器。tomcat是JSP的服务器,又是Servlet和JavaBean的容器。