Servlet生命周期

发布于:2023-01-09 ⋅ 阅读:(426) ⋅ 点赞:(0)

目录

一.Serclet概述

二.Servlet生命周期。

1、 实例化:

2、 初始化:

3 、服务:

4、销毁:


一.Serclet概述

        一个 Servlet 总是继承自 HttpServlet ,然后覆写 doGet() 或 doPost() 方法。注意 到 doGet() 方法传入了 HttpServletRequest 和 HttpServletResponse 两个对象,分别 代表 HTTP 请求和响应。我们使用 Servlet API 时,并不直接与底层 TCP 交互,也 不需要解析 HTTP 协议,因为 HttpServletRequest 和 HttpServletResponse 就已经封 装好了请求和响应。

        以发送响应为例,我们只需要设置正确的响应类型,然后获取 PrintWriter ,写入响应即可。 而这样的一个项目最终会打包成一个 *.war 文件,运行这个文件,需要使用支持 Servlet API 的Web容器(Web服务器)。 因此,我们首先要找一个支持Servlet API的Web服务器。

        常用的服务器有:

Tomcat:由Apache开发的开源免费服务器;

Jetty:由Eclipse开发的开源免费服务器;

GlassFish:一个开源的全功能JavaEE服务器。( 还有一些收费的商用服务器,如Oracle的WebLogic,IBM的WebSphere。) 无论使用哪个服务器,只要它支持 Servlet API ,我们的 war 包都可以在上面 运行。这里我们选择使用最广泛的开源免费的 Tomcat 服务器。

        在浏览器输入 http://localhost:8080/项目名称/hello.do ,即可看到 HelloServle t 的输出。

为什么路径是 "/项目名称" 而不是 / ?

        因为一个 Web 服务器允许同时运行多个 Web App 。因此,第一级目录 /项目名称 表示Web App的名字,后面的 /hello.do 才是 我们在 HelloServlet 中映射的路径。

        实际上,类似 Tomcat 这样的服务器也是 Java 编写的,启动 Tomcat 服务器实 际上是启动 Java 虚拟机,执行 Tomcat 的 main() 方法,然后由 Tomcat 负责加载 我们的 *.war 文件,并创建一个 HelloServlet 实例,最后以多线程的模式来处理 HTTP 请求。如果 Tomcat 服务器收到的请求路径是 /项目名称/hello.do ,就转发到 Hel loServlet 并传入 HttpServletRequest 和 HttpServletResponse 两个对象.

二.Servlet生命周期。

        在通过一个 URL 路径发起对一个 Servlet 请求的过程中,其本质是在调用执行 Servlet 实例的 doXXX() 方法。该 Servlet 实例创建和使用的过程,被称为Servlet 的生命周期。整个生命周期包括:实例化、初始化、服务、销毁。

1、 实例化:

        根据 Servlet 请求的路径(例如: home.do ),查找该 Servlet 的实 例。如果实例不存在,则通过调用构造方法,完成 Servlet 实例的创建。

2、 初始化:

        通过该 Servlet 的实例,调用 init() 方法,执行初始化的逻辑。

3 、服务:

        通过该 Servlet 的实例,调用 service() 方法,如果子类没有重写该方 法,则调用HttpServlet父类的 service() 方法,在父类的该方法中进行请求方式 的判断,如果是 GET 请求,则调用 doGet() 方法;如果是 POST 请求,则调用 doPost() 方法;

        如果子类重写 doXXX() 方法,则调用子类重写后的 doXXX() 方法; 如果子类没有重写 doXXX() 方法,则调用父类的 doXXX() 方法,在父类的方法实 现中,返回一个 405 状态码的错误页面。

405状态码:代表请求的方式服务器不提供支持

4、销毁:

        服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的 des troy() 方法。

package com.rui.web.servlet;

import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedHashSet;

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

@WebServlet("/home.do")
public class HomeServlet extends HttpServlet{

	//1,实例化
	//构造方法
	public HomeServlet() {
		System.out.println("1.HomeServlet实例被创建");
	}
	
	//2,初始化
	//重写HttpServlet父类的init()方法
	//通过实例自动调用init()方法
	@Override
	public void init() throws ServletException {
		System.out.println("2.HomeServlet实例初始化");
	}
	
	//3.服务
	//通过实例调用HttpServlet父类的Service()方法
	//service()方法中,会根据请求方式(get或post)的不同
	//调用子类重写的doGet()或者doPost()方法
	//如果子类没有重写,则响应405
	
	//根据请求方式的不同,需要调用不同的请求方法
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("HomeServlet被Get请求到!"+this.hashCode());
		String method=req.getMethod();
		System.out.println("请求方式"+method);
	}
	
	//4.销毁
	@Override
	public void destroy() {
		System.out.println("4.HomeServlet实例被销毁");
	}
	
//	@Override
//	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		System.out.println("HomeServlet被POST请求到");
//	}
}

运行结果:

 


网站公告

今日签到

点亮在社区的每一天
去签到