zoukankan      html  css  js  c++  java
  • 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()方法处理数据。

    (Ashiamd的github个人学习笔记)[https://ashiamd.github.io/docsify-notes/#/README] ~小尾巴~
  • 相关阅读:
    Java反射【三、方法的反射】
    Java反射【二、Class类的使用】
    Java反射【一、概述】
    MySql学习笔记【四、数据相关操作】
    MySql学习笔记【三、表相关操作】
    MySql学习笔记【二、库相关操作】
    MySQL 表查询
    MySQL 表之间的关系
    MySQL 数据类型
    数据库概念 MySQL语法
  • 原文地址:https://www.cnblogs.com/Ashiamd/p/15085668.html
Copyright © 2011-2022 走看看