这篇博客将以Tomcat为例讲一讲Servlet的原理

Servlet容器

Servlet与Servlet容器的关系举个不恰当的例子就像枪和子弹的关系。而Servlet就是子弹,容器就是枪。子弹都有统一的标准,枪却各有各的不同。

所以Servlet只是个标准,但是容器却各有不同。比较流行的有Jetty,用于移动领域。但是最为熟悉的还是Tomcat。

本博客的所有实现的描述,都是基于Tomcat的。

先看一张Tomcat容器的模型图

从图中可以看出,Tomcat容器分为四个等级:Container,Engine,Host,Context。

真正管理Servlet的容器是Context.一个Context对应一个Web工程。

Tomcat容器的启动

大概过程

1.获取Tomcat实例

  1. Tomcat tomcat = getTomcatInstance();
  2. /**
  3. 从Tomcat 7开始支持嵌入式功能,增加了一个启动类:
  4. org.apache.catalina.startup.Tomcat
  5. 除此之外,还可以调用该对象的方法来增加和修改
  6. Tomcat的配置参数,如动态增加Context、Servlet*/

2.添加应用到容器中

  1. File appDir = new File(xxxxx);
  2. tomcat.addWebapp(xxxxxxxx);
  3. /**
  4. 添加一个Web应用将会创建一个StandardContext容器,并且会
  5. 给这个Context容器设置必要的参数,如url和path。最重要的
  6. 一个配置是ContextConfig,这个类将会负责整个Web应用配置
  7. 的解析工作。然后将这个容器加入父容器Host中。
  8. */

3.启动Tomcat(核心)

  1. tomcat.start();
  2. /*
  3. Tomcat的启动逻辑是基于观察者模式设计的,所有的容器都会继承
  4. Lifecycle接口。它管理着容器的整个生命周期,所有的容器的修改
  5. 和状态的改变都会由它去通知已经注册的观察者(Listener)。*/

Tomcat的启动过程较为复杂,关键点是StandardContext的初始化

当Context初始化状态设为init时,添加到Context的容器的Listener,即ContextConfig将会被调用(ContextConfig继承了LifecycleListener接口,在调用Tomcat.addWebapp时被加入到StandardContext容器中,负责整个Web应用的配置文件的解析工作)。

