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 ...
随机推荐
- CAShapeLayer + UIBezierPath
UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.使用此类可以定义常见的圆形.多边形等形状 .我们使用直线.弧(arc) ...
- MVC思想架构的简单自定义UITableViewCell
在iOS的开发过程中,架构思想是很重要的一部分,目前的主流应该分为MVC与MVVM两种,在这里不做过多的区分,有兴趣的同学可以看看唐巧大神的一篇文章<被误解的MVC和被神化的MVVM& ...
- C++细节系列(零):零散记录
老规矩:记录细节,等待空余,再进行整理. 1:const,static,const static成员初始化. 1.const成员:只能在构造函数后的初始化列表中初始化 2.static成员:初始化在类 ...
- jquery 获取自定义属性(attr 和 prop的区别)
在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...
- Android 上传库到Binary的操作
第一次,按照网上教程配置需要的配置文件,上传成功 1.0版本. 以后更新的时候 输入 : install ,执行task 然后再输入:bintrayUpload ,执行task,看下面控制台输出信息, ...
- c语言 列出系统进程
#include <stdio.h> #include "stdafx.h" #include <Windows.h> #include <strin ...
- 谈谈我对Java中CallBack的理解
谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...
- KeybMap 键盘映射工具更新至 V1.5(修订)
KeybMap 更新至 V1.5,主要是增加了对一些多媒体键定义修改功能,也可以将任意一键定义为打开指定的程序. 3月9日略做修订. http://www.mympc.org/down/1/2005- ...
- ISSkin 使用技巧,WinXP 下的窗口阴影
原文 http://restools.hanzify.org/article.asp?id=109 是否觉得在使用 ISSkin 的时候感觉窗口太过平板,尤其对于那些窗口边缘和窗口内部颜色一致的皮肤尤 ...
- Hbase深入学习(一) 什么是hbase
Hbase深入学习(一) 什么是hbase 一.hbase是什么? 首先hbase是一个在Hadoop的HDFS分布式存储系统上介于映射(key/value)的nosql的分布式数据库:它通 ...