#java #web Servlet的请求流程和生命周期(含实例验证)

#java #web  Servlet的请求流程和生命周期(含实例验证)

 

目录

#java #web  Servlet的请求流程和生命周期(含实例验证)

1、Servlet请求流程

2、Servlet的生命周期

3、实例验证

    3.1 验证程序运行的流程

    3.2 验证销毁时的流程

    3.3 验证自动装载Servlet


1、Servlet请求流程

以get请求为例:

        在网页点击一个超链接(get方式请求Servlet)-->提交到服务器-->服务器在web.xml里面寻找与之对应的url地址-->找到对应的Servlet的名字-->找到该Servlet的处理类-->调用该类里的doGet方法

 

2、Servlet的生命周期

#java #web Servlet的请求流程和生命周期(含实例验证)_第1张图片

        1、初始化阶段,调用init()方法(类的构造方法);

        2、响应客户请求阶段,调用service()方法。由service()方法根据提交方式选择执行doGet()或者doPost()方法;

        3、终止阶段,调用destroy()方法。

        在以下时刻容器装载Servlet:

                (1)、Servlet容器启动时可以实现自动装载某些Servlet,如果需要自动装载,可以在之间添加如下代码:

1

标签里的这个数字代表级别数字越小级别越高级别越高越先加载

               (2)、在Servlet容器启动后,客户首次向Servlet发送请求。

               (3)、Servlet类文件被更新后,重新装载Servlet。

        Servlet被装载后,长期驻留在内存里,Servlet创建一个Servlet示例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

 

3、实例验证

    3.1 验证程序运行的流程

        (1)编写一个Servlet,重写init()、destroy()、doGet()、doPost()等方法,手动写一个构造方法,init()、destroy(与构造)方法重写内容为一个输出,让我们知道这个函数已经执行了,doGet()、doPost()方法内容可以自由发挥,示例如下:

package Servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

public class ServletTest1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() {
		System.out.println("ServletTest1初始化方法被执行");
	}
	
	public void destroy() {
		System.out.println("ServletTest1销毁方法被执行");
	}
	
        public ServletTest1() {
        System.out.println("ServletTest1创建方法被执行");
        }

	protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("get处理请求");
		resp.setContentType("text/html;charser=utf-8");
		PrintWriter out = resp.getWriter();
		out.print("Hello Servlet! get
"); } protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("post处理请求"); resp.setContentType("text/html;charser=utf-8"); PrintWriter out = resp.getWriter(); out.print("Hello Servlet! post
"); } }

        将次Servlet方法注册后,在jsp文件中写一个a标签,链接到此Servlet:

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




Insert title here


	

Servlet生命周期


以get方式请求ServletTest1

        运行点击此超链接,可以发现控制台输出如下:

#java #web Servlet的请求流程和生命周期(含实例验证)_第2张图片

       根据上图,我们可以知道,函数的运行顺序为:Servlet类的构造方法ServletTest1()-->HttpServlet类中的init()方法(Servlet初始化方法)-->doGet()或者doPost()方法。

    3.2 验证销毁时的流程

        直接在Console里停止程序运行无法看到程序销毁的状态,可以采用停止服务器的方式来验证。

        Eclipse点击windows-->Show View-->Servers,调出服务器管理窗口,在服务器管理窗口里点击停止,停止服务器。

#java #web Servlet的请求流程和生命周期(含实例验证)_第3张图片

        可以发现,控制台有了新的输出:

#java #web Servlet的请求流程和生命周期(含实例验证)_第4张图片

       分析上述输出可知,在服务器断开的时候,会重新向服务器重复发送之前的请求未果之后调用销毁方法销毁该Servlet

    3.3 验证自动装载Servlet

        (1)、新写一个Servlet,内容和之前的Servlet一样,重写init()、destroy()、doGet()、doPost()等方法,手动写构造方法,init()、destroy()与构造方法重写内容为一个输出,让我们知道这个函数已经执行了,同时要与第一个Servlet区别开来,doGet()、doPost()方法内容可以自由发挥。

        (2)、在WEB-INFO中的web.xml文件中的两个Servlet标签中分别添加标签,标签里分别放一个数字,示例如下:

  
    
    ServletTest1
    ServletTest1
    Servlet.ServletTest1
    2
  
  
    ServletTest1
    /ServletTest1
  
  
    
    ServletTest2
    ServletTest2
    Servlet.ServletTest2
    1
  
  
    ServletTest2
    /ServletTest2
  

        (3)、我们运行程序,可以看到控制台有以下输出:

#java #web Servlet的请求流程和生命周期(含实例验证)_第5张图片

        可以看到,在运行的时候,Servlet就自动加载了,数字标签里的数字越小越先加载,每个Servlet都是先执行构造方法,在执行继承自HttpServlet里的init()方法。

        (4)、按照3.2中的方法停止服务器时,可以看到有以下输出:

#java #web Servlet的请求流程和生命周期(含实例验证)_第6张图片

        可以发现,客户端也重新向服务器发送请求,无果后,级别小(标签里的数字大的)的Servlet先销毁,级别大的后销毁

        可以采用类似的方式研究更多情况下Servlet的请求流程,这个就留给读者们发挥吧。

 

关于java web的更多内容,可以到https://blog.csdn.net/weixin_41475710/column/info/32531查看,会持续更新。 

你可能感兴趣的:(java,web,java,web)