【Java Web】Servlet规范讲解

news2024/9/24 1:52:17

目录

一、前言

二、Servlet规范介绍

2.1 常见版本及新功能

2.2 Servlet的作用

2.3 Servlet的本质

三、Servlet接口和实现类

3.1 Servlet接口

3.2 Servlet接口实现类示例

3.3 Servlet接口实现类开发步骤

3.3.1 关键点

3.3.2 引入Servlet源码包

1、描述

Servlet接口是一类完成Java与服务器之间的桥梁,若想让Java和服务器产生联系,Java必须实现由服务器提供的Servlet接口。类似于数据库驱动和JDBC,JDBC是Java的接口,数据库想和Java产生联系就必须实现Java的JDBC接口。

2、Tomcat自带引入

3.3.3 Servlet接口实现类的编写

1、第一步

2、第二步

3、第三步

3.4 Tomcat调用Servlet接口实现类

1、创建Servlet实现类对象

2、调用service()方法

3、调用doGet() 或 doPost()

四、Servlet与Http服务器

4.1 Servlet与Http服务器通信原理

4.2 浏览器与servlet通信原理

4.3 总结


一、前言

在Java Web应用中,除了Tomcat服务器外,其实还有Jetty、GlassFish、Undertow等多种Web服务器。

一个Java Web App通常打包为.war文件,并且可以部署到Tomcat、Jetty等多种Web服务器上。为什么一个Java Web App基本上可以无修改地部署到多种Web服务器上呢?原因就在于Servlet规范。

Servlet规范是Java Servlet API的规范,用于定义Web服务器如何处理HTTP请求和响应。Servlet规范有一组接口,对于Web App来说,操作的是接口,而真正对应的实现类,则由各个Web Server实现,这样一来,Java Web App实际上编译的时候仅用到了Servlet规范定义的接口,只要每个Web服务器在实现Servlet接口时严格按照规范实现,就可以保证一个Web App可以正常运行在多种Web服务器上:

二、Servlet规范介绍

Servlet也算是JavaEE规范中的一种。

对于Web应用程序,Servlet规范是非常重要的。Servlet规范有好几个版本,每个版本都有一些新的功能。

2.1 常见版本及新功能

Servlet 1.0:定义了Servlet组件,一个Servlet组件运行在Servlet容器(Container)中,通过与容器交互,就可以响应一个HTTP请求;

Servlet 2.0:定义了JSP组件,一个JSP页面可以被动态编译为Servlet组件;

Servlet 2.4:定义了Filter(过滤器)组件,可以实现过滤功能;

Servlet 2.5:支持注解,提供了ServletContextListener接口,增加了一些安全性相关的特性;

Servlet 3.0:支持异步处理的Servlet,支持注解配置Servlet和过滤器,增加了SessionCookieConfig接口;

Servlet 3.1:提供了WebSocket的支持,增加了对HTTP请求和响应的流式操作的支持,增加了对HTTP协议的新特性的支持;

Servlet 4.0:支持HTTP/2的新特性,提供了HTTP/2的Server Push等特性;

Servlet 5.0:主要是把javax.servlet包名改成了jakarta.servlet

Servlet 6.0:继续增加一些新功能,并废除一部分功能。

目前最新的Servlet版本是6.0,我们开发Jerrymouse Server也是基于最新的Servlet 6.0。

2.2 Servlet的作用

  • 在servlet规范中,指定【动态资源文件】开发步骤(限定开发人员的编写)。只有继承了servlet接口的实现类编写出来的 .class文件,才是动态资源文件,才允许给服务器调用(服务器只能调用Servlet接口实现类的 动态资源文件)。
  • 在servlet规范中,指定Http服务器调用动态资源文件的规则(限定服务器的访问),服务器创建出动态资源文件的实例对象,然后实例对象调用动态资源文件内的方法,得到某些执行结果将结果返回给服务器;
  • 在servlet规范中,指定Http服务器管理动态资源文件实例对象规则(限定服务器的访问)。服务器可以对所有的动态资源文件进行管理;

