标签:
先来看看一个Servlet执行的流程图:
再来看看我们所说的HttpServlet的上下文:
一个Servlet的执行过程:
Servlet生命周期可被定义为从创建直到销毁的整个过程。servlet生命周期阶段包括初始化、加载、实例化、服务
和销毁。
以下是Servlet遵循的过程:
1)初始化阶段:Servlet通过调用init()方法进行初始化。
2)响应客户端请求阶段:Servlet调用service()方法来处理客户端的请求;由service()方法根据提交方式选择执行
doGet()或者doPost()方法。
3)终止阶段:Servlet通过调用destroy()方法终止(结束)。
4)最后,Servlet是由JVM的垃圾回收器进行垃圾回收的。
现在让我们详细讨论Servlet生命周期的方法。
init()方法被设计成只调用一次。它在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。因此,它是
用于一次性初始化,就像Applet的init()方法一样。
Servlet创建于用户第一次调用对应于该Servlet的URL时,但是我们也可以指定Servlet在服务器第一次启动时被
加载。
当用户调用一个Servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交
给doGet()方法或doPost()方法。init()方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。
init()方法的定义如下:
public void init() throws ServletException {
// 初始化代码...
}
service()方法是执行实际任务的主要方法。Servlet容器(即Web服务器)调用service()方法来处理来自客户端(浏览
器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务。service()方法检查HTTP请求类
型(GET、POST、PUT、DELETE等),并在适当的时候调用doGet()、doPost()、doPut(),doDelete()等方法。
下面是该方法的特征:
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
service()方法由容器调用,service()方法在适当的时候调用doGet()、doPost()、doPut()、doDelete()等方法。
所以,不用对service()方法做任何动作,您只需要根据来自客户端的请求类型来重载doGet()方法或doPost()方法即
可。
doGet()方法和doPost()方法是每次服务请求中最常用的方法。下面是这两种方法的特征。
GET请求来自于一个URL的正常请求,或者来自于一个未指定METHOD的 HTML表单,它由doGet()方法处理。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//Servlet代码
}
POST请求来自于一个特别指定了METHOD为POST的HTML表单,它由doPost()方法处理。
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//Servlet代码
}
destroy()方法只会被调用一次,在Servlet生命周期结束时被调用。destroy()方法可以让Servlet关闭数据库连
接、停止后台线程、把Cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用destroy()方法之后,servlet对象被标记为垃圾回收。destroy()方法定义如下所示:
public void destroy() {
//终止化代码...
}
下图显示了一个典型的Servlet生命周期方案:
第一个到达服务器的HTTP请求被委派到Servlet容器。
Servlet容器在调用service()方法之前加 Servlet。然后Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的Servlet实例的service()方法。
在下列时刻Servlet容器装载Servlet:
1)Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的<Servlet></Servlet>之间添加如
下代码:<loadon-startup>1</loadon-startup>,或者在注解中加上loadOnStartup=1,数字越小表示优先级越
高。
2)在Servlet容器启动后,客户首次向Servlet发送请求。
3)Servlet类被更新后,重新加载Servlet。
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化,在Servlet的整个
生命周期内,init()方法只被调用一次。
ServletOne的代码:
package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletOne */ @WebServlet(name="ServletOne" ,urlPatterns={"/ServletOne"},loadOnStartup=2) public class ServletOne extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ServletOne() { System.out.println("ServletOne的构造方法被执行"); } /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { System.out.println("ServletOne的初始化方法被执行"); } /** * @see Servlet#destroy() */ public void destroy() { System.out.println("ServletOne的销毁方法被执行"); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); System.out.println("ServletOne的doGet()方法被执行"); PrintWriter out = response.getWriter(); out.print("<h1>Hello ServletOne</h1>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
执行结果:
销毁方法是在服务器关闭后才执行的。
对ServletOne的修改是:
创建一个新的ServletTwo的代码为:
package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletTwo */ @WebServlet(name="ServletTwo" ,urlPatterns={"/ServletTwo"},loadOnStartup=1) public class ServletTwo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ServletTwo() { System.out.println("ServletTwo的构造方法被执行"); } /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { System.out.println("ServletTwo的初始化方法被执行"); } /** * @see Servlet#destroy() */ public void destroy() { System.out.println("ServletTwo的销毁方法被执行"); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); System.out.println("ServletTwo的doGet()方法被执行"); PrintWriter out = response.getWriter(); out.print("<h1>Hello ServletTwo</h1>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
执行结果:
对于Servlet类被更新后,会重新加载Servlet,这个我们写的时候无法清晰的表达出来,只要是Servlet有所更新
那么服务器是会重新加载这个Servlet的。
Tomcat的容器分为四个等级,Servlet的容器管理Context容器,一个Context对应一个Web工程。
servlet容器,负责管理servlet生命周期。web容器,负责管理和部署web应用,其本身可能具备servlet容器组
件;如果没有,一般能将第三方servlet容器作为组件整合进web容器。
Tomcat就是一个Servlet容器,它在整个web应用系统中处于中间层的地位。web容器最典型的就是tomcat
了,Tomcat是web容器也是servlet容器。
标签:
原文地址:http://blog.csdn.net/erlian1992/article/details/52088889