一、背景

开发了很久的web服务,使用了很多web框架,都忘记web技术最原始的模样了,今天来回顾下。

二、Servlet是什么?

Servlet是sun公司提供的一门用于开发动态web资源的技术。我们普通的Java类实现了Servlet接口后,可将我们的服务部署在Web容器中,这样我们的服务就可以提供Web服务了。

在Web服务器中,用于处理客户端HTTP请求的Java对象,可以类比于Spring MVC中的Controller。

Servlet接口不在JDK中,因为Servlet属于JavaEE,是另一套类库(JavaSE与JavaEE的区别)。

Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。

三、Servlet与SpringBoot关系

Servlet与SpringBoot的前世今生_DanceDonkey的博客-CSDN博客_springboot和servlet的关系

可以说,Servlet就是SpringBoot在web服务的底层代码。

Servlet 是 Sun 公司所设计开发的可以用于接收和处理 HTTP 请求的 Java 类。

Spring MVC 这样的框架就是对 Servlet 的二次封装,能够帮助我们自动的从 HTTP 请求中获得请求参数等工作,让我们可以将精力集中在业务代码上。

如果你使用过 Spring MVC 的,你就知道 Spring MVC 框架要想启动,必须配置 Spring MVC 最核心的一个类,DispatcherServlet,这个类就是 Servlet,没有这个核心类,你连整个 Spring MVC 框架都启动不了。

Spring Boot 其实就是对 Spring MVC 的二次封装,能够使我们不在困于 Spring MVC 繁琐的 XML 配置中,能够实现开箱即用的便利程度。因此 Spring Boot 的底层就是 Spring MVC,而 Spring MVC 的底层就是 Servlet。

四、如何使用Servlet搭建web服务?

1、依赖引入

需要在pom.xml中添加servlet依赖,然后才可以在项目中使用HttpServlet


  1. <!--加入servlet依赖(servlet的jar)-->
  2. <dependency>
  3. <groupId>javax.servlet</groupId>
  4. <artifactId>javax.servlet-api</artifactId>
  5. <version>4.0.1</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. <!--jsp的依赖(jsp相关的jar加进来)-->
  9. <dependency>
  10. <groupId>javax.servlet.jsp</groupId>
  11. <artifactId>javax.servlet.jsp-api</artifactId>
  12. <version>2.2.1</version>
  13. <scope>provided</scope>
  14. </dependency>

2、编写接口服务类

接口类需要继承javax.servlet.http.HttpServlet。

假设定义的类叫HelloServlet


  1. public class HelloServlet extends HttpServlet{
  2. //初始化servlet,调用init方法
  3. @Override
  4. public void init() throws ServletException {
  5. System.out.println("初始化时调用");
  6. }
  7. //开启服务
  8. @Override
  9. protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
  10. System.out.println("开启服务时调用");
  11. }
  12. @Override
  13. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. }
  15. //销毁时调用destory
  16. @Override
  17. public void destroy() {
  18. System.out.println("销毁时调用");
  19. }
  20. }

3、在web.xml文件中注册Servlet类


  1. <!--任何一个servlet都对应一个servlet-mapping-->
  2. <servlet>
  3. <servlet-name>hello</servlet-name>
  4. <!--这个位置必须是带有包名的全限定类名-->
  5. <servlet-class>com.qiyi.HelloServlet</servlet-class>
  6. </servlet>
  7. <!--servlet映射信息-->
  8. <servlet-mapping>
  9. <!--这里随意填写,但是名字必须与上方相同-->
  10. <servlet-name>hello</servlet-name>
  11. <!-这里需要一个路径,必须以/开始,可以随便写-->
  12. <url-pattern>/sdafs/sada/ds</url-pattern>
  13. </servlet-mapping>

4、启动Tomcat服务器

五、Servlet生命周期

1、图解说明

2、说明

  • 初始化阶段,Servlet容器(Tomcat)会创建一个Servlet实例并调用【init()】方法;

    • init()方法只会被调用一次,是在第一次访问(or 创建) Servlet 的时候被调用,在后续的每次请求时都不会再调用 init() 方法了
  • 处理客户端请求阶段,每收到一个客户端请求,服务器就会产生一个新的线程去处理;
  • 终止阶段,调用destroy方法终止。

3、生命周期方法执行流程

  • 当请求发送到 Web 容器后,Web 容器会解析请求 URL并从中分离出 Servlet 对应的URI。
  • 根据分离出的 URI通过 web.xml 中配置的 URI 与 Servlet 的映射关系,找到要执行的Servlet即找到用于处理该请求的 Servlet。
  • 若该 Servlet 不存在则调用该 Servlet 的无参构造器、init()方法实例化该 Servlet。然后执行 service()方法。
    • 默认情况下,Servlet 在 Web 容器启动时是不会被实例化的
  • 若该 Servlet 已经被创建,则直接调用 service()方法。
    • 用户每提交一次对当前 Servlet 的请求,就会执行一次 service()方法。
    • service()会根据请求的method判断是调用doPost()方法还是doGet()方法
  • 当 Web 容器被关闭或该应用被关闭,则调用执行 destroy()方法销毁 Servlet 实例。
    • 每个 Servlet 实例只会执行一次 destroy()方法,在应用停止时执行。

六、Servlet规范三大组件

1、介绍

Servlet规范三大件分别是:servlet、过滤器、监听器

2、拦截器与过滤器区别

拦截器核心原理:AOP思想

过滤器是Servlet的技术。