2.3 Servlet的本质

servlet是一堆具有"固定编写格式"的Java接口,提供一种"限定"来编写服务器可以访问的动态资源文件。

狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类。Servlet对象会被方法Servlet容器中,一个容器可以放多个Servlet对象

三、Servlet接口和实现类

3.1 Servlet接口

Servlet接口来自于Servlet规范下的一个接口,这个接口存在于Http服务器提供jar包中。如 Tomcat服务器的lib目录下 的servlet-api.jar存放着Servlet接口(javax.servlet.Servlet接口)。

Servlet规范中认定,Http服务器能调用的动态资源文件 必须是一个Servlet接口实现类的 .class文件。

接口代码:

// Tomcat服务器下的Servlet接口源码
// 所有Tomcat调用的动态资源文件必须实现该接口
package javax.servlet;
import java.io.IOException;
public interface Servlet {
    // 负责初始化Servlet对象。在Servlet对象创建后,Servlet容器将调用init()方法,完成Servlet对象的初始化工作。
    void init(ServletConfig var1) throws ServletException;

    // 负责响应客户端的请求。当Servlet容器接收到客户端要求访问特定Servlet对象的请求时,就会调用该Servlet对象的service()方法,完成响应工作。
    // 接口提供的五个方法中,只有Service()方法需要实现类重写实现
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    // 负责释放Servlet对象占用的资源。当Servlet容器决定将Servlet对象从内存中销毁时,就会调用该Servlet对象的destroy()方法,完成销毁工作。
    void destroy();

    // Servlet接口还定义了以下两个返回Servlet的相关信息的方法。
    // JavaWeb 应用中的程序代码可以访问Servlet的这两个方法,从而获得Servlet的配置信息及其他相关信息。

    // 返回一个ServletConfig对象,该对象包含Servlet的初始化参数和Servlet容器的引用。
    ServletConfig getServletConfig();
    
    // 返回一个字符串,该字符串包含Servlet的版本信息、版权信息、作者信息等。
    String getServletInfo();
}

3.2 Servlet接口实现类示例

class Student{
    // 非Servlet接口,不是动态资源文件,Tomcat无权调用
}

class Teacher implements Servlet{
    // 实现Servlet接口,合法的动态资源文件,Tomcat有权利调用
    // Tomcat创建Servlet对象,调用其方法
    Servlet obj = new Teacher();
    obj.doGet()
}

3.3 Servlet接口实现类开发步骤

3.3.1 关键点

  • 浏览器提交的方式:get 或 post;
  • Http服务器接收请求后的处理方式:HttpServlet类的Service()方法体中采用请求体对象getMethod()获取;
  • 动态资源文件的本质:是Servlet接口实现类
  • 动态资源文件的编写规则:先getMethod()获取浏览器提交请求的方式,解析请求的URL,查找资源,执行结果,返回资源。

3.3.2 引入Servlet源码包

1、描述

Servlet接口是一类完成Java与服务器之间的桥梁,若想让Java和服务器产生联系,Java必须实现由服务器提供的Servlet接口。类似于数据库驱动和JDBC,JDBC是Java的接口,数据库想和Java产生联系就必须实现Java的JDBC接口。

2Tomcat自带引入

在IDEA引入Tomcat时 详情请见,Tomcat就自带引入servlet-api.jar包

3.3.3 Servlet接口实现类的编写

1、第一步

创建一个Java类,并继承于HttpServlet父类(HttpServlet间接实现了Servlet接口),使该Java类成为一个服务器可调用的Servlet接口实现类;

/**
*              extends                       extends                          implements
* Servlet实现类-------->(abstract)HttpServlet-------->(abstract)GenericServlet----------> servlet接口
*/
public class MyServletTest01 extends HttpServlet {
}

2、第二步

