JavaWeb——Servlet生命周期

一、 准备工作

在叙述Servlet声明周期前,首先需要创建一个项目,定义index.jsp,DataServlet.java,target.jsp这三个文件作为准备,并展示其web.xml文件,其内容分别如下

项目整体展示图:
JavaWeb——Servlet生命周期_第1张图片
注:其中servlet-api.jar为必须jar包

index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>开始title>
	head>
	<body>
		<a href="./DataServlet">链接a>
	body>
html>

DataServlet.java:

package com.jd;

import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DataServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	public DataServlet() {
		System.out.println("DataServlet");
	}
	
	@Override
	public void init() throws ServletException {
		System.out.println("init");
	}

	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		System.out.println("service");
		super.service(arg0, arg1);
	}

	@Override
	public void destroy() {
		System.out.println("destroy");
	}
 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet");
		response.sendRedirect("target.jsp");
	}	
}

target.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title heretitle>
	head>
	<body>
		OK
	body>
html>

web.xml


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Servletdisplay-name>
  <welcome-file-list>
    <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.htmwelcome-file>
    <welcome-file>index.jspwelcome-file>
    <welcome-file>default.htmlwelcome-file>
    <welcome-file>default.htmwelcome-file>
    <welcome-file>default.jspwelcome-file>
  welcome-file-list>
  <servlet>
    <description>description>
    <display-name>DataServletdisplay-name>
    <servlet-name>DataServletservlet-name>
    <servlet-class>com.jd.DataServletservlet-class>
    <load-on-startup>1load-on-startup>
  servlet>
  <servlet-mapping>
    <servlet-name>DataServletservlet-name>
    <url-pattern>/DataServleturl-pattern>
  servlet-mapping>
web-app>

二、 Servlet生命周期过程

总体分为四步:
1、加载及实例化
2、初始化
3、处理请求
4、销毁

三、过程讲解

Servlet容器负责加载和实例化Servlet。当客户端第一次给服务器发送该Servlet请求时,Servlet容器会加载并创建Servlet实例(对象)。作者在文章开头写的准备内容是需要点击index.jsp页面中的链接按钮才会创建相应Servlet对象的。为了更好地展示目的,这时候需要用到Servlet标签中的load-on-startup标签,通过load-on-startup标签可以配置Servlet,当web项目发布后立即创建Servlet实例,需要注意的是load-on-startup标签内容必须为数字,表示此servlet文件创建实例的优先级,本文中的load-on-startup标签内容定义为1。

下图为servlet加载并实例化后的控制台输出:

JavaWeb——Servlet生命周期_第2张图片
可以看出第一次加载及实例化时只执行了构造方法和init方法。

点击链接按钮后(向DataServlet发出了请求),其控制台输出结果如下:

JavaWeb——Servlet生命周期_第3张图片

1、init方法和构造方法仅在第一次加载并实例化时执行

可以看出Servlet容器接受到请求后,创建对象时并没有执行构造方法和init方法,只执行了service方法和doGet方法。可以说明init方法和构造方法都只是在第一次加载及实例化时才执行的

2、service方法和doGet方法在处理请求时执行

执行了service方法是因为当Servlet容器接收到客户端针对该Servlet的请求后,首先会针对这个请求创建ServletRequest和ServletResponse对象,之后调用Servlet的service()方法并把这两个参数传递给service()方法处理客户端请求。
Servlet实例通过ServletRequest对象获得客户端的请求,通过调用ServletResponse对象的方法进行响应。请求处理完毕,ServletRequest和ServletResponse对象被销毁。

不管客户端发送请求的方式是Get还是POST,这个请求都由service方法来处理。在service方法的处理过程中,会根据客户端发送请求的方式不同,调用doGet和doPost方法分别进行处理,由于本文发送请求的是a标签,所以调用的是doGet方法。

3、销毁

销毁Servlet 由Servlet容器完成。默认情况下,用户第一次发送Servlet请求,该Servlet加载、实例化、初始化、处理用户请求,当请求处理完毕后,该Servlet通常情况下驻留在内存中,等待处理下一个针对该Servlet的请求。当下一个针对该Servlet的请求到达时,直接从内存中获取该Servlet实例并对该请求进行处理。如果Tomcat这个Web应用服务器关闭(服务器上所有的Web应用都关闭),或者该Servlet所在的Web应用关闭,该Servlet实例会被销毁。

如下是右键stop该项目后的控制台输出图:

JavaWeb——Servlet生命周期_第4张图片

你可能感兴趣的:(JavaWeb——Servlet生命周期)