1 各个容器

1.1 Web容器

web容器(web服务器)主要有:Apache、IIS、Tomcat、Jetty、JBoss、webLogic等,而Tomcat、Jetty、JBoss、webLogic同时也是servlet容器,或者说他们还包含了servlet容器。没有servlet容器,你也可以用web容器直接访问静态页面,比如安装一个apache等,但是如果要显示jsp/servlet,就要安装一个servlet容器了,但是光有servlet容器是不够的,因为它要被解析成html输出,所以仍需要一个web容器。大多数servlet容器同时提供了web容器的功能,也就是说大多servelt容器可以独立运行web应用。

web容器是管理servlet(通过servlet容器),以及监听器(Listener)和过滤器(Filter)的。这些都是在web容器的掌控范围里。但他们不在springspringmvc的掌控范围里。因此,无法在这些类中直接使用Spring注解的方式来注入需要的对象,是无效的,web容器是无法识别的。

1.2 Servlet容器

Servlet容器是管理servlet对象的。
Servlet容器的作用:负责处理客户请求,当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。
Servlet是用来处理客户端请求并产生动态网页内容的Java类,Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息

什么是Servlet链(Servlet Chaining)?
Servlet链是把一个Servlet的输出发送给另一个Servlet的方法。第二个Servlet的输出可以发送给第三个Servlet,依次类推。链条上最后一个Servlet负责把响应发送给客户端

Servlet的体系结构
所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多线程可以并行的为多个请求服务。
GenericServletHttpServlet有什么区别?
GenericServlet是一个通用的协议无关的Servlet,它实现了ServletServletConfig接口。继承自GenericServletServlet应该要覆盖service()方法。最后,为了开发一个能用在网页上服务于使用HTTP协议请求的Servlet,你的Servlet必须要继承自HttpServlet

使用Servlet容器的原因:通信支持:利用容器提供的方法,能轻松的让servletweb服务器对话,而不用自己建立serversocket、监听某个端口、创建流等 等。容器知道自己与web服务器之间的协议,所以servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考虑如何在servlet中实现业务逻辑(如处理一个订单)。

生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。
Servlet的生命周期。
对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用Servletdestroy()方法把Servlet删除掉

多线程支持:容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说不需要考虑线程安全性,其实还会遇到同步问题,不过这样能使会少做很多工作。

声明方式实现安全:利用servlet容器,可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。
JSP支持:servlet容器负责将jsp代码翻译为真正的java代码

1.3 Servlet容器和ServletContext的关系

ServletContextservletservlet容器之间的直接通信的接口。
Servlet容器在启动一个Web应用时,会为它创建一个servletContext对象。每个web应用有唯一的servletContext对象。
同一个web应用的所有servlet对象共享一个serveltContext,servlet对象可以通过它来访问容器中的各种资源。

1.4 Spring容器和SpringMVC容器

Spring容器是管理servicedao的。
SpringMVC容器是管理controller对象的。

1.5 spring与springmvc容器区别

Spring容器和SpringMVC容器的关系是父子容器的关系。
Spring容器是父容器,SpringMVC容器是子容器。
在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象,说的通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象。
所以这么看的话,所有的bean,都是被Spring或者SpringMVC容器管理的,它们可以直接注入。
然后SpringMVC的拦截器也是SpringMVC容器管理的,所以在SpringMVC的拦截器里,可以直接注入bean对象。

1.6 dubbo容器与spring,springmvc容器区别

dubbo容器和Spring容器 mvc容器 虽然都属于Spring容器类型,但三者在项目中却不会融合成一个容器
Spring容器管理Spring注解或配置文件所生成对象,dubbo容器管理远程服务所提供的对象,mvc管理其自己的对象
三者之间,虽然dubbomvc都衍生于Spring,由于mvcdubbo毕竟是不同的框架,所以mvcdubbo相互之间不可以直接沟通
但由于mvcdubbo都是Spring的子框架,所以mvc容器和dubbo容器都可以和Spring容器沟通
所以mvc获取远程服务对象时,必须通过本地提供一个服务类注入dubbo的远程对象,然后mvc再取用Spring提供的本地服务对象

对于Spring容器、Dubbo容器和MVC容器三者关系的理解图
在这里插入图片描述

2 容器间的关系图

web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器。
其中spring控制service层和dao层的bean对象。
springmvc容器控制controllerbean对象。
servlet容器控制servlet对象。
项目启动时,首先 servlet初始化,初始化过程中通过web.xmlspring的配置加载spring配置,初始化spring容器和springmvc容器。待容器加载完成。servlet初始化完成,则完成启动。
HTTP请求到达web容器后,会到达Servlet容器,容器通过分发器分发到具体的springController层。执行业务操作后返回结果
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