重写HttpServlet父类的两个方法-- doGet() 或 doPost(),一般只重写一个具体的即可,在另外一个重写的方法内互相调用。但doGet() 或 doPost()的具体调用不需要程序员指定,而是由HttpServlet抽象类的Service()方法自动根据浏览器提交的方式判断 来调用,程序员只需要重写doGet() 和 doPost()满足需求即可

  • 浏览器get方式提交请求,服务器调用ServletInstance的doGet()方法;
  • 浏览器post方式提交请求,服务器调用ServletInstance的doPost()方法。
// 实现HttpServlet,并重写doGet() 和 doPost()
public class MyServletTest01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3、第三步

将Servlet接口实现类信息注册到Tomcat服务器,具体是在web.xml文件中添加已实现的Servlet接口实现类信息标签。

网站目录(项目)---> web目录 ---> WEB-INF目录 ---> web.xml文件

<!-- 在web.xml文件中添加Servlet接口实现类信息 -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">
        <!--将servlet接口实现类类路径地址交给Tomcat-->
        <servlet>
            <!-- servlet名称 -->
            <servlet-name>MyServlet</servlet-name>
            <!--servlet接口实现类的全限定名-->
            <servlet-class>com.yry.controller.MyServletTest01</servlet-class>
        </servlet>

        <!--为servlet接口实现类提供简短别名-->
        <servlet-mapping>
            <!-- 这个名称要和<servlet>标签中的名称一致,这样才能将两个关联起来 -->
            <servlet-name>MyServlet</servlet-name>
            <!-- 浏览器要访问的地址 -->
            <url-pattern>/MyServlet</url-pattern>
        </servlet-mapping>
</web-app>

3.4 Tomcat调用Servlet接口实现类

1、创建Servlet实现类对象

Tomcat服务器有权创建Servlet实现类对象(动态资源文件实例对象),Tomcat通过创建Servlet实现类对象来执行对应的Servlet动态资源文件。

// 创建Servlet实现类对象
Servlet servletInstance = new servletInstance();

2、调用service()方法

Tomcat创建出Servlet实现类对象后,调用HttpServlet的service()方法来处理浏览器提交的请求。

// 调用service()方法处理浏览器请求,service()方法中封装了处理浏览器请求的方式
servletInstance.service();

3、调用doGet() doPost()

doGet() 或 doPost()的具体调用不需要程序员指定,而是由HttpServlet抽象类的Service()方法自动根据浏览器提交的方式判断来调用。

/**不需要关心:
 * HttpServlet类中封装了service()可以决定具体调用doGet() 或 doPost()
 *       service(){
 *          if(请求方式 == GET){
 *                   this.doGet
 *          }else if(请求方式 == POST){
 *                   this.doPost
 *          }
 *        }
*/
// 只需要关心:实现HttpServlet,并重写doGet() 和 doPost()
public class MyServletTest01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

四、ServletHttp服务器

4.1 ServletHttp服务器通信原理

Servlet与Http服务器交流图:

4.2 浏览器与servlet通信原理

  • 第一步:浏览器输入URL,在URL的最后面是动态资源文件的简短servlet名;
  • 第二步:浏览器提交URL请求,可选择get 或 post提交方式;
  • 第三步:Http服务器将URL转变成二进制;
  • 第四步:Http服务器根据二进制形式URL中的简短servlet名 到web.xml中匹配查找对应的servlet(具体是匹配web.xml中的<url-pattern>标签中的名字);
  • 第五步:Http服务器在web.xml内部根据<url-pattern>标签中的servlet简短名 找到同文件中 <servlet-name>的名字,最后找到真正的Servlet接口实现类;
  • 第六步:Http服务器找到Servlet接口实现类后,创建Servlet接口实现类对象;
  • 第七步:Http服务器创建Servlet接口实现类对象后,(继承的体现)调用父类HttpServlet的service()方法,获取浏览器提交请求的方式;
  • 第八步:Http服务器从HttpServlet处确定浏览器提交请求的方式,执行Servlet接口实现类中对应的doGet() 或 doPost()方法;
  • 第九步:将Servlet接口实现类执行doGet()或doPost()方法后的结果 返回给Http服务器;
  • 第十步:Http服务器将执行结果(包含返回的数据)转成二进制数据,原路发送回给浏览器。

