目录
#java #web Servlet的请求流程和生命周期(含实例验证)
1、Servlet请求流程
2、Servlet的生命周期
3、实例验证
3.1 验证程序运行的流程
3.2 验证销毁时的流程
3.3 验证自动装载Servlet
以get请求为例:
在网页点击一个超链接(get方式请求Servlet)-->提交到服务器-->服务器在web.xml里面寻找与之对应的url地址-->找到对应的Servlet的名字-->找到该Servlet的处理类-->调用该类里的doGet方法
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()方法只被调用一次。
(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
运行点击此超链接,可以发现控制台输出如下:
根据上图,我们可以知道,函数的运行顺序为:Servlet类的构造方法ServletTest1()-->HttpServlet类中的init()方法(Servlet初始化方法)-->doGet()或者doPost()方法。
直接在Console里停止程序运行无法看到程序销毁的状态,可以采用停止服务器的方式来验证。
Eclipse点击windows-->Show View-->Servers,调出服务器管理窗口,在服务器管理窗口里点击停止,停止服务器。
可以发现,控制台有了新的输出:
分析上述输出可知,在服务器断开的时候,会重新向服务器重复发送之前的请求,未果之后调用销毁方法销毁该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)、我们运行程序,可以看到控制台有以下输出:
可以看到,在运行的时候,Servlet就自动加载了,数字
(4)、按照3.2中的方法停止服务器时,可以看到有以下输出:
可以发现,客户端也重新向服务器发送请求,无果后,级别小(
可以采用类似的方式研究更多情况下Servlet的请求流程,这个就留给读者们发挥吧。
关于java web的更多内容,可以到https://blog.csdn.net/weixin_41475710/column/info/32531查看,会持续更新。