Java教程

Servlet、Tomcat、SpringMVC-整理-随笔

本文主要是介绍Servlet、Tomcat、SpringMVC-整理-随笔,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

最近回顾一下Servlet、Tomcat、SpringMVC。
该文章主要用于我自己回顾复习,阅读的话,需要之前就至少对Servlet、Tomcat、SpringMVC至少有基础认知。

1. Servlet

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等问题),不由它处理。

2. Tomcat

谈谈 Tomcat 请求处理流程
几个概念:Servlet、Servlet容器、Tomcat

Tomcat是一个经典的web容器。(过去常作为servlet容器)

  • Acceptor(单个或多个对象,单/多线程执行)接收socket连接请求,将socket封装后再传给Poller(单个或多个对象,早期版本tomcat多个Poller,tomcat9之后改成单个Poller -> 不是重点,单/多线程执行)
  • Poller专门监听socket的状态(可读、可写等),监听到socket状态改变,再进行一些封装,将具体的数据处理任务丢给worker线程组
  • worker线程组真正进行数据处理。

如果这里tomcat配套servlet,那么worker相当于按照servlet给定的HTTP处理方案进行数据处理。

  • tomcat这里作为servlet容器,通过不同线程去调用serlvet的service()方法完成HTTP请求的数据加工。
  • tomcat完全可以同时有多个线程使用同一个serlvet的service()方法。(最后调用servelt的init()、service()、destroy()的即worker线程组)
  • tomcat以单例的形式管理servlet(即每个URL对应一个servlet实例,单实例多线程)

3. SpringMVC

关于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()方法实现)

4. 总结

可以简单理解如下:
tomcat 处理网络请求;
servlet 只负责说 具体怎么处理数据和返回数据(真实的TCP什么处理和他没关系)
springMVC就是高级servlet,可以理解为Servlet的”语法糖“。

tomcat 管理多个servlet单例,每个servlet对应一个URL正则表达式(比如/person/*,访问/person/a,person/b)都是这个servlet。

这里tomcat 处理网络请求,然后根据配置文件看这个网络请求的URL调用哪个 单例Servlet的service()方法处理数据。

这篇关于Servlet、Tomcat、SpringMVC-整理-随笔的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!