ContextConfig将会完成对于每个Web应用项目的配置解析和Web应用的初始化工作:

  1. ContextConfiginit方法将会完成以下工作:
  2. - 创建用于解析XML配置文件的contextDigester对象。
  3. - 读取默认的context.xml文件,如果存在就解析它。
  4. - 读取默认的host配置文件,如果存在就解析它。
  5. - 读取默认的Context自身配置文件,如果存在就解析它。
  6. - 设置ContextDocbase
  7. ContextConfigconfigureStart方法实现Web应用的初始化工作:主要是完成web.xml文件(这里不单单指应用的web.xml
  8. 的解析。之后会将Web.xml中对象的属性设置到Context容器中,
  9. 包括创建Servlet对象、filterListener等。
  10. 这里会将Servlet包装成Context容器中的StandardWrapper(因为StandardWrapper是容器的一部分,
  11. 具有容器的特征,而Servlet是一个独立的开发标准,不应该耦合在Tomcat中)。
  12. 从这里可以看到Context的重要性了:
  13. web.xml属性都解析到Context中,所以Context容器才是真正运行ServletServlet容器。

Servlet实例的创建

在上面的Tomcat启动过程中,已经完成了Servlet的解析工作,并且被包装成StandardWrapper添加在Context中,但是因为它没有被实例化,所以仍然不能为我们工作。下面主要讲Servlet是如何创建以及初始化的:

创建Servlet对象

如果Servlet的load-on-startup配置项大于0,则在Context容器的启动过程中就会被实实例化。在web.xml文件中定义了两个Servlet:

org.apache.catalina.DefaultServlet和 org.apache.jasper.servlet.JspServlet

创建Servlet实例的方法从Wrapper.loadServlet开始,此方法要获取servletClass然后将它交给InstanceManager去创建一个基于servletClass.class的对象。

初始化Servlet

初始化的方法在StandardWrapper的initServlet方法中。此方法调用Servlet的init()方法,同时把包装了StandardWrapper对象的StandardWrapperFacade作为ServletConfig传给Servlet。

如果该实例关联的是一个JSP文件,则初始化JspServlet,接下来会模拟一次简单的请求,调用这个JSP文件,来编译之,初始化之。

Servlet的体系结构

Servlet的运行模式是一个典型的“握手型交互式模式”。

所谓的“握手型交互式模式”,即两个模块为了交换数据通常都会准备一个交易场景,这个场景一直跟随这个交易指导这个交易完成为止。这个交易的场景的初始化就是根据这次交易对象指定的参数来定制的,这些指定参数通常是一些配置类。

交易场景由ServletContext来描述,定制参数集合由ServletConfig来描述。ServletRequest和ServletResponse就是要交互的具体对象。

Servlet如何工作

用户通过url向服务器发起请求,服务器如何根据此url映射到正确的Servlet容器呢?

在Tomcat7中,这种映射工作由一个专门的类来完成,即org.apache.tomcat.util.http.mapper

此类保存了Tomcat的Container容器的所有子容器的信息。

那么Mapper类怎么会有容器的完整关系?

因为MapperListener类作为监听者把加到整个Container容器的每个子容器中,这样只要任何一个容器发生变化,MapperListener都会被通知到。相应的保存容器关系的MapperListener的mapper属性页会被修改。

现在的Web应用很少直接将交互的页面全部用Servlet来实现,而是采用更加高效的MVC框架来实现。这些MVC框架的基本原理就是将所有的请求都映射到一个Servlet,然后去实现Service方法,这个方法也是MVC框架的入口。

Filter如何工作?

在Tomcat容器中,FilterConfig和FilterChain的实现类分别是ApplicationFilterConfig和ApplicationFilterChain,而Filter的实现类由用户自己定义,只要实现Filter接口定义的三个方法就行。

  • init():初始化接口

  • doFilter(ServletRequest,ServletResponse,FilterChain):在每个用户请求进来时,这个方法都会被调用,并且在Service方法之前。Filter采用的责任链模式。

  • destroy:当filter对象被销毁时,此方法被调用。


至此,Servlet系列的四篇博客算是告一段落了,后面有时间,会继续往深处挖,探究其奥秘。

Servle原理的更多相关文章

  1. java web学习总结(十四) -------------------JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  2. JSP以及JSP解析原理

    什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写htm ...

  3. JavaWeb---总结(十四)JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  4. JSP 原理

    参考文献:http://www.cnblogs.com/xdp-gacl/p/3764991.html 一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都 ...

  5. JSP的原理

    一.什么是JSP JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大特点在于,写JSP就行html, ...

  6. javaweb学习总结(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  7. JSP学习——原理

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.   JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...

  8. JSP起源、JSP的运行原理、JSP的执行过程

    JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...

  9. java web 学习十四(JSP原理)

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

随机推荐

  1. Extjs 6 MVC开发模式(二)

    1.Extjs MVC开发模式 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs4.x版本中引入了MVC开发模式,开始将 ...

  2. JavaScript鼠标事件,点击鼠标右键,弹出div

    document.oncontextmenu = function(){return false}; //禁止鼠标右键菜单显示 var res = document.getElementById('b ...

  3. 理解中WebAPI的属性和相关操作 FormBody和 FormUri等(WebAPI 二)

    1.FromUri使用 将数据通过url方式传递.我们需要在webapi方法标明,这个参数只接受url中参数的值, $("#Save").click(function () { $ ...

  4. Oracle数据库中如何选择合适的索引类型 .

    索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽然说,在表中是 ...

  5. 模块化开发,SesJS简单总结

    一.概念:SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架. 在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definit ...

  6. 定制化Azure站点Java运行环境(4)

    定制化使用您自己的Tomcat版本和JDK环境 在上面章节中,介绍了如何通过web.config,定制默认的Azure website的Java运行环境,默认情况下,Azure站点的Tomcat是7. ...

  7. android的edittext输入长度

    http://blog.csdn.net/uyu2yiyi/article/details/6329738 http://flysnow.iteye.com/blog/828415/ http://s ...

  8. 【剑指offer】连续子数组的最大和

    个開始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组測试数据包括两行. 第一行为一个整数n(0<=n<=100000),当n=0时,输入结束.接下去的一行包括n个整数 ...

  9. flexigrid 修改json格式

    1.修改默认的json格式为key:value 修改前 rows: [{id:'ZW',cell:['ZW','ZIMBABWE','Zimbabwe','ZWE','716']},{id:'ZW', ...

  10. html5 乒乓球(碰撞检测)

    演示地址 http://koking.8u.hanmandarin.com/html5/1.html 简单介绍 小球可以在方框内部自由运动 可以通过方向键控制黑色砖块上下左右移动去与小球发生碰撞 代码 ...