[转帖]总结:Servlet

总结,servlet · 浏览次数 : 0

小编点评

**背景** * web服务开发长达几年,使用多种web框架,忘记web技术最原始的形式。 * 回顾和理解web技术最原始的形式。 **Servlet** * 是sun公司提供的一门用于开发动态web资源的技术。 * 实现Servlet接口后,可将我们的服务部署在Web容器中,这样我们的服务就可以提供Web服务了。 * 在Web服务器中,用于处理客户端HTTP请求的Java对象,可以类比于Spring MVC中的Controller。 **Servlet与SpringBoot关系** * Servlet与SpringBoot的前世今生_DanceDonkey的博客-CSDN博客_springboot和servlet的关系可以说,Servlet是SpringBoot在web服务的底层代码。 * Servlet 是 Sun 公司所设计开发的,可以用于接收和处理 HTTP 请求的 Java 类。 * Spring MVC 这样的框架就是对 Servlet 的二次封装,能够帮助我们自动的从 HTTP 请求中获得请求参数等工作,让我们可以将精力集中在业务代码上。 **如何使用Servlet搭建web服务** 1. 在pom.xml中添加servlet依赖。 2.编写接口服务类,继承javax.servlet.http.HttpServlet。 3.在web.xml文件中注册Servlet类。 4.启动Tomcat服务器。 5.Servlet生命周期方法执行流程。 **Servlet生命周期** * 初始化阶段:Servlet容器(Tomcat)会创建一个Servlet实例并调用【init()】方法; * 服务阶段:Servlet处理客户端请求,执行service()方法; * 终止阶段:调用destroy方法终止。 **Servlet规范三大组件** 1. Servlet:用于接收和处理 HTTP 请求。 2.过滤器:用于拦截请求,执行业务逻辑。 3. 监听器:用于监听应用程序中的事件,并在事件发生时执行相应的代码。

正文

一、背景

开发了很久的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相似的内容:

[转帖]总结:Servlet

一、背景 开发了很久的web服务,使用了很多web框架,都忘记web技术最原始的模样了,今天来回顾下。 二、Servlet是什么? Servlet是sun公司提供的一门用于开发动态web资源的技术。我们普通的Java类实现了Servlet接口后,可将我们的服务部署在Web容器中,这样我们的服务就可以

[转帖]总结:Springboot监控Actuator相关

一、介绍 由于项目中使用的仍然是比较老旧的1.5.6版本,所以本文是基于此版本进行描述。 二、Actuator使用 ActuatorActuator是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统

[转帖]总结:正则表达式

一、重要点整理 ^ 为匹配输入字符串的开始位置。 [0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。[^…] 排除型字符组。 abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。 正则表达式由两种字符构成。一种是在正则表达式中具体特殊意义的“元字符

[转帖]总结:nginx502:Tomcat调优之acceptCount

问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,因此本文即排查502报错原因。 如下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并不是超时) 先给出原因:是因为tomcat8默认的acceptCount是100,请求量大的时候,会将一些来不及处理的

[转帖]总结:协程与线程

一、介绍 本文主要梳理下进程,线程,协程的概念、区别以及使用场景的选择。 二、进程 我们知道,一切的软件都是跑在操作系统上,真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是 “单进程时代”。一切的程序只能串行发生。 早期的单进程操

[转帖]总结:Tomcat的IO模型

一、介绍 对于 linux 操作系统,IO 多路复用使用的是 epoll 方式,对于 windows 操作系统中 IO 多路复用使用的是 iocp 方式,对于 mac 操作系统 IO 多路复用使用的是 kqueue 方式。 由于对于 tomcat 服务器来说基本主要部署在 linux 操作系统上,所

[转帖]总结:记一次K8S容器OOM案例

一、背景 最近遇到个现象,hubble-api-open组件过段时间会内容占满,从而被K8S强制重启。 让我困惑的是,已经设置了-XX:MaxRAMPercentage=75.0,我觉得留有了一定的空间,不应该会占满,所以想深究下原因。 -XX:MaxRAMPercentage是设置JVM的最大堆内

[转帖]总结:SpringBoot启动参数配置

一、背景 由于项目中加了bootstrap.properties文件,且文件中有变量,如spring.cloud.config.profile=${spring.profiles.active},而bootstrap.properties读取的优先级高于application.properties,

[转帖]总结:shell中的if条件判断

一、if 的基本语法 if [ command ];then xxxelif [ command ];then xxxelse xxxfi 二、常见的一些写法案例 1、if [ "x${var}" = "x" ] 其实就是判断${var}是否为空的意思 2、if [ X"$?" == X"0" ]

[转帖]精华总结:10个问题理解 Linux epoll

epoll 是 linux 特有的一个 I/O 事件通知机制。很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣。近期学习、研究了 epoll 源码,在这个过程中关于 epoll 数据结构和作者的实现思路产生出不少疑惑,在此总结为了 10 个问题并逐个加以解答和分析。 本文基于的