WEB应用容器详细介绍

各个容器

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容器的掌控范围里。但他们不在spring和springmvc的掌控范围里。因此,无法在这些类中直接使用Spring注解的方式来注入需要的对象,是无效的,web容器是无法识别的。

Servlet容器

Servlet容器是管理servlet对象的。
Servlet容器的作用:负责处理客户请求,当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。

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

生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。

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

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

Servlet容器和ServletContext的关系

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

Spring容器和SpringMVC容器

Spring容器是管理service和dao的。
SpringMVC容器是管理controller对象的。

spring与springmvc容器区别

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

dubbo容器与spring,springmvc容器区别

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

容器间的关系图

web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器。
其中spring控制service层和dao层的bean对象。
springmvc容器控制controller层bean对象。
servlet容器控制servlet对象。
项目启动时,首先 servlet初始化,初始化过程中通过web.xml中spring的配置加载spring配置,初始化spring容器和springmvc容器。待容器加载完成。servlet初始化完成,则完成启动。
HTTP请求到达web容器后,会到达Servlet容器,容器通过分发器分发到具体的spring的Controller层。执行业务操作后返回结果
WEB应用容器详细介绍_第2张图片
各个容器的创建过程:
1、TOMCAT启动,Servlet容器随即启动,然后读取server.xml配置文件,启动里面配置的web应用,为每个应用创建一个“全局上下文环境”(ServletContext);

2、创建Spring容器实例。调用web.xml中配置的ContextLoaderListener,初始化WebApplicationContext上下文环境(即IOC容器),加载context­param指定的配置文件信息到IOC容器中。WebApplicationContext在ServletContext中以键值对的形式保存。

<context-param>
  <param-name>contextConfigLocationparam-name>
  <param-value>classpath:root-context.xmlparam-value>
context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>

3、创建SpringMVC容器实例。调用web.xml中配置的servlet-class,为其初始化自己的上下文信息,并加载其设置的配置信息到该上下文中。将WebApplicationContext设置为它的父容器。



<servlet>
  <servlet-name>appServletservlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>

  <init-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:servlet-context.xmlparam-value>
  init-param>

  <init-param>
    <param-name>activeReverseAjaxEnabledparam-name>
    <param-value>trueparam-value>
  init-param>

  <init-param>
    <param-name>allowScriptTagRemotingparam-name >
    <param-value>true param-value>
  init-param>

  <load-on-startup>1load-on-startup>
servlet>

<servlet-mapping>
  <servlet-name>appServletservlet-name>
  <url-pattern>*.dourl-pattern>
servlet-mapping>

4、此后的所有servlet的初始化都按照3步中方式创建,初始化自己的上下文环境,将WebApplicationContext设置为自己的父上下文环境。当Spring在执行ApplicationContext的getBean时,如果在自己context中找不到对应的bean,则会在父ApplicationContext中去找。

拦截器注入到bean:https://segmentfault.com/a/1190000038252822
过滤器注入到bean:https://blog.csdn.net/jslcylcy/article/details/59114866

你可能感兴趣的:(spring,mvc,tomcat)