Web容器、Servlet容器、Spring容器、SpringMVC容器之间的关系

如下内容为我的理解,若有误还请留言指出,不胜感激!html

 

Web容器java

web容器(web服务器)主要有:ApacheIISTomcatJettyJBosswebLogic等,而TomcatJettyJBosswebLogic同时也是servlet容器,或者说他们还包含了servlet容器。没有servlet容器,你也能够用web容器直接访问静态页面,好比安装一个apache等,可是若是要显示jsp/servlet,你就要安装一个servlet容器了,可是光有servlet容器是不够的,由于它要被解析成html输出,因此你仍须要一个web容器。大多数servlet容器同时提供了web容器的功能,也就是说大多servelt容器能够独立运行你的web应用。web

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

但咱们有时候又确实会有这样的需求,好比在容器启动的时候,作一些验证或者初始化操做,这时可能会在监听器里用到bean对象;又或者须要定义一个过滤器作一些拦截操做,也可能会用到bean对象。
那么在这些地方怎么获取springbean对象呢?下面我提供两个方法:apache

1tomcat

public void contextInitialized(ServletContextEvent sce) {

  ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  UserService userService = (UserService) context.getBean("userService");

}

2安全

public void contextInitialized(ServletContextEvent sce) {

  WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
  UserService userService = (UserService) webApplicationContext.getBean("userService");

}

  注意:以上代码有一个前提,那就是servlet容器在实例化ConfigListener并调用其方法以前,要确保spring容器已经初始化完毕!而spring容器的初始化也是由ListenerContextLoaderListener)完成,所以只需在web.xml中先配置初始化spring容器的Listener,而后在配置本身的Listener服务器

 

TOMCAT多线程

Tomcat中有4种级别的容器:EngineHostContextWrappermvc

Engine:整个Catalina Servlet引擎;

Host:包含一个或多个Context容器的虚拟主机;

Context:表示一个Web应用程序,对应着一个Servlet上下文(ServletContext),能够包含多个Wrapper

Wrapper:表示一个独立的Servlet

4个层级接口的标准实现分别是:StandardEngine类,StandardHost类,StandardContext类和StandardWrapper类。它们在org.apache.catalina.core包下。

 

Tomcat结构目录

/bin:包含启动和关闭Tomcat的文件

/conf:包含不一样的配置文件:server.xmlweb.xmltomcat-user.xml

/lib:包含Tomcat使用的JAR文件

/logs:包含日志文件

/webapps:包含应用程序示例及本身开发的程序

/work:包含有JSP生成的Servlet

 

Servlet容器

Servlet容器是管理servlet对象的

Servlet容器的做用:

负责处理客户请求,当客户请求来到时,Servlet容器获取请求,而后调用某个Servlet,并把Servlet的执行结果返回给客户。

使用Servlet容器的缘由:   

    通讯支持:利用容器提供的方法,你能轻松的让servletweb服务器对话,而不用本身创建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代码。

 

Spring容器

Spring容器是管理servicedao

 

SpringMVC容器

SpringMVC容器是管理controller对象的

 

Spring容器SpringMVC容器的关系是父子容器的关系。Spring容器是父容器,SpringMVC容器是子容器。在子容器里能够访问父容器里的对象,可是在父容器里不能够访问子容器的对象,说的通俗点就是,在controller里能够访问service对象,可是在service里不能够访问controller对象。因此这么看的话,全部的bean,都是被Spring或者SpringMVC容器管理的,他们能够直接注入。而后SpringMVC的拦截器也是SpringMVC容器管理的,因此在SpringMVC的拦截器里,能够直接注入bean对象。

 

Servlet容器和ServletContext的关系:

ServletContextservletservlet容器之间的直接通讯的接口。Servlet容器在启动一个Web应用时,会为它建立一个servletContext对象。每一个web应用有惟一的servletContext对象。同一个web应用的全部servlet对象共享一个serveltContext,servlet对象能够经过它来访问容器中的各类资源。 

 

各个容器的建立过程:

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

 

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

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:root-context.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 

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

<!-- springMVC配置 -->

<servlet>
  <servlet-name>appServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>     <param-name>contextConfigLocation</param-name>     <param-value>classpath:servlet-context.xml</param-value>   </init-param>

  <init-param>     <param-name>activeReverseAjaxEnabled</param-name>     <param-value>true</param-value>   </init-param>   <init-param>     <param-name>allowScriptTagRemoting</param-name >     <param-value>true </param-value>   </init-param>   <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping>   <servlet-name>appServlet</servlet-name>   <url-pattern>*.do</url-pattern> </servlet-mapping>

 

4、此后的全部servlet的初始化都按照3步中方式建立,初始化本身的上下文环境,将WebApplicationContext设置为本身的父上下文环境。Spring在执行ApplicationContextgetBean时,若是在本身context中找不到对应的bean,则会在父ApplicationContext中去找。

相关文章
相关标签/搜索