Servlet学习笔记-Servlet工作原理和过程

1、前言

  Java Servlet技术简称Servlet技术,是Java开发Web应用的底层技术。由Sun公司于1996年发布,用来代替CGI——当时生成Web动态内容的主流技术。官方文档对Servlet的概述,请参考《Servlet的概述》

2、关键词
  1. Servlet
    Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能。为了方便第三方准守这种规范,Sun公司(现在Oracle公司)提供了一系列相关的接口,即Servlet API。
  2. Servlet应用
    直接或间接实现了Servlet接口并且需要运行在Servlet容器中的Java程序,主要用来生成动态的Web页面。Servlet应用不能独立于运行,必须被部署到Servlet容器。
  3. Servlet容器
    Servlet容器(Servlet引擎)是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应,即Servlet容器用来接收客户端请求,处理协议、请求内容等,初始化Servlet实例(只需要第一次初始化)并调用Servlet应用的对应方法,然后Servlet应用返回处理结果,经Servlet容器再返回到用户客户端。
  4. Tomcat容器
    Tomcat容器,又叫应用服务器,也有人称之为Servlet容器。其实,本质上,Tomcat容器具有Servlet容器的功能,是Servlet容器的一种开源实现,但是它又不仅仅只是Servlet容器。
    在这里插入图片描述
3、Servlet API的包结构

  相关文档可以参考《Servlet 3.0 API 》。通过文档我们可以知道,在Servlet规范中,一种有4个java包,分别是:

  • javax.servlet
    该java包下面主要包含了定义了Servlet和Servlet容器之间契约的类和接口。
  • javax.servlet.annotation
    Servlet体系中定义的注解。包括了Servlet、Filter、Listener等注解。
  • javax.servlet.descriptor
    包含为Web应用的配置信息提供编程式访问的类型,即提供了对通过<jsp-config> 、<jsp-property-group> 、<taglib> 等标签进行的配置信息的访问方式。
  • javax.servlet.http
    该包下的类,可以说是在javax.servlet包中类和接口的契约的基础上,又基于http协议的进一步的延伸,即定义了Http Servlet和Servlet容器之间契约的类和接口。
4、Servlet 类结构

  在javax.servlet包下的主要类型:
在这里插入图片描述
  在javax.servlet.http包下的主要类型:
在这里插入图片描述

注:截图来至《Servlet+JSP和Spring+MVC初学指南》

  在javax.servlet.descriptor包下的接口和类:
在这里插入图片描述
  在javax.servlet.annotation包下的注解类:
在这里插入图片描述

没有合适的图片,直接上截图。

5、Servlet接口

  Servlet接口是Servlet技术的核心,所有的Servlet类都必须直接或者间接实现Servlet接口。Servlet接口定义了Servlet类与Servlet容器之间的契约,即通过Servlet接口约定了当Servlet容器把Servlet类的实例加载到容器后,如何调用Servlet实例的方法。

1、Servlet接口定义的方法
package javax.servlet;

import java.io.IOException;

public interface Servlet {
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
}

  Servlet生命周期的方法:
  在Servlet接口的方法中,init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程,在后面会具体的分析Servlet的工作过程和工作原理。

  剩下的两个方法,作用分别如下:

  • getServletInfo(),这个方法会返回Servlet的一段描述,可以返回一段字符串。
  • getServletConfig(),这个方法会返回由Servlet容器传给init()方法的ServletConfig对象。
6、Servlet的工作过程和原理

  Servlet工作过程中,涉及到了客户端(浏览器)、Servlet容器、Servlet应用三种角色。大致过程如下所示:

  首先,由客户端发起请求。

  然后,Servlet容器接收到客户端的请求,解析请求协议和数据,如果servlet程序还没有被加载,就会执行加载过程并调用service()方法,否则直接调用service()方法。

  其中,加载Servlet程序的过程:根据Servlet容器与Servlet程序间的契约,当有请求过来时,如果Servlet程序还没有被载入Servlet容器中,这个时候Servlet容器就会通过调用init()方法将Servlet类载入内存,并产生Servlet实例。在调用init()方法的时候,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。该过程只会被执行一次,即在一个应用程序中,每类Servlet程序只能有一个实例。其中,在ServletConfig对象中还隐藏一个ServletContext实例对象,这个ServletContext实例对象就表示了Servlet程序在容器中的上下文环境。

  而,service()方法执行的过程:首先由Servlet容器解析请求参数并封装成一个ServletRequest和ServletResponse对象。其中,ServletRequest中封装了当前的Http请求,开发者可以操作ServletRequest对象获取用户的请求数据;ServletResponse封装了当前用户的Http响应,开发者可以操作ServletResponse对象把响应内容发回给用户。Servlet容器把ServletRequest和ServletResponse作为参数传递给了service()方法,通过执行service()方法,实现响应的逻辑,并通过ServletResponse对象返回内容到客户端。

  最后,如果关闭Servlet容器时,这个时候,Servlet容器就会根据契约,调用destroy()方法,该方法一般都用来编写一些释放资源的逻辑。

7、Servlet的工作过程涉及到的实例

  根据前面分析的Servlet的工作过程,我们可以了解到,在这个过程中用到了以下几类对象:

  • ServletRequest 封装了当前的Http请求,开发者可以操作ServletRequest对象获取用户的请求数据
  • ServletResponse 封装了当前用户的Http响应,开发者可以操作ServletResponse对象把响应内容发回给用户
  • ServletConfig 封装了初始化Serlvet程序需要的信息,同时还保存了一个ServletContext实例的引用。
  • ServletContext 封装了Servlet程序在Servlet容器中的上下文环境

  后续内容再具体分析这几个接口和类的代码和方法。

发布了71 篇原创文章 · 获赞 3 · 访问量 5259

猜你喜欢

转载自blog.csdn.net/hou_ge/article/details/104684688