最近回顾一下Servlet、Tomcat、SpringMVC。
该文章主要用于我自己回顾复习,阅读的话,需要之前就至少对Servlet、Tomcat、SpringMVC至少有基础认知。
Servlet 生命周期
Servlet与多线程的关系是什么?
servlet的生命周期,servlet是单线程还是多线程(基础问题
jsp页面第一访问时产生servlet,那么这个servlet何时被destroy?
Servlet(五):一个Servlet处理多个请求
Servlet可以理解为遵循某种规范的Java类,专门用于HTTP请求。
Servlet生命周期如下:
Servlet 初始化后调用 init () 方法。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 销毁前调用 destroy() 方法(由容器决定何时调用,要知道Servlet也是被JVM垃圾回收的,所以很容易理解的就是长时间不用、内存不足则被销毁)
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
Servlet只会执行一次init()和一次destroy()方法,而service()可以执行多次。(每次处理请求时,线程调用Servlet的service()方法,servlet)
一个servlet对应一个url正则表达式(比如 *.do 表示处理所有.do结尾的URL访问),所以多个url正则表达式需要注册多个servlet到web容器(web容器管理url和servlet之间的关系)
ps:别忘记了,线程(对操作系统层面来说其实就是特殊标识的进程)才是真正执行各种操作的“人”。
光有Servlet是无法真正完成HTTP请求的。这里还需要Servlet容器。
可以说Servlet只是提供了处理HTTP请求的方案,但是具体的网络处理(建立连接、socket等问题),不由它处理。
谈谈 Tomcat 请求处理流程
几个概念:Servlet、Servlet容器、Tomcat
Tomcat是一个经典的web容器。(过去常作为servlet容器)
如果这里tomcat配套servlet,那么worker相当于按照servlet给定的HTTP处理方案进行数据处理。
关于SpringMVC的基础介绍,文章就不找了,网上很全。
Servlet/Tomcat/ Spring 之间的关系
Servlet、web容器、springmvc之间的关系
SpringMVC中核心的DispatcherServlet其实就是高级版的Servlet,就是比原始的servlet更方便管理 URL 和 处理方法 的 映射关系。
前面的tomcat中我们一般一个Servlet只处理一个URL正则表达式(如果这个URL里面又细分,比如/person/add,/person/edit),那么我们假设tomcat如果注册某个servlet对应 /person/* (表达式不一定写对),那么Servlet类中的service()方法实现中,就需要再判断 具体是/add 还是/edit,然后再进行不同的逻辑处理。
而SpringMVC我们使用起来,直观的就是Controller中每个方法写明对应哪个URL就好了,简化了过去Servlet的service()方法处理分层次的URL(a/b/c/...)的流程。
可以粗略地把MVC里面的所有controller实现,理解成servlet的service()的升级版。有了MVC的请求流程,就不需要我们自己在Servlet的service()里再对不同层级的URL进行各种if判断走什么逻辑了(当然你用设计模式减少if的使用也行)
此时网络请求流程变成:
客户端 => tomcat => SpringMVC(本身可以理解为高级servlet,然后调用各种不同的controller,所有的controller组合起来,可以理解为高级的service()方法实现)
可以简单理解如下:
tomcat 处理网络请求;
servlet 只负责说 具体怎么处理数据和返回数据(真实的TCP什么处理和他没关系)
springMVC就是高级servlet,可以理解为Servlet的”语法糖“。
tomcat 管理多个servlet单例,每个servlet对应一个URL正则表达式(比如/person/*,访问/person/a,person/b)都是这个servlet。
这里tomcat 处理网络请求,然后根据配置文件看这个网络请求的URL调用哪个 单例Servlet的service()方法处理数据。