文章目录

  • 一、服务器和容器
    • 1. Web服务器
    • 2. Web容器
      • ① Web容器的组成
      • ② Web容器的作用
    • 3. Servlet容器
      • ① Servlet容器的作用
      • ② Servlet容器的工作过程
      • ③ Servlet
      • ④ Servlet的工作过程
      • ⑤ Servlet变化过程
    • 4. Spring容器
    • 5. SpringMVC容器
    • 6. SpringBoot容器
  • 二、容器相关知识归纳
    • 1. 各种容器的管理范围
    • 2. 为何设计父子容器
    • 3. 父子容器的事务问题
  • 三、各种项目中的容器
    • 1. SpringMVC项目
      • ① 项目背景
      • ② Servlet容器
      • ③ SpringMVC容器
      • ④ 容器关系图
    • 2. Spring+SpringMVC项目
      • ① 项目背景
      • ② Servlet容器
      • ③ Spring容器
      • ④ SpringMVC容器
      • ⑤ 父子容器
      • ⑥ 容器创建过程
      • ⑦ 容器关系图
    • 3. SpringBoot项目
      • ① 项目背景
      • ② Servlet容器
      • ③ SpringBoot容器
      • ④ 容器创建过程
      • ⑤ 容器关系图

一、服务器和容器

1. Web服务器

广义的Web服务器(Web Server):提供web服务的软件或主机,即Web服务器软件或装有Web服务器软件的计算机。

Web服务器可以处理 HTTP 协议,响应针对静态页面或图片的请求(静态请求),进行页面跳转。

有的Web服务器还能处理动态请求,它会把动态请求委托其它程序(它的扩展、某种语言的解释引擎(php)、Web容器)。

常见的Web服务器有:Apache、IIS、Tomcat、Jetty、JBoss、webLogic等。

2. Web容器

Web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,这个程序就是用来处理从客户端发出的请求的。一个服务器可以有多个容器。

常见的Web容器有:IIS(asp容器)、Tomcat(servlet容器)、Jboss(EJB容器)。

其实现在在很多时候,大家对Web服务器和Web容器已经没有了明确的界限。通常把Web服务器和Web容器当成同一个东西在讲。

文章后面部分所讲的web容器都是以Tomcat容器为例。

① Web容器的组成

Web容器管理Servlet(通过Servlet容器)、监听器(Listener)、过滤器(Filter)等。

  • Servlet:称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,是一个Java类。它负责客户端和服务端的信息交互和处理。

    Servlet不能独立运行(没有main方法),必须存放在Servlet容器中,由Servlet容器去管理Servlet。

  • Filter:Servlet的作用是处理请求,而Filter的作用是拦截请求和放行,在拦截请求后可以修改request和response,实现我们想实现的功能。Filter不能产生一个请求或者响应,只是能对请求或者响应进行拦截。

  • Listener:监听器。它可以监听Application、Session、Request对象,当这些对象发生变化的时候就会调用对应的监听方法。

