在servlet_1中讲到过,Servlet的框架是由两个Java包组成:
– javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
– javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。
Servlet的生命周期
·Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。在Servlet接口中定义了五个方法,其中有三个方法代表了Servlet的生命周期:
– init方法:负责初始化Servlet对象;
– service方法:负责响应客户的请求;
– destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。
·Servlet 的生命周期可以分为三个阶段:(其后为对应阶段Servlet容器调用的方法)
– 初始化阶段,init()
– 响应客户请求阶段 ,service()
– 终止阶段,destroy()
初始化阶段
·在下列时刻Servlet容器装载Servlet:
– 在Servlet容器启动后,客户首次向 Servlet 发出请求
– Servlet的类文件被更新后,重新装载Servlet
– Servlet容器启动时自动装载某些Servlet
·Servlet被装载后,Servlet容器创建一个 Servlet 实例并且调用 Servlet 的init()方法进行初始化。在Servlet的整个生命周期中,init方法只会被调用一次。
验证初始化:
(1)在Servlet容器启动后,客户首次向 Servlet 发出请求。
创建一个测试用servlet:
public class initServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.print("doGet invoked"); } @Override public void init() throws ServletException { System.out.print("init invoked"); } }
开启服务器(本次测试使用tomcat服务器),打开浏览器,第一次访问该initServlet,得到结果:
从结果可以看到,init方法只在Servlet转载的时候调用过一次,在服务器重启或者更新之前都不会执行第二次。Servlet的类文件被更新后,重新装载Servlet的初始化情况与此类似。以上实验涉及道德两种情况均是需要服务器接收到客户端的请求,才对Servlet进行加载的。
(2)Servlet容器启动时自动装载某些Servlet
在上面实验的基础之上,修改web项目的web.xml文件。找到配置initServlet的标签处,并添<load-on-startup>元素。
<servlet> <servlet-name>initServlet</servlet-name> <servlet- class>com.gmail.sillyli123456789.servlet.initServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
<load-on-startup>元素表示在服务器启动的时候,自动加载指定的Servlet。其中的数字代表,当有多个Servlet需要被自动的加载时的先后顺序。
在服务器启动的过程中,可以看到:
打开浏览器,访问该initServlet,得到结果:
同时再一次证明了在Servlet的整个生命周期中,init方法只会被调用一次。