tomcat + spring mvc 原理(一):tomcat原理综述和静态架构

  • tomcat + spring mvc的运作模式
  • tomcat内部的基本容器构成
  • tomcat容器对应的外部配置

tomat + spring mvc 是目前比较流行java微服务体系架构,包括现在的spring boot以及基于spring boot的进一步应用化封装的spring cloud框架,底层都是基于tomcat + spring mvc的框架。因此学习tomcat + spring mvc的基础原理,对于解决使用中出现的问题会有比较大的帮助。

tomcat + spring mvc的运作模式

理解tomcat+spring mvc的工作原理之前,最好能自己配置一下tomcat环境,然后部署一个spring mvc服务,实际感受一下整个流程,对tomcat和spring mvc暴露在外的配置有一个大概的了解。这样有了感性的认识之后,再深入了解原理,会有比较好的理解。网上已经有很多比较详细的关于tomcat环境搭建的文章,这里我就不再赘述。
    传统的使用tomcat + spring mvc框架的服务在开发之前,需要先行配置tomcat的环境。这个过程包括下载和安装tomcat,配置环境变量,修改tomcat的配置文件,最后运行tomcat。对,你没看错,tomcat独立运行,而spring mvc的服务是tomcat运行时加载的。基于spring mvc框架的服务可以在流行的java IDE中自动创建,比如eclipse或者idea。自动创建的工程基本配置已经写入,你可以直接动手书写业务代码,这也是这种架构的显著优势。当然你也可以创建一个空的项目,自行配置。总的来说,spring mvc基于xml或者java代码的config文件的配置是比较繁琐的。项目最后需要打包成一个war文件,复制到tomcat的指定目录下,tomcat会自动解包加载,然后基于你的配置,访问指定端口的指定路由链接,就可以请求服务器的信息应答。
    显然,这种运作模式要求:tomcat需要有监视指定目录,一旦有新的war包加入,就完成解包并动态加载编译后的class的能力;tomcat需要有网络端口开闭和监视的机制,维护线程池来处理随时可能到来的请求;tomcat还需要将到来的请求顺利地传递给spring mvc服务,然后再将服务返回的数据发送出去。

tomcat内部的基本容器构成

所谓容器(Container),并不是常说的用来存储数据结构的类,比如Collection、Set、List等,而是专指tomcat和spring mvc中用来对功能和结构进行分层抽象的概念(类或者接口)。tomcat的基本容器结构如图所示:

    tomcat最顶层的容器Server,代表整个tomcat服务器,一个Server可以包含一个或者多个Service。一个Service包含一个或者多个Connetor,但是只能包含一个Container。Connector主要用来处理连接相关的事,比如网络套接字Socket的监听、请求request的接收和应答response的发送。这里的Container是一个抽象的概念,一个接口。其实是指一个Service只能包含一个Engine–Engine继承自Container。Engine容器结构如图所示:

其中Engine、Host、Context和Wrapper都继承自Container。
    Engine用来管理多个站点,即可以有多个Host。Host代表一个站点,其实是一个虚拟主机。Context,上下文,代表一套应用程序,一套应用程序总是有相同的应用上下文配置。最后是Wrapper,每个wrapper只有一个Servlet,而每个Servlet即对应每个开发的spring mvc服务程序。所以我们开发的spring mvc服务程序都是通过Wrapper加载到tomcat中。Context和Wrapper是动态添加的,我们在tomcat的指定目录下每添加一个war包,tomcat加载war包时,就可以添加Context和Servlet。

tomcat容器对应的外部配置

之所以强调学习原理之前,最好先自己配置tomcat环境和部署一个spring mvc服务程序,是因为tomcat的很多配置和内部容器相关。外部感性理解和对内部原理的理性理解的结合,有益于认知的深入和记忆。
    在tomcat的安装目录下(使用linux yum安装的默认目录在/usr/local/tomcat下,其他系统和安装方法的目录需要百度),有一个conf文件夹,里面存放着一些tomcat层次的容器配置。server.xml配置了Server容器下Service、Connector、Engine和Host的配置,格式类似上图所显示的嵌套结构,不过是以xml的形式。以其中一个Connector配置为例:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />

上面说到Connector主要用来处理连接相关的事,比如网络套接字Socket的监听、请求request的接收和应答response的发送。所以这里就配置了端口、网络协议、连接超时时间和重定向端口。其他容器的配置也比较类似,可以自行打开浏览一下。conf目录下的context.xml文件存放Context容器的配置:

<Context><!-- Default set of monitored resources. If one of these changes, the    --><!-- web application will be reloaded.                                   --><WatchedResource>WEB-INF/web.xml</WatchedResource><WatchedResource>${catalina.base}/conf/web.xml</WatchedResource><!-- Uncomment this to disable session persistence across Tomcat restarts --><!--<Manager pathname="" />-->
</Context>