② Web容器的作用

  • 管理和布置Web应用
  • 响应针对静态页面或图片的请求(静态请求
  • 动态请求委托给其他程序(Servlet容器、CGI等等技术)

ServletFilterListener这些都是在Web容器的掌控范围里。但不在Spring容器和SpringMVC容器的掌控范围里。所以无法在这些类中直接使用Spring注解的方式来自动装配需要的对象,因为Web容器是无法识别Spring注解的。

Web容器没有Servlet容器,也是可以直接访问静态页面的,比如Apache服务器。但是如果要显示jsp/servlet,就必需要Servlet容器。可是光有Servlet容器也是不够的,因为它需要被解析成html输出,所以仍需要一个Web容器。

大多数的Web容器都包含Servlet容器,如:Tomcat、Jetty、webLogic。

3. Servlet容器

Servlet容器全称server applet,意为服务程序。Servlet容器负责管理Servlet,用与处理动态请求。

Servlet容器是与Servlet交互的Web服务器的一部分,它可以从Web页面接收请求后再将这些请求重定向到Servlet对象中,然后将动态生成的结果返回到正确的位置中。

Servlet容器给上级容器(Tomcat)提供doGet()和doPost()等方法。其生命周期实例化、初始化、调用、销毁受控于Tomcat容器。

利用Servlet容器提供的方法,能轻松的让Servlet与Web服务器对话,而不用自己建立serversocket、监听某个端口、创建流等等。容器知道自己与Web服务器之间的协议,不用担心Web服务器和你自己的Web代码之间的API,只需要考虑如何在Servlet中实现业务逻辑。

大家通常把Tomcat称作Servlet容器,因为Tomcat就是一个围绕着Servlet工作的一个服务器软件。

ServletContext与Servlet容器的关系

ServletContext是Servlet与Servlet容器之间的直接通信的接口。

Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象。每个web应用有唯一的ServletContext对象。
同一个Web应用的所有Servlet对象共享一个ServletContext,Servlet对象可以通过它来访问容器中的各种资源。

为了方便描述,后文直接将ServletContext称作Servlet容器。

① Servlet容器的作用

  • 管理Servlet(业务类)

    • 负责加载类、实例化和初始化Servlet
    • 调用Servlet的service方法提供服务
    • 管理Servlet实例的垃圾回收
    • 管理Servlet之间的共同资源(servletContext)
  • 处理动态请求

    • 解析包装请求
    • 调用某个Servlet
    • 将Servlet的执行结果返回给请求端
  • 多线程

    • 自动为它所接收的每个Servlet请求创建一个新的java线程
    • 但是也会出现线程安全问题
  • 实现简便安全

    • 使用xml部署描述文件来配置和修改安全性
  • JSP支持

    • 负责将jsp代码翻译为真正的java代码
  • 管理通信

    • 负责管理servlet与web服务器之间的通信

② Servlet容器的工作过程

  • Web服务器接收HTTP请求。
  • Web服务器将请求转发到Servlet容器。
  • 如果对应的Servlet不在容器中,那么将被动态检索并加载到容器的地址空间中。
  • 容器调用init()方法进行初始化(仅在第一次加载 Servlet 时调用一次)。
  • 容器调用Servlet的service()方法来处理HTTP请求,即读取请求中的数据并构建响应。Servlet将暂时保留在容器的地址空间中,可以继续处理其它 HTTP 请求。
  • Servlet容器将结果返回给Web服务器,Web服务器将动态生成的结果返回到浏览器/客户端。

③ Servlet

Servlet是用来处理客户端请求并产生动态网页内容的Java类,Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。

④ Servlet的工作过程

  • 客户端发送请求,请求传递到Servlet容器;
  • Servlet容器将数据转换成服务端可以处理的数据后发给服务端;
  • 当服务端处理完成之后,返回给Servlet容器;
  • Servlet容器将其转换成客户端可以处理的数据交给客户端。

⑤ Servlet变化过程

  • 不同请求的处理逻辑不同,于是将逻辑处理这块单独抽取出来成了Servlet
  • 但是Servlet并不擅长往浏览器输出HTML页面,所以出现了JSP
  • 随着三层架构的出现,一些逻辑从Servlet抽取出来,分担到Service和Dao
  • 随着Spring的出现,Servlet开始退居幕后,取而代之的是方便的SpringMVC。

SpringMVC的核心组件DispatcherServlet其实本质就是一个Servlet。它在原来HttpServlet的基础上,又封装了一条逻辑。

4. Spring容器

Spring容器用来管理Service和Dao。

5. SpringMVC容器

SpringMVC容器用来管理Controller、视图解析器(view resolvers)等。

6. SpringBoot容器

SpringBoot容器是一个应用容器,管理所有bean。

大家也常叫做Spring容器,这为了和上面的Spring容器区分开来,称他为SpringBoot容器。

二、容器相关知识归纳

1. 各种容器的管理范围

  • Web容器:管理Listener(监听器)、Filter(过滤器)、间接管理Servlet(通过Servlet容器)
  • Servlet容器:管理Servlet
  • Spring容器:管理Service、Dao
  • SpringMVC容器:管理Controller
  • SpringBoot容器:管理所有Bean

2. 为何设计父子容器

在早期的Spring+SpringMVC的项目中,会有父子容器这个概念(Spring容器:父容器;SpringMVC容器:子容器)。

早期为什么会这样设计呢?

  • 早期Spring为了划分框架边界。将Service、Dao层交给Spring来管理(父容器)、Controller层交给SpringMVC管理(子容器)
  • Spring规定:子容器可以获取父容器的bean,但父容器不可以获取子容器的bean(父子容器的关系就像子类和父类的关系)

可见,父子容器的设计主要是要是为了方便子容器的切换

比如:我们想把Web层从SpringMVC替换成Struts, 那么只需要将spring­mvc.xml替换成Struts的配置文件struts.xml即可,而spring­core.xml不需要改变。

因此才会有网络上大家常说的:Service、Dao无法注入Controller,Controller却可以注入Service、Dao。

但需注意:这概念只在Spring+SpringMVC项目中,SpringBoot项目并没有父子容器这个概念。

3. 父子容器的事务问题

事务管理器属于Spring容器管理,SpringMVC容器无法访问到事务相关的对象,所以不能在Controller上配置事务。

三、各种项目中的容器

1. SpringMVC项目

① 项目背景

  • SpringMVC+Tomcat
  • 配置DispatcherServlet的为dispatcherServlet。

项目用到的容器:Web容器、Servlet容器、SpringMVC容器。

② Servlet容器

全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

Servlet容器的属性:

    private final Map<String, Class<?>[]> classCache;private final Map<String, Method> objectCache;private final ApplicationContext context;

servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

context中有一个Map类型的属性attributes,我们的SpringMVC容器就在里面。

③ SpringMVC容器

SpringMVC容器是一个XmlWebApplicationContext类型的对象。

attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的就是SpringMVC容器对象。

SpringMVC容器的主要属性:

  • servletContext:Servlet容器的引用
  • servletConfig:servletConfig的引用
  • beanFactory:DefaultListableBeanFactory类型,管理SpringMVC容器中的所有bean
  • configLocations:SpringMVC的配置文件路径,如classpath:springMVC.xml
  • parent:父容器,值为null

④ 容器关系图

2. Spring+SpringMVC项目

① 项目背景

  • Spring+SpringMVC+Mybatis+Tomcat
  • 配置DispatcherServlet的为dispatcherServlet。

项目用到的容器:Web容器、Servlet容器、Spring容器、SpringMVC容器。

② Servlet容器

全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

Servlet容器的属性:

    private final Map<String, Class<?>[]> classCache;private final Map<String, Method> objectCache;private final ApplicationContext context;

servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

context中有一个Map类型的属性attributes,我们的Spring容器和SpringMVC容器都在里面。

③ Spring容器

Spring容器是一个XmlWebApplicationContext类型的对象。

attributes中键为org.springframework.web.context.WebApplicationContext.ROOT的值存的就是Spring容器对象。

Spring容器主要属性:

  • servletContext:Servlet容器的引用
  • beanFactory:DefaultListableBeanFactory类型,管理Spring容器中的所有bean
  • parent:父容器,这里Spring容器就是父容器,所以值为null

④ SpringMVC容器

SpringMVC容器是一个XmlWebApplicationContext类型的对象。

attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的就是SpringMVC容器对象。

SpringMVC容器主要属性:

  • servletContext:servletContext的引用
  • servletConfig:servletConfig的引用
  • beanFactory:DefaultListableBeanFactory类型,管理Spring容器中的所有bean
  • configLocations:SpringMVC的配置文件路径,如classpath:springMVC.xml
  • parent:父容器,也就是Spring容器

⑤ 父子容器

在Spring+SpringMVC项目中,Spring容器和SpringMVC容器为父子容器:

  • Spring容器和SpringMVC容器共同管理所有的bean
  • Spring容器管理Service和Dao,SpringMVC容器管理Controller
  • Spring容器为父容器,SpringMVC容器为子容器
  • SpringMVC容器有指向Spring容器的引用,但Spring容器没有指向SpringMVC容器的引用

所以Controller可以注入Service和Dao对象,但是在Service和Dao里不可以注入Controller对象。

SpringMVC的拦截器(Interceptor)也是SpringMVC容器管理的,所以Interceptor也是可以可以注入Service和Dao对象的。

⑥ 容器创建过程

容器的创建过程:

  1. Tomcat服务器启动,Servlet容器启动
  2. 创建Spring容器的实例
  3. 创建SpringMVC容器的实例

容器的详细创建过程可参考文章:Spring+SpringMVC项目中的容器初始化过程

⑦ 容器关系图

3. SpringBoot项目

① 项目背景

SpringBoot+内置Tomcat

SpringBoot项目中的容器:Web容器、Servlet容器、SpringBoot容器。

对于SpringBoot项目中的容器,大家也常叫做Spring容器,这为了和上面的Spring容器区分开来,称他为SpringBoot容器。

② Servlet容器

全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

servletContext对象有三个属性:

    private final Map<String, Class<?>[]> classCache;private final Map<String, Method> objectCache;private final ApplicationContext context;

servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

context中有一个Map类型的属性attributes,我们的SpringBoot容器就在里面。

③ SpringBoot容器

SpringBoot容器是一个AnnotationConfigServletWebServerApplicationContext类型的对象。

attributes中键为org.springframework.web.context.WebApplicationContext.ROOT的值存的就是SpringBoot容器对象。

attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的也是SpringBoot容器对象。

SpringBoot容器主要属性:

  • servletContext:servletContext的引用
  • beanFactory:DefaultListableBeanFactory类型,管理SpringBoot容器中的所有bean
  • parent:null

④ 容器创建过程

容器的详细创建过程可参考文章:SpringBoot项目中的容器初始化过程

⑤ 容器关系图

Web服务器、Web容器、Servlet容器、Spring容器、SpringMVC容器相关推荐

  1. Web流程、Web服务器软件、Servlet

    Web流程.Web服务器软件.Servlet 1.Web流程 1.1软件架构 C/S:客户端/服务器端 有指定的客户端,比如PC端淘宝APP或者手机端淘宝APP或者QQ的APP等:需要依赖一个特定的客 ...

  2. Web服务器 Web容器 Servlet容器

    WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务. WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是 ...

  3. Servlet学习DAY_01:服务器概念/Web服务器的作用/ Servlet概念/ 如何关联和解除Tomcat/ 创建一个Web工程 /Servlet响应流程/ Get-Post /常见异常

    Servlet 什么是服务器 服务器就是一台高性能电脑 电脑上安装了提供服务的软件就称为 xxx服务器 举例: 邮件服务器: 就是在电脑上安装了提供邮件收发服务的软件 ftp服务器: 就是在电脑上安装 ...

  4. 查询网站web服务器,web服务器地址查询

    web服务器地址查询 内容精选 换一换 公网域名解析是基于Internet网络的域名解析过程,可以把人们常用的域名(如www.example.com)转换成用于计算机连接的IP地址(如1.2.3.4) ...

  5. Servlet 容器和 Web 服务器的区别

    目录 1.什么是Web服务器? 2.什么是Servlet容器? 3.Servlet 容器与Web服务器的区别和联系 1.什么是Web服务器? Web 服务器是一种提供 Web 服务的软件,主要用于接收 ...

  6. 彻底吃透Web服务器、容器、应用程序服务器与反向代理

    出处:cnblogs.com/vipyoumay/p/7455431.html 我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是 Web 服务器/Web 容器/Web 应用程序服务器 ...

  7. weblogic多次连接后tcp服务堵塞_一文看懂 Web服务器、应用服务器、Web容器、反......

    导读:我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分 ...

  8. web服务器、Web中间件和Web容器的区别

    目录 Web服务器 中间件 容器 总结 Web开发的选择 我们经常会被Web服务器.Web容器和Web中间件这三个概念搞混.因为我们常见的很多网站要么是由IIS搭建,要么是由Apache.Tomcat ...

  9. Spring容器 SpringMVC容器 web容器的关系

    说到spring和springmvc,其实有很多工作好多年的人也分不清他们有什么区别,如果你问他项目里用的什么MVC技术,他会说我们用的spring和mybatis,或者spring和hibernat ...

  10. web服务器,web中间件,web容器的区别

    web服务器,中间件,web容器 web服务器 中间件 web容器 结论 前言:才学习的时候,就听过大名鼎鼎的web服务器,apache,iis,tomcat,后面进一步学习的时候,发现有个web中间 ...

最新文章

  1. java 变量单例_Java静态变量的用法:伪单例
  2. 机器学习第11天:朴素贝叶斯模型 - 垃圾短信识别
  3. 这款国产BI我推荐了:Tableau+SPSS+python的综合集成
  4. Linux:分享50个实用的基础命令,欢迎收藏!
  5. MYSQL性能优化(转)
  6. LeetCode 64. 最小路径和(DP)
  7. linux 日志优化,Linux —— 日志管理和优化方式
  8. st算法 求区间最值问题
  9. java每隔多长时间执行一次_crontab中如何实现每隔多少天执行一次脚本
  10. 修改pip install镜像源
  11. Kubernetes 小白学习笔记(33)--kubernetes云原生应用开发-总结
  12. 美股市场:暴风雨前的宁静
  13. 雀魂启动!(暴力回溯)
  14. 使用GCD 转自 Posted by 唐巧
  15. 2. linux默认的系统管理员账号是,2019.10第二周 王俊懿_Linux
  16. 英语在线听力翻译器_英语听力翻译最新版-英语听力翻译APP下载v2.1.4-红软网
  17. Android逻辑卷管理LVM,LINUX——LVM逻辑卷管理
  18. MySQL 的read_only 只读属性说明
  19. Android 基站定位源代码
  20. vue使用图像编辑器tui-image-editor

热门文章

  1. 制作Thinkpad五合一WIN7光盘(只要两个小步骤,并附$OEM$资料包下载)
  2. tar 打包解压参数详解
  3. 极光不支持html5推送,Flutter 使用极光推送进行api和本地定时推送
  4. 获取连接设备的SN号
  5. 最新借条模板,如何写
  6. matlab小游戏程序代码,[转载]Matlab有趣代码
  7. 商业银行资产托管业务读书笔记
  8. GoF 的 23 种设计模式的分类和功能
  9. 快速添加百度网盘文件到Aria2 猴油脚本
  10. WhatsApp对话生成器使用教程