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] ~小尾巴~
  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/Ashiamd/p/15085668.html
Copyright © 2011-2022 走看看