执行顺序不同:所有的请求都是先经过过滤器,最后离开过滤器,中间执行的拦截器的方法。拦截器是在dispatcherservlet这个servlet中执行的。如下图所示:

SpringMVC拦截器处理流程:

拦截器与过滤器的区别:

springMVC之mvc:interceptors拦截器的用法_仓颉大哥的博客-CSDN博客_mvc:interceptors


  1. 1 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2. 2 过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器。
  3. 3 过滤器可以拦截几乎所有的请求(包含对静态资源的请求),而拦截器只拦截action请求(不拦截静态资源请求)。
  4. 4 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5. 5 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  6. 6 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
  7. 7 拦截器是被包裹在过滤器之中。

七、

参考:Servlet、监听器、过滤器总结复习_HairLossException的博客-CSDN博客

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览106747 人正在系统学习中

[转帖]总结:Servlet的更多相关文章

  1. [转帖]浅析Servlet执行原理

    浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...

  2. 【转帖】Servlet 3.0 新特性详解

    http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 ...

  3. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (3):部署設定及應用 (转帖)

    說明:這一篇主要是說明如何將程式部署到Application Server,以及程式如何運作,產生的檔案置於何處,以及如何以瀏覽器呈現(Applet),或是當成桌面應用程式,或是 桌面Applet,這 ...

  4. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)

    說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ...

  5. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet (转帖)

    JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet 功能:這支程式的主要功能是將 javafx 與 swi ...

  6. JSP+Servlet+javabean+oracle实现页面多条件模糊查询

    之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写or ...

  7. JSP+Servlet+javabean+mysql实现页面多条件模糊查询

    需求: 一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法: 需要实现的界面原型:要满足条件: 1.单选分类,点GO按扭 2.单独输入标 ...

  8. 【java】基于Tomcat的WebSocket转帖 + 自己理解

    网址:http://redstarofsleep.iteye.com/blog/1488639 原帖时间是2012-5-8,自己书写时间是2013年6月21日10:39:06 Java代码 packa ...

  9. 在使用cognos时遇到的问题记录帖

    在使用cognos时遇到的问题记录帖 1.开一个project 报无法访问位于 URL 的服务: http://localhost:80/ibmcognos/cgi-bin/cognos.cgi?b_ ...

  10. servlet什么时候被实例化?【转】

    如果没有设置loadOnStartup,则第一次请求的时候实例化 分三种情况:loadOnStartup < 0 即负数的情况下,web容器启动的时候不做实例化处理,servlet首次被调用时做 ...

随机推荐

  1. 9个SQL运维常遇到的问题

    摘要:本文重点介绍单个SQL语句持续执行慢的场景. 本文分享自华为云社区<GaussDB(DWS) SQL性能问题案例集>,作者:黎明的风. 本文重点介绍单个SQL语句持续执行慢的场景.我 ...

  2. 应对全场景AI框架部署挑战,MindSpore“四招”让你躺平

    摘要:所谓全场景AI,是指可以将深度学习技术快速应用在云边端不同场景下的硬件设备上,包括云服务器.移动终端以及IoT设备等等,高效运行并能有效协同. 本文分享自华为云社区<AI框架的挑战与Min ...

  3. 【CVPR2022】用于域适应语义分割的域无关先验

    摘要:本文给大家分享一篇我们在CVPR 2022 上发表的paper:Domain-Agnostic Prior for Transfer Semantic Segmentation.文章提出了一种图 ...

  4. 被灵魂问倒:这个BUG为什么没测出来?

    摘要:为什么没测出来!测试怎么测得?到底会不会测?这对测试来说是灵魂拷问级别不好回答的问题了. 本文分享自华为云社区<被问:这个BUG为什么没测出来?该如何回答>,作者: 曲鸟. 一.前言 ...

  5. 火山引擎 DataTester:5 个优化思路,构建高性能 A/B 实验平台

    导读:DataTester 是由火山引擎推出的 A/B 测试平台,覆盖推荐.广告.搜索.UI.产品功能等业务应用场景,提供从 A/B 实验设计.实验创建.指标计算.统计分析到最终评估上线等贯穿整个 A ...

  6. Solon v2.2.12 发布,Java 应用开发框架

    Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它不是 Spring.没有使用 Servlet.JavaEE 接口,是一个有自己接口标准的开放生态: 150多个生态插件,可以满足 ...

  7. Python使用pandas库读取csv文件,并分组统计的一个例子

    代码: # coding=gbk # 从HostWrites.csv读取数据并分组统计 import pandas import datetime print "\r\n从 HostWrit ...

  8. 如何在Windows中使用Telnet客户端

    Telnet协议的解释 Telnet( TE终端NET工作的缩写)是一种网络协议,用于提供与设备通信的命令行界面 . Telnet最常用于远程管理,但有时也用于某些设备的初始设置,尤其是交换机 ,接入 ...

  9. Codeforce:Good Bye 2020 个人题解

    题面链接:Here 代码提交:Here 年终彩蛋 1466A. Bovine Dilemma 题意是:给定一个固定点(0,1),然后给定n个在x轴的点,求面积不同的三角形个数 简单思考一下就容易发现这 ...

  10. 深入剖析 RSA 密钥原理及实践

    一.前言 在经历了人生的很多至暗时刻后,你读到了这篇文章,你会后悔甚至愤怒:为什么你没有早点写出这篇文章?! 你的至暗时刻包括: 1.你所在的项目需要对接银行,对方需要你提供一个加密证书.你手上只有一 ...