how tomcat works 读书笔记 十一 StandWrapper 下
StandardWrapperValve
StandardWrapperValve是StandardWrapper的基础阀,主要完成了三个工作。
1 调用StandardWrapper的allocate的方法来获得该StandardWrapper所表示的servlet实例
2 执行与该servelt相关联的全部过滤器
3 调用servlet的service方法
其中第二三步可以细分为
调用它的 private createFilterChain 方法获得过滤链
调用过滤器链的 doFilter 方法。这里面就调用了servlet 的 service方法
释放过滤器链
调用包装器的deallocate方法
如果Servlet无法使用了,调用包装器的 unload 方法
我们看看大致的代码片段
// Allocate a servlet instance to process this request try { if (!unavailable) { servlet = wrapper.allocate(); } } ... // Acknowlege the request try { response.sendAcknowledgement(); } ... // Create the filter chain for this request ApplicationFilterChain filterChain = createFilterChain(request,servlet); // Call the filter chain for this request// This also calls the servlet's servicet() method try { String jspFile = wrapper.getJspFile(); if (jspFile != null) sreq.setAttribute(Globals.JSP_FILE_ATTR, jspFile); else sreq.removeAttribute(Globals.JSP_FILE_ATTR); if ((servlet != null) && (filterChain != null)) { filterChain.doFilter(sreq, sres); } sreq.removeAttribute(Globals.JSP_FILE_ATTR); } ... // Release the filter chain (if any) for this request try { if (filterChain != null) filterChain.release(); } ... // Deallocate the allocated servlet instance try { if (servlet != null) { wrapper.deallocate(servlet); } } ... // If this servlet has been marked permanently unavailable, // unload it and release this instance try { if ((servlet != null) && (wrapper.getAvailable() ==Long.MAX_VALUE)) { wrapper.unload(); } }
看了上面的代码,大家应该能看出来最复杂的部分有两处
其一 ApplicationFilterChain filterChain = createFilterChain(request,servlet);
其二 filterChain.doFilter(sreq, sres);
一步一步来。
FilterDef类
这个类的全名应该是FilterDefinition,过滤器描述类。
里面包含了一个Filter的filterClass,filterName等基本信息,及get/set方法。
这里面的属性,我们可以看看这个
/** * The set of initialization parameters for this filter, keyed by * parameter name. */ private Map<String, String> parameters = new HashMap<String, String>();
用HashMap存储了初始化参数,它有get方法,增加属性的方法是addInitParameter(String name, String value)。
ApplicationFilterConfig类
org.apache.catalina.core.ApplicationFilterConfig 实现了javax.servlet.FilterConfig 接口。ApplicationFilterConfig 负责管理 web应用程序启动的时候创建的过滤器实例。
其构造函数如下:
public ApplicationFilterConfig(Context context, FilterDef filterDef)
throws ClassCastException, ClassNotFoundException,IllegalAccessException, InstantiationException, ServletException
在这里我们主要谈谈它的getFilter方法,该方法的功能其实就是加载过滤器类并初始化它。
首先从filterDef里面获得filterClass;
String filterClass = filterDef.getFilterClass(); ClassLoader classLoader = null; if (filterClass.startsWith("org.apache.catalina.")) classLoader = this.getClass().getClassLoader(); else classLoader = context.getLoader().getClassLoader(); ..... Class<?> clazz = classLoader.loadClass(filterClass); this.filter = (Filter) clazz.newInstance(); filter.init(this); return (this.filter);
还是没有什么要说的。
ApplicationFilterChain类
StandardWrapperValve 类中的 invoke 方法创建一个该类的实例并且调用它的 doFilter 方法。ApplicationFilterChain类的doFilter(其实是internalDoFilter)调用该链中第一个过滤器的 doFilter 方法。
ApplicationFilterChain类中,有一个ApplicationFilterConfig的引用
private ArrayList<ApplicationFilterConfig> filters = new ArrayList<ApplicationFilterConfig>();
看到了把,数组形式来存放链条。
典型的责任链模式。
Filter 接口中doFilter 方法的签名如下:
public void doFilter(ServletRaquest request, ServletResponse response,FilterChain chain) throws java.io.IOException, ServletException 在ApplicationFilterChain的doFilter方法中,它会将自己作为第三个参数传递给它。 我们看一个Filter实现类的例子 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // do something here ... chain.doFilter(request, response); }
循环往复了
此处的循环不是那么容易理解,建议参考鄙人的另一篇博客
http://blog.csdn.net/dlf123321/article/details/40078583
等所有的Filter都执行完了,就是下面的代码
if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) { servlet.service((HttpServletRequest) request, (HttpServletResponse) response); } else { servlet.service(request, response); }
什么时候Filter才算执行完了呢?
private Iterator<ApplicationFilterConfig> iterator = null; .... if (this.iterator == null) this.iterator = filters.iterator(); // Call the next filter if there is one if (this.iterator.hasNext()) { //执行filter } ... //调用servlet的service的代码块 ...
应用程序
和之前的几章没有什么区别,不再赘述。
how tomcat works 读书笔记 十一 StandWrapper 下的更多相关文章
- how tomcat works 读书笔记 十一 StandWrapper 上
方法调用序列 下图展示了方法调用的协作图: 这个是前面第五章里,我画的图: 我们再回顾一下自从连接器里 connector.getContainer().invoke(request, resp ...
- how tomcat works 读书笔记(二)----------一个简单的servlet容器
app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- How tomcat works 读书笔记十五 Digester库 下
在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...
- How tomcat works 读书笔记十七 启动tomcat 下
在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释 ...
- How tomcat works 读书笔记十二 StandardContext 下
对重载的支持 tomcat里容器对重载功能的支持是依靠Load的(在目前就是WebLoader).当在绑定载入器的容器时 public void setContainer(Container cont ...
- how tomcat works 读书笔记 八 载入器下
载入类 我们看看之前的文章,这一节就从SimpleWrapper的loadServlet讲起. SimpleWrapper.java如下(省略了try catch及其他部分代码) public Ser ...
- how tomcat works 读书笔记(一)----------一个简单的webserver
http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...
- how tomcat works 读书笔记(一)----------一个简单的web服务器
http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext tran ...
随机推荐
- JAXB(Java Architecture for XML Binding)
marshal(Java对象转化成XML) import javax.xml.bind.annotation.XmlRootElement; //指定根元素,其他属性默认为根元素的子元素 @XmlRo ...
- Android初级教程:Android中解析方式之pull解析
在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在j ...
- 【Android应用开发】Android Studio - MAC 版 - 快捷键详解
博客地址 : http://blog.csdn.net/shulianghan/article/details/47321177 作者 : 韩曙亮 要点总结 : -- 熟练使用快捷键 : 在任何编程环 ...
- Android ColorMatrix类图像颜色处理-黑白老照片、泛黄旧照片、高对比度等效果
在Android中,对图像进行颜色方面的处理,如黑白老照片.泛黄旧照片.高对比度.低饱和度等效果,都可以通过使用颜色矩阵(ColorMatrix)来实现. 1.颜色矩阵(ColorMatrix)介绍 ...
- Android 四种常见的线程池
引入线程池的好处 1)提升性能.创建和消耗对象费时费CPU资源 2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多. 我们来看一下线程池的简单的构造 public ThreadPoolExec ...
- Qt中实现启动画面
纵所周之,当一个程序的启动比较耗时的时候,为了不让用户枯燥的等待或者是误以为程序运行异常了,所以我们都会在启动比较耗时的程序中加上启动界面 ,例如office软件等等. 在Qt中实现启动界面,主要就是 ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- Cocos2D中的纹理(textures)的解释
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- LAPACK的C/C++接口及代码实例
今天介绍一个矩阵处理工具LAPACK,她有C\C++接口,可在windows下移植.本人最近正在学习,发现还是还不错滴~ 本博文分为三部分,第一部分介绍LAPACK的安装,这里只介绍最简单的部署:第二 ...
- 多层界面之间显示与隐藏tabBar
IOS中多层界面之间显示与隐藏tabBar? 在做项目的时候,遇到了一个难题,使用hidesBottomWhenPushed=YES属性设置,可以让本级界面及其以后界面都隐藏,但是根据项目 需求,在第 ...