4.3 总结

总的来说,当Servlet容器接收到用户的HTTP请求后,由容器负责把请求转换为HttpServletRequestHttpServletResponse对象,分别代表HTTP请求和响应,然后,经过若干个Filter组件(过滤器)后,到达最终的Servlet组件,由Servlet组件完成HTTP处理,将响应写入HttpServletResponse对象:

其中,ServletContext代表整个容器的信息,如果容器实现了ServletContext接口,也可以把ServletContext可以看作容器本身。ServletContextHttpServletRequestHttpServletResponse都是接口,具体实现由Web服务器完成。FilterServlet组件也是接口,但具体实现由Web App完成。此外,还有一种Listener接口(监听器),可以监听各种事件,但不直接参与处理HTTP请求,具体实现由Web App完成,何时调用则由容器决定。因此,针对Web App的三大组件:ServletFilterListener都是运行在容器中的组件,只有容器才能主动调用它们。(此处略去JSP组件,因为我们不打算支持JSP)

对于Jerrymouse服务器来说,开发服务器就必须实现Servlet容器本身,容器实现ServletContext接口,容器内部管理若干个ServletFilterListener组件。

对每个请求,需要创建HttpServletRequestHttpServletResponse实例,查找并匹配合适的一组Filter和一个Servlet,让它们处理HTTP请求。

在处理过程中,会产生各种事件,容器负责将产生的事件发送到Listener组件处理。

以上就是我们编写Servlet容器按照Servlet规范所必须的全部功能。


原文链接:https://www.jianshu.com/p/20cba5429c85

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 725. Split Linked List in Parts【链表】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【python手写算法】逻辑回归实现分类(含公式推导)

公式推导&#xff1a; 代码实现&#xff1a; # codingutf-8 import matplotlib.pyplot as plt import numpy as npdef f(w1,x1,w2,x2,b):zw1*x1w2*x2breturn 1/(1np.exp(-z)) if __name__ __main__:X1 [12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,2.1…

优先发展非化石能源

生态兴则文明兴。面对气候变化、环境风险挑战、能源资源约束等日益严峻的全球问题&#xff0c;中国树立人类命运共同体理念&#xff0c;促进经济社会发展全面绿色转型&#xff0c;努力推动本国能源清洁低碳发展。 智慧光伏遮阳伞&#xff0c;搭配座椅设置智能补给休息区&#x…

数据结构--- 树

(一)知识补充 定义 树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。​ 它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点;每一个非根…

unipush2.0实现APP消息推送(1)

一、 基础概念 1.1 首先理解什么是消息推送&#xff1f; 比如&#xff1a;你手机收到未读消息后会在通知栏显示&#xff0c;该条消息便是某APP的消息推送。多用于有需要从服务端主动发出消息提醒到客户端的场景。 1.2 uniPush & 个推 & 厂商推送的区别 方式个推uni…

js摄像头动态检测

利用摄像头每一秒截图一次图像。然后计算2次图像之间的相似度。 如果相似度低于98%就会报警。 var video document.getElementsByClassName(inputvideo)[0]; video.innerHTML "<video classinput_video idcamera autoplay width640px height380px></video>…

LeetCode 1123. Lowest Common Ancestor of Deepest Leaves【树,DFS,BFS,哈希表】1607

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

2023高教社杯数学建模C题思路模型 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

X86_64函数调用汇编程序分析

X86_64函数调用汇编程序分析 1 X86_64寄存器使用标准2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a…

【工作技术栈】【源码解读】一次springboot注入bean失败问题的排查过程

