Servle原理
这篇博客将以Tomcat为例讲一讲Servlet的原理
Servlet容器
Servlet与Servlet容器的关系举个不恰当的例子就像枪和子弹的关系。而Servlet就是子弹,容器就是枪。子弹都有统一的标准,枪却各有各的不同。
所以Servlet只是个标准,但是容器却各有不同。比较流行的有Jetty,用于移动领域。但是最为熟悉的还是Tomcat。
本博客的所有实现的描述,都是基于Tomcat的。
先看一张Tomcat容器的模型图
从图中可以看出,Tomcat容器分为四个等级:Container,Engine,Host,Context。
真正管理Servlet的容器是Context.一个Context对应一个Web工程。
Tomcat容器的启动
大概过程
1.获取Tomcat实例
Tomcat tomcat = getTomcatInstance();
/**
从Tomcat 7开始支持嵌入式功能,增加了一个启动类:
org.apache.catalina.startup.Tomcat
除此之外,还可以调用该对象的方法来增加和修改
Tomcat的配置参数,如动态增加Context、Servlet*/
2.添加应用到容器中
File appDir = new File(xxxxx);
tomcat.addWebapp(xxxxxxxx);
/**
添加一个Web应用将会创建一个StandardContext容器,并且会
给这个Context容器设置必要的参数,如url和path。最重要的
一个配置是ContextConfig,这个类将会负责整个Web应用配置
的解析工作。然后将这个容器加入父容器Host中。
*/
3.启动Tomcat(核心)
tomcat.start();
/*
Tomcat的启动逻辑是基于观察者模式设计的,所有的容器都会继承
Lifecycle接口。它管理着容器的整个生命周期,所有的容器的修改
和状态的改变都会由它去通知已经注册的观察者(Listener)。*/
Tomcat的启动过程较为复杂,关键点是StandardContext的初始化,
当Context初始化状态设为init时,添加到Context的容器的Listener,即ContextConfig将会被调用(ContextConfig继承了LifecycleListener接口,在调用Tomcat.addWebapp时被加入到StandardContext容器中,负责整个Web应用的配置文件的解析工作)。
ContextConfig将会完成对于每个Web应用项目的配置解析和Web应用的初始化工作:
ContextConfig的init方法将会完成以下工作:
- 创建用于解析XML配置文件的contextDigester对象。
- 读取默认的context.xml文件,如果存在就解析它。
- 读取默认的host配置文件,如果存在就解析它。
- 读取默认的Context自身配置文件,如果存在就解析它。
- 设置Context的Docbase
ContextConfig的configureStart方法实现Web应用的初始化工作:主要是完成web.xml文件(这里不单单指应用的web.xml)
的解析。之后会将Web.xml中对象的属性设置到Context容器中,
包括创建Servlet对象、filter、Listener等。
这里会将Servlet包装成Context容器中的StandardWrapper(因为StandardWrapper是容器的一部分,
具有容器的特征,而Servlet是一个独立的开发标准,不应该耦合在Tomcat中)。
从这里可以看到Context的重要性了:
web.xml属性都解析到Context中,所以Context容器才是真正运行Servlet的Servlet容器。
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原理的更多相关文章
- java web学习总结(十四) -------------------JSP原理
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- JSP以及JSP解析原理
什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写htm ...
- JavaWeb---总结(十四)JSP原理
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- JSP 原理
参考文献:http://www.cnblogs.com/xdp-gacl/p/3764991.html 一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都 ...
- JSP的原理
一.什么是JSP JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大特点在于,写JSP就行html, ...
- javaweb学习总结(十四)——JSP原理
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- JSP学习——原理
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...
- JSP起源、JSP的运行原理、JSP的执行过程
JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...
- java web 学习十四(JSP原理)
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
随机推荐
- sublimetext3官网安装
1. 下载 可以从官网 http://www.sublimetext.com/3 下载. 2. Windows下安装与使用2.1 安装 1. Win7 64位系统,可以下载 Windows 64 bi ...
- JS知识点概况
1.什么是JavaScript a) JavaScript 被设计用来向 HTML 页面添加交互行为. b) JavaScript 是一种脚本语言(脚本语言是一种轻量级的编程语言). c) ...
- Unity IOC注入详细配置(MVC,WebApi)
一直想写一篇关于unity 详细的配置信息的文章,也算是自我总结吧 先介绍了unity , Unity是微软官方推荐使用的轻型的IOC框架,支持各种方式的注入 ,使用来解耦的利器. 获取unity 的 ...
- mono for android 学习资料
http://www.cnblogs.com/Hua-Min/tag/Android/
- 常用的SQL数据库语句总结
1as 的用处 as可以对表和列取别名 在开发过程中经常遇到开始给某一个的字段去field1的名称,但后来有感觉field1字段指定不确切,于是又把此字段改成了field2,由于开始认 为field1 ...
- cocos2d.js
1.节点是Cocos2d最基础的东西 2.坐标与普通数学坐标一致 3.children属性表示节点的孩子,父节点位置变化,它包含的子节点也会跟着变化,以整体的形势移动 4.层(layer), 新建层: ...
- css3变形讲解
Transform变形:可以实现文字或者图片旋转.缩放.倾斜和移动,并且该元素下的所有子元素都随着父元素一样. 既然接触到transform,我们就可以做好多3d的效果啦 旋转:transform:r ...
- C语言基础09
指向结构体变量的指针叫做结构体指针: typedef struct { int num; char name[30]; // char *name; 程序会崩溃,*name本身是指针,没有什么空 ...
- swift笔记05
数组的定义: var 北京十号线 = ["国家图书馆","巴沟"] 北京十号线.count //或者数组的长度 var a = [Int]() //创建一 ...
- KeybMap 键盘映射工具更新至 V1.5(修订)
KeybMap 更新至 V1.5,主要是增加了对一些多媒体键定义修改功能,也可以将任意一键定义为打开指定的程序. 3月9日略做修订. http://www.mympc.org/down/1/2005- ...