【Java Web】Servlet规范讲解

目录

一、前言

二、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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}@Overrideprotected 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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}@Overrideprotected 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.mzph.cn/news/71842.shtml

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

相关文章

Java-day13(IO流)

IO流 凡是与输入&#xff0c;输出相关的类&#xff0c;接口等都定义在java.io包下 1.File类的使用 File类可以有构造器创建其对象&#xff0c;此对象对应着一个文件(.txt,.avi,.doc,.mp3等)或文件目录 File类对象是与平台无关的 File中的方法仅涉及到如何创建&#xff0c;…

OpenCV(二十三):中值滤波

1.中值滤波的原理 中值滤波&#xff08;Median Filter&#xff09;是一种常用的非线性图像滤波方法&#xff0c;用于去除图像中的椒盐噪声等离群点。它的原理是基于邻域像素值的排序&#xff0c;并将中间值作为当前像素的新值。 2.中值滤波函数 medianBlur() void cv::medianBl…

怎么把视频转换成mp4格式

怎么把视频转换成mp4格式&#xff1f;如今&#xff0c;随着科技的不断发展&#xff0c;我们在工作中接触到的多媒体视频格式也越来越多。其中&#xff0c;MP4作为一种广泛兼容的视频格式&#xff0c;在许多软件中都能轻松播放&#xff0c;并且成为了剪辑与裁剪视频时大家常用的…

2023年高教社杯数学建模国赛 赛题浅析

2023年国赛如期而至&#xff0c;为了方便大家尽快确定选题&#xff0c;这里将对赛题进行浅析&#xff0c;以分析赛题的主要难点、出题思路以及选择之后可能遇到的难点进行说明&#xff0c;方便大家尽快确定选题。 难度排序 B>A>C 选题人数 C>A>B (预估结果&…

机器学习笔记之最优化理论与方法(三)凸集的简单认识(下)

机器学习笔记之最优化理论与方法——凸集的简单认识[下] 引言回顾&#xff1a;基本定义——凸集关于保持集合凸性的运算仿射变换 凸集基本性质&#xff1a;投影定理点与凸集的分离支撑超平面定理 引言 继续凸集的简单认识(上)进行介绍&#xff0c;本节将介绍凸集的基本性质以及…

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客 一些题目整理&#xff0c;附带大佬的解释 1.go中哪些值不能寻址& 常量&#xff08;const常量&#xff0c;字面值3.14&#xff0c;字符串“xxx”&#xff0c;函数或方法, map的val值&#xff09; golang中接…

OpenCV(二十五):边缘检测(一)

目录 1.边缘检测原理 2.Sobel算子边缘检测 3.Scharr算子边缘检测 4.两种算子的生成getDerivKernels() 1.边缘检测原理 其原理是基于图像中灰度值的变化来捕捉图像中的边界和轮廓。梯度则表示了图像中像素强度变化的强弱和方向。 所以沿梯度方向找到有最大梯度值的像素&…

Linux网络编程 网络基础知识

目录 1.网络的历史和协议的分成 2.网络互联促成了TCP/IP协议的产生 3.网络的体系结构 4.TCP/IP协议族体系 5.网络各层的协议解释 6.网络的封包和拆包 7.网络预备知识 1.网络的历史和协议的分成 Internet-"冷战"的产物 1957年十月和十一月&#xff0c;前苏…

C#__线程的优先级和状态控制

线程的优先级&#xff1a; 一个CPU同一时刻只能做一件事情&#xff0c;哪个线程优先级高哪个先运行&#xff0c;优先级相同看调度算法。 在Thread类中的Priority属性&#xff08;Highest,Above,Normal,BelowNormal,Lowest&#xff09;可以影响线程的优先级 关于…

swiper删除虚拟slide问题

在存在缓存的情况下&#xff0c;删除较前的slide&#xff0c;会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide&#xff0c;且这5个slide已缓存&#xff0c;则删除slide2后&#xff0c;仍为5个slide&#xff0c;且slide2的内容变为slide3的内容&#xff0c;此…

Pushgetway安装和使用

1、Pushgetway安装和使用 1.1 Pushgateway是什么 pushgateway 是另一种数据采集的方式&#xff0c;采用被动推送来获取监控数据的prometheus插件&#xff0c;它可以单独运行在 任何节点上&#xff0c;并不一定要运行在被监控的客户端。 首先通过用户自定义编写的脚本把需要监…

记一次时间序列算法的自回归预测--ARAutoreg

背景 最近公司给客户要做一些数据的预测&#xff0c;但是客户不清楚哪些做起来比较符合他们的&#xff0c;于是在经过与业务方的沟通&#xff0c;瞄准了两个方面的数据 1.工程数据&#xff1a;对工程数据做评估&#xff0c;然后做预警&#xff0c;这个想法是好的&#xff0c;…

DGIOT-Modbus-RTU控制指令05、06的配置与下发

[小 迪 导 读]&#xff1a;伴随工业物联网在实际应用中普及&#xff0c;Modbus-RTU作为行业内的标准化通讯协议。在为物联网起到采集作用的同时&#xff0c;设备的控制也是一个密不可分的环节。 场景解析&#xff1a;在使用Modbus对设备进行采集后&#xff0c;可以通过自动控制…

多波束测线问题

多波束测线问题 问题的背景是海洋测深技术&#xff0c;特别是涉及单波束测深和多波束测深系统。这些系统利用声波传播原理来测量水体深度。 单波束测深系统通过向海底发射声波信号并记录其返回时间来测量水深。该系统的特点是每次只有一个波束打到海底&#xff0c;因此数据分布…

理解项目开发(寺庙小程序)

转载自&#xff1a;历经一年&#xff0c;开发一个寺庙小程序&#xff01; (qq.com) 破防了&#xff01;为方丈开发一款纪念小程序&#xff01; (qq.com) 下面内容转载自&#xff1a;程序员5K为青岛啤酒节开发个点餐系统&#xff01; (qq.com) 看一个人如何完成一个项目的开发…

CSS笔记(黑马程序员pink老师前端)浮动,清除浮动

浮动可以改变标签的默认排列方式。浮动元素常与标准流的父元素搭配使用. 网页布局第一准则:多个块级元素纵向排列找标准流&#xff0c;多个块级元素横向排列找浮动。 float属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框…

分类预测 | MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测

分类预测 | MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测 目录 分类预测 | MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 MATLAB实现PCA-LSTM(主成分长短期记忆神经网络)分类预测。Matlab实现基于P…

【java】【项目实战】[外卖十一]项目优化(Ngnix)

目录 一、Nginx概述 1、Nginx介绍 2、Nginx下载和安装 3、Nginx目录结构 二、Nginx命令 1、查看版本 2、检查配置文件正确性 3、启动和停止 4、重新加载配置文件 三、Nginx配置文件结构 1、全局块 2、events块 3、http块 四、Nginx具体应用 1、部署静态资源 2、…

LeetCode 904. 水果成篮

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 在你去摘水果的时候&#xff0c;你当前只能拥有两种种类的水果&#xff0c;若想拿第三种水果&#xff0c;就需要发下前两种水果中的一种。 法一&#xff1a;滑动窗口哈希表(未优化…

【Linux】shell脚本和bat脚本:

文章目录 一、脚本对应环境&#xff1a;【1】shell&#xff1a;linux环境&#xff1b;后缀名为.sh【2】bat&#xff1a;windows环境&#xff1b;后缀名为.bat或者.cmd 二、脚本执行&#xff1a;【1】shell执行【2】bat脚本执行 三、脚本相关命令&#xff1a;1. shell命令【1】s…