Servlet容器、Web容器、Spring容器、SpringMVC容器之间的区别

361 阅读5分钟

servlet容器,web容器,spring容器,springmvc容器的区别

我们有时候会有这样的需求,比如在容器启动的时候,做一些验证或者初始化操作,这时可能会在监听器里用到bean对象;又或者需要定义一个过滤器做一些拦截操作,也可能会用到bean对象。我们需要了解各个容器之间的关系可以更好的了解。

Servlet容器

介绍Servlet容器的时候顺便复习下Java Web,我们都知道 Java Web 的三大组件:Servlet、Filter、Listener。

Servlet

可以理解为是运行在服务端的Java小程序,它负责客户端和服务端的信息交互和处理。但是Servlet中没有main方法,不能独立运行,所以必须存放在Servlet容器中,由Servlet容器去管理Servlet。那么它工作的过程就是:客户端发送请求,传递到Servlet容器,而Servlet将数据转换成服务器端可以处理的数据再发给服务端;当服务端处理完成之后,传递给Servlet容器,Servlet容器将其转换成客户端可以处理的数据交给客户端,这样就完成了数据的交互和处理。

Filter

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

Listener

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

Web容器

Web容器就是管理 Servlet、Filter、Listener的容器,这三个组件都在Web容器的管控范围之内,当然Servlet’容器是属于Web容器的一部分。但是不在Spring和SpringMVC的管理范围之内,所以我们不能使用Spring的注解来标注这些类。

Spring容器和SpringMVC容器

springmvc和spring它俩都是容器,容器就是管理对象的地方

例如Tomcat,就是管理servlet对象的

springMVC容器和spring容器,就是管理bean对象的地方,再说的直白点,springmvc就是管理controller对象的容器,spring就是管理service和dao的容器

其次, spring容器和springmvc容器的关系是父子容器的关系。spring容器是父容器,springmvc是子容器。在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象

说的通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象

所有的bean,都是被spring或者springmvc容器管理的,他们可以直接注入。然后springMVC的拦截器也是springmvc容器管理的,所以在springmvc的拦截器里,可以直接注入bean对象。

Servlet容器和ServletContext的关系:

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

各个容器的创建过程:

1、TOMCAT启动,Servlet容器随即启动,然后读取server.xml配置文件,启动里面配置的web应用,为每个应用创建一个“全局上下文环境”(ServletContext);

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

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

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

Spring的父ApplicationContext通常是WebApplicationContext的父容器,也就是ServletContext。在Spring MVC中,WebApplicationContext是由ContextLoaderListener负责初始化和加载的,它会将自己设置为ServletContext的一个属性,供其他Servlet使用。其他Servlet(如DispatcherServlet)在初始化时,会使用WebApplicationContext作为父容器,这样就可以共享同一个IOC容器中的Bean对象。

DispatcherServlet是Spring MVC框架中的一个关键组件,它是一个Servlet,被用作控制器的中央调度器。它接收所有的客户端请求,并将请求分发给相应的处理器(Handler)进行处理。DispatcherServlet根据请求的URL和配置的处理器映射表,将请求分发给合适的处理器进行处理,并得到处理结果后生成响应返回给客户端。同时,它还负责协调其他的组件,如视图解析器、处理器适配器等。DispatcherServlet在Spring MVC中起着重要的作用,它帮助开发人员组织和管理控制逻辑,实现易于维护和扩展的Web应用程序架构。

  • 拓展(其他servlet)
  1. GenericServlet:是一个通用的Servlet抽象类,提供了一些基本的方法和处理逻辑,可以被继承来创建自定义的Servlet。它是所有Servlet的基类。
  2. HttpServlet:继承自GenericServlet,是用于处理HTTP协议相关的Servlet。大部分常见的Servlet都是基于HttpServlet来实现的,它提供了一些针对HTTP请求的方法,如doGet()、doPost()等。
  3. JspServlet:用于处理JSP页面的Servlet。JspServlet将JSP文件转换为Java Servlet,然后由Servlet容器来负责执行和渲染。

一个http的页面请求来说明

image.png

HTTP请求到达web容器后,会到达Servlet容器,容器通过分发器分发到具体的spring的Controller层。执行业务操作后返回结果。