这里写图片描述

Tomcat是一个servlet容器,实现了对Servlet和JSP的支持,除此之外,tomcat还可以作为
一个web应用服务器。独立的Servlet容器是Tomcat的默认模式。管理和运行Servlet/JSP的
容器也称为WEB容器。
Tomcat服务器接受客户请求并做出响应的过程如下:
1)客户端(通常都是浏览器)访问Web服务器,发送HTTP请求。 
2)Web服务器接收到请求后,传递给Servlet容器。 
3)Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。 
4)Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。 
5)Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时
将控制返回给Web服务器。
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代码。
Tomcat的体系结构:
    Tomcat服务器是由一系列可配置的组件构成的,其中核心组件是Catalina Servlet容器,
它是所有其他Tomcat组件的顶层容器。
     <?xml version='1.0' encoding='utf­8'?>
        <Server port="8005" shutdown="SHUTDOWN">
            <Service name="Catalina">
                <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF­8"/>
                <Engine name="Catalina" defaultHost="localhost">
                    <Host name="localhost">
                            <Context path="" docBase="dlmj" reloadable="true"/>
                    </Host>
               </Engine>
          </Service>
    </Server>
(1) Server
Server表示整个的Catalina Servlet容器。Tomcat提供了Server接口的一个默认实现,这通
常不需要用户自己去实现。在Server容器中,可以包含一个或多个Service组件。
(2) Service
Service是存活在Server内部的中间组件,它将一个或多个连接器(Connector)组件绑定到
一个单独的引擎(Engine)上。在Server中,可以包含一个或多个Service组件。Service也
很少由用户定制,Tomcat提供了Service接口的默认实现,而这种实现既简单又能满足应
用。
(3) Connector
连接器(Connector)处理与客户端的通信,它负责接收客户请求,以及向客户返回响应结
果。在Tomcat中,有多个连接器可以使用。
(4) Engine
在Tomcat中,每个Service只能包含一个Servlet引擎(Engine)。引擎表示一个特定的
Service的请求处理流水线。作为一个Service可以有多个连接器,引擎从连接器接收和处理
所有的请求,将响应返回给适合的连接器,通过连接器传输给用户。用户允许通过实现
Engine接口提供自定义的引擎,但通常不需要这么做。
(5) Host
Host表示一个虚拟主机,一个引擎可以包含多个Host。用户通常不需要创建自定义的
Host,因为Tomcat给出的Host接口的实现(类StandardHost)提供了重要的附加功能。
(6) Context
一个Context表示了一个Web应用程序,运行在特定的虚拟主机中。什么是Web应用程序
呢?在Sun公司发布的Java Servlet规范中,对Web应用程序做出了如下的定义:“一个Web
应用程序是由一组Servlet、HTML页面、类,以及其他的资源组成的运行在Web服务器上的
完整的应用程序。它可以在多个供应商提供的实现了Servlet规范的Web容器中运行”。一个
Host可以包含多个Context(代表Web应用程序),每一个Context都有一个唯一的路径。用
户 通 常 不 需 要 创 建 自 定 义 的 Context , 因 为 Tomcat 给 出 的 Context 接 口 的 实 ( 类
StandardContext)提供了重要的附加功能。
凡是实现了Servlet规范的都可以成为Servlet容器
理解ServletContext:
servlet容器需要在应用项目启动时,给应用项目初始化一个ServletContext作为
公共环境容器存放公共信息。ServletContext中的信息都是由容器提供的。通常
的配置是web.xml,执行流程如下:
web.xml在<context­param></context­param>标签中声明应用范围内的初始化参数 
1.启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:
<listener></listener><context­param></context­param>
2.紧接着,容器创建一个ServletContext(上下文)。在该应用内全局共享
3.容器将<context­param></context­param>转化为键值对,并交给ServletContext
4. 容 器 创 建 <listener></listener> 中 的 类 实 例 ,即 创 建 监 听 .该 监 听 器 必 须 实 现 自
ServletContextListener接口

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述

5.在监听中会有contextInitialized(ServletContextEvent event)初始化方法    在这个方法
中获得ServletContext = ServletContextEvent.getServletContext();
 “context­param的值” = ServletContext.getInitParameter("context­param的键");
web.xml中可以定义两种参数:
    一个是全局参数(ServletContext),通过<context­param>param</context­param>
    一个是servlet参数,通过在servlet中声明
     <init­param>
                   <param­name>param1</param­name>
                   <param­value>avalible in servlet init()</param­value>  
    </init­param>  
    第一种参数在servlet里面可以通过getServletContext().getInitParameter("param")得
到
    第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得 
对于spring的配置

这里写图片描述

1、servlet容器启动,为应用创建一个“全局上下文环境”:ServletContext
2、容器调用web.xml中配置的ContextLoaderListener,初始化
WebApplicationContext上下文环境(即IOC容器),加载context­param指定的
配置文件信息到IOC容器中。WebApplicationContext在ServletContext中以键值
对的形式保存
3、容器初始化web.xml中配置的servlet,为其初始化自己的上下文信息
servletContext,并加载其设置的配置信息到该上下文中。将
WebApplicationContext设置为它的父容器。
4、此后的所有servlet的初始化都按照3步中方式创建,初始化自己的上下文环
境,将WebApplicationContext设置为自己的父上下文环境。
      当Spring在执行ApplicationContext的getBean时,如果在自己context中找不
到对应的bean,则会在父ApplicationContext中去找。这也解释了为什么我们可以
在DispatcherServlet中获取到由ContextLoaderListener对应的ApplicationContext
中的bean。 
拦截器和filter的执行时机

这里写图片描述

Logo

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

更多推荐