内部主要包括了两个web.xml的目录配置。按照上文所讲的容器结构,Context容器可以中可以有一个或者多个Wrapper,每个Wrapper中包含一个Servlet,Servlet就是我们开发的spring mvc 服务程序。web.xml里写的是spring mvc Servlet的相关配置,一般的spring mvc项目中会有一个WEB-INF目录,内部包含一个自己配置的web.xml文件。另一个是tomcat默认的web.xml的配置,可以看到就是conf目录下的web.xml,这个默认配置是针对所有部署在tomcat中的spring mvc程序。具体关于web.xml配置内容的解释,放在后面的spring mvc原理综述中。

系列文章:

tomcat + spring mvc原理(二):tomcat容器初始化加载和启动
tomcat + spring mvc原理(三):tomcat网络请求的监控与处理1
tomcat + spring mvc原理(四):tomcat网络请求的监控与处理2
tomcat + spring mvc原理(五):tomcat Filter组件实现原理

tomcat + spring mvc 原理(一):tomcat原理综述和静态架构相关推荐

  1. tomcat + spring mvc原理(二):tomcat容器初始化加载和启动

    tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...

  2. tomcat + spring mvc原理(六):tomcat WAR包的部署与加载

    tomcat + spring mvc原理(六):tomcat WAR包的部署与加载 前言 监控的启动原理 状态监听 部署项目 前言 单独部署的tomcat服务器在运行中,当开发人员或者运维人员将开发 ...

  3. 通过手写Spring MVC来理解其原理

    Spring MVC简单说,是Spring生态圈里的一个优秀的MVC框架,也可以认为是一个增强型的servlet(核心是DispatcherServlet,配置在web.xml中). Spring M ...

  4. [技术分享]-Servlet/tomcat/spring mvc之间关系

    首先,什么是Servlet?狭义的说,Servlet是JAVA提供的Servlet接口,我们可以看一眼Servlet接口的定义: [java] view plain copy A servlet is ...

  5. 【每日一篇】Servlet/tomcat/spring mvc之间关系

    首先,什么是Servlet?狭义的说,Servlet是JAVA提供的Servlet接口,我们可以看一眼Servlet接口的定义: A servlet is a small Java program t ...

  6. Spring MVC执行流程及原理

    面试找虐 博主之前每次去面试必问的问题:"讲一下spring mvc的执行流程以及常用组件的作用": 记得第一次和面试官说了大概的流程是这样的:"服务器收到一个请求后会先 ...

  7. spring mvc DispatcherServlet详解之前传---前端控制器架构

    前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端.前端控制器既可以使用Filter实现 ...

  8. 面试:给我说一下Spring MVC拦截器的原理?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/namaQ ...

  9. 面试官:给我说一下 Spring MVC 拦截器的原理?

    前言 SpringMVC是目前主流的Web MVC框架之一. 拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原 ...

最新文章

  1. 一段处理百分数的js代码
  2. python在线-python+在线
  3. 写在园子里的第一篇BLOG
  4. python狗狗年龄换算_Python之美——一只数据狗的笔记[长期更新]
  5. 事物Spring boot @Transactional
  6. 计算机视觉领域热门研究方向state-of-art算法实时更新
  7. PagingAndSortingRepository –如何与Thymeleaf一起使用
  8. struts2 防止重复提交 与 进入等待画面
  9. L1-046 整除光棍 (20 分)567
  10. 计算机专业本科毕业转行会计,大学里就业最难的5个专业,毕业后难找工作,很多同学都转行了!...
  11. shell高级脚本:“秒”转换为“时-分-秒”;ping
  12. pool win10提示bad_快速解决Win10出现Bad pool caller蓝屏故障的技巧
  13. caffe+vs2013+window10+GPU(CPU)配置
  14. 报名 | 旷视研究院解读COCO2017人体姿态估计竞赛冠军论文
  15. vue 如何调用微信分享_Vue开发 添加微信分享功能(全局分享)
  16. python入门基础知识实例-Python入门基础知识实例,值得收藏!
  17. HTTP协议基本原理简介(二)
  18. android studio for android learning (十六) support-annotations简介
  19. 85条高级AutoCAD工程师绘图技巧(2)
  20. Java虚拟机周志明Eason-zhang解读

热门文章

  1. emqttd 0.9.0版本的会话(Session)、消息队列(MQueue)、飞行窗口(Inflight Window)设计
  2. JS任意元素的任意值运动
  3. 初识激光雷达 SLAM
  4. plsql developer怎么打开sql文件
  5. 如何爬取微博全部粉丝python_让你了解python的强大!【 登录新浪微博爬取粉丝信息】...
  6. 微软手环2服务器,微软手环2怎么重刷固件?
  7. 微软CVE-2023-28252漏洞
  8. git 回滚远程分支
  9. Unity中动画切换
  10. flume 单机问题解决与架构更改