Java Web学习(29): Servlet学习(二)

       Servlet生命周期

       先来看看一个Servlet执行的流程图:

       

       再来看看我们所说的HttpServlet的上下文:

       

       一个Servlet的执行过程:

       

       Servlet的生命周期

       Servlet生命周期可被定义为从创建直到销毁的整个过程。servlet生命周期阶段包括初始化、加载、实例化、服务

和销毁。

       以下是Servlet遵循的过程:   

       1)初始化阶段:Servlet通过调用init()方法进行初始化。

       2)响应客户端请求阶段:Servlet调用service()方法来处理客户端的请求;由service()方法根据提交方式选择执行

doGet()或者doPost()方法。

       3)终止阶段:Servlet通过调用destroy()方法终止(结束)。

       4)最后,Servlet是由JVM的垃圾回收器进行垃圾回收的。

       现在让我们详细讨论Servlet生命周期的方法。

       (1)init()方法

       init()方法被设计成只调用一次。它在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。因此,它是

用于一次性初始化,就像Applet的init()方法一样。

       Servlet创建于用户第一次调用对应于该Servlet的URL时,但是我们也可以指定Servlet在服务器第一次启动时被

加载。

       当用户调用一个Servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交

给doGet()方法或doPost()方法。init()方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。

       init()方法的定义如下:

public void init() throws ServletException {
      // 初始化代码...
}

       (2)service() 方法

       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()方法是每次服务请求中最常用的方法。下面是这两种方法的特征。

       doGet()方法

       GET请求来自于一个URL的正常请求,或者来自于一个未指定METHOD的 HTML表单,它由doGet()方法处理。

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    //Servlet代码
}

       doPost()方法

       POST请求来自于一个特别指定了METHOD为POST的HTML表单,它由doPost()方法处理。

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    //Servlet代码
}

       destroy()方法

       destroy()方法只会被调用一次,在Servlet生命周期结束时被调用。destroy()方法可以让Servlet关闭数据库连

接、停止后台线程、把Cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

       在调用destroy()方法之后,servlet对象被标记为垃圾回收。destroy()方法定义如下所示:

public void destroy() {
      //终止化代码...
  }

       Servlet架构图

       下图显示了一个典型的Servlet生命周期方案:

       

       第一个到达服务器的HTTP请求被委派到Servlet容器。

       Servlet容器在调用service()方法之前加 Servlet。

       然后Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的Servlet实例的service()方法。

       Servlet加载

       在下列时刻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()方法只被调用一次。

       实例一:演示Servlet的生命周期

       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);
	}


}

       执行结果:

       

       销毁方法是在服务器关闭后才执行的。

       实例二:在上述实例中我们加以修改,实现服务器启动自动装载Servlet

       对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容器等级

       Tomcat的容器分为四个等级,Servlet的容器管理Context容器,一个Context对应一个Web工程。

       

       servlet容器,负责管理servlet生命周期。web容器,负责管理和部署web应用,其本身可能具备servlet容器组

件;如果没有,一般能将第三方servlet容器作为组件整合进web容器。

       Tomcat就是一个Servlet容器,它在整个web应用系统中处于中间层的地位。web容器最典型的就是tomcat

了,Tomcat是web容器也是servlet容器。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值