目录 前言现象分析原因解决方法思考感悟 前言 对这次的过程排查如果要形容的话&#xff0c;我觉得更像是悬疑剧&#xff0c;bean not found 这种错误&#xff0c;已经看腻了&#xff0c;甚至有时候都看不起这种错误&#xff0c;但是似乎这个想法被springboot听见了&#xff0c…

spring-security-源码解析+自定义拓展

1.参考文档 https://docs.spring.io/spring-security/reference/5.7/servlet/architecture.html 1.1.各种filterchain 1.1.1.SecurityFilterChain 1.1.2.springSecurityFilterChain 1.1.3.Security Filters 2.几个重要的注解 2.1.EnableXXX EnableWebMvcSecurity–deprecate…

C语言之初阶总结篇

目录 NO.1 NO.2 NO.3 NO.4 NO.5 NO.6 NO.7 NO.8 NO.9 NO.10 NO.11 NO.12.概念tips NO.13.求最小公倍数 NO.14.最大公因数 NO.15.输入读取字符串 NO.16.倒置字符串 今天是一些C语言题目&#xff0c;最近天气炎热&#xff0c;多喝水。 NO.1 下面程序执行后&am…

浅谈泛在电力物联网、能源互联网与虚拟电厂

导读&#xff1a;从能源互联网推进受阻&#xff0c;到泛在电力物联网名噪一时&#xff0c;到虚拟电厂再次走向火爆&#xff0c;能源领域亟需更进一步的数智化发展。如今&#xff0c;随着新型电力系统建设推进&#xff0c;虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…

LLMs之Baichuan 2:《Baichuan 2: Open Large-scale Language Models》翻译与解读

LLMs之Baichuan 2&#xff1a;《Baichuan 2: Open Large-scale Language Models》翻译与解读 导读&#xff1a;2023年9月6日&#xff0c;百川智能重磅发布Baichuan 2。科技论文主要介绍了Baichuan 2&#xff0c;一个开源的大规模语言模型&#xff0c;以及其在多个领域的性能表现…

与 vmx86 驱动程序的版本不匹配: 预期为 410.0,实际为 401.0

与 vmx86 驱动程序的版本不匹配: 预期为 410.0&#xff0c;实际为 401.0。 驱动程序“vmx86.sys”的版本不正确。请尝试重新安装 VMware Workstation。 我电脑历史上装过几个版本的vmware workstation: 怀疑是不兼容版本生成的vmx.86.sys 在系统中和该软件冲突&#xff0c;又没…

【完整代码】2023数学建模国赛C题代码--蔬菜类商品的自动定价与补货决策

C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需 求情况每天进…

java+ssh+mysql智能化办公管理系统

项目介绍&#xff1a; 本系统为基于jspsshmysql的OA智能办公管理系统&#xff0c;包含管理员、领导、员工角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;公告信息&#xff1b;工作计划&#xff1b;公司资料&#xff1b;部门管理&#xff1b;员工管理&#xff1b;员…

软件测试/测试开发丨Linux进阶命令

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27139 一、Linux进阶命令学习 curljq 二、curl简介 curl 是一个发送请求数据给服务器的工具 curl支持的协议有&#xff1a;FTP、FTPS、HTTP、HTTP、SFTP…

深度学习推荐系统(七)NFM模型及其在Criteo数据集上的应用

深度学习推荐系统(七)NFM模型及其在Criteo数据集上的应用 1 NFM模型原理及其实现 1.1 NFM模型原理 无论是 FM&#xff0c;还是其改进模型FFM&#xff0c;归根结底是⼀个⼆阶特征交叉的模型。受组合爆炸问题的困扰&#xff0c;FM 几乎不可能扩展到三阶以上&#xff0c;这就不…

sonarqube的基本使用

操作截图 下载一个中文插件。 插件安装成功&#xff0c;提示需要重启sonarqube。 通过maven的命令对代码进行测试 找到maven。 修改apache-maven-3.6.1\setting.xml。 通过以下命令对当前代码进行质量检测。 检测完毕。 回到sonarqube&#xff0c;看到刚刚检测的结果…