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

5 篇文章 0 订阅
5 篇文章 2 订阅

#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的生命周期

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

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

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

        在以下时刻容器装载Servlet:

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

<loadon-startup>1</loadon-startup>

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

               (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("<strong>Hello Servlet! get</strong><br />");
	}

	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("<strong>Hello Servlet! post</strong><br />");
	}

}

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

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="usf-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Servlet生命周期</h1>
	<hr />
	<a href = "ServletTest1">以get方式请求ServletTest1</a>
</body>
</html>

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

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

    3.2 验证销毁时的流程

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

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

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

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

    3.3 验证自动装载Servlet

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

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

  <servlet>
    <description></description>
    <display-name>ServletTest1</display-name>
    <servlet-name>ServletTest1</servlet-name>
    <servlet-class>Servlet.ServletTest1</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletTest1</servlet-name>
    <url-pattern>/ServletTest1</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>ServletTest2</display-name>
    <servlet-name>ServletTest2</servlet-name>
    <servlet-class>Servlet.ServletTest2</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletTest2</servlet-name>
    <url-pattern>/ServletTest2</url-pattern>
  </servlet-mapping>

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

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

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

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

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

 

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值