Java Web 深入分析(8) Servlet工作原理解析
Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
Servlet容器
- servlet容器启动过程:
在tomcat容器管理等级中,Context直接管理着Servlet在容器中的包装类Wrapper,所以Servelt容器如何运行就影响这servlet,下面就是servlet容器启动过程
Servlet容器启动时,触发servletContextEvent事件,并通知相应的监听器servletContextListener;
Servlet容器在启动的过程中通过servletContextListener监视servletContext的状态(初始化或者销毁servletContext);
servletContextListener中通过contextInitialized初始化方法,根据web.xml对servletContext进行配置,即将Context容器的属性缓存在内存中,供Service服务利用; web应用初始化工作:
web的初始化是在contextConfig中实现的,应用的初始化主要是对web.xml进行解析,这个文件描述了Web应用的关键信息,也是整个Web应用的入口。
Tomcat将web.xml文件解析后,将其中的属性设置到Context容器中,这里包括创建Servlet实例,Filter和Listener。将Servlet包装成Context中的包装类Wrapper。
Tomcat的context容器中的StrandWrapper对象就是tomcat中对于Servlet的包装也就是,Servlet是一种JavaWeb规范而不是直接耦合成一个类包装在tomcat容器里面,这是standwapper对象的设计初衷。Servlet实例
- 创建Servlet对象
如果Servlet在web.xml中load-on-startup的配置大于0,那么在Context容器启动时就会被实例化。在tomcat/conf/web.xml文件中,配置了2个load-on-startup为1,3的默认启动类,分别是Servlets.DefaultServlet、org.apache.servlet.JspServlet 初始化Servlet
前面讲了Servlet规范在tomcat的实现就是context中StandardWrapper。所以初始化的时候就是通过调用Servlet的init方法,同时把包装了StandarWrapper对象的StandarWrapperFacade作为ServletConfig传给Servlet。
Servlet从web.xml被解析到初始化。ServletConfig 和 ServletContext的区别ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
Servlet体系结构
- 如果说javaweb规范,概况来讲肯定离不开 servlet规范。而servlet规范主要有这3个类ServletConfig、ServletRequest、ServletResponse。ServletConfig在servlet初始化的过程中就传给了servlet了,而ServletRequest和ServletResponse在servlet运行中我很清楚的知道他们的用法。这个Servletconfig对象和Servlet采用典型的“握手型的交互”根据交互场景来组装数据。而实际上servletconfig通过其门面设计模式的servletcontext类给servlet引用,通过servletcontext 可以获得context容器的相关信息如路径 和最小版本。servletRequest和servletresponse又通过web容器封装成了 httpservletRequest和httpservletresponse对象

Servlet如何工作
先看一个典型的访问路径 http://localhost:80/test ,HTTP协议 +host名+port端口+url ,其中HTTP和host名用于服务器和客户机之间建立TCP/IP连接,而后面的url就是确立这个客户机浏览器将访问服务器web容器里面哪个servlet的。服务器的web容器中有一个mapper专门管理这种url<->servlet的映射关系!

- 然后这个请求URL进入到这个servlet容器中之后,就会调用相应的的service方法,通常我们不是直接去实现javax.servlet.servlet类,而是实现简单点的httpservlet或者genericServlet类,然后选择性覆盖相应方法去实现我们的功能。
- 然后再现在的MVC框架中,对于所有请求的处理的基本原理就是将它们都映射到一个Servlet,然后再去实现其service方法,这个方法也就是MVC的入口。
最后当servlet从web容器中移除后,这个servlet的生命周期也就相应的结束了由容器调用相应的destroy方法。
Servlet中的Listener
- 在整个tomcat容器的设计中,其实很多容器诸如此类,listener使用的非常广泛,它是基于观察者模式而设计的。类图如下

Filter如何工作
- 其实在web.xml 中,filter也是一个常用的配置项,与servlet对象相比 ,除了有request和response对象,它还有一个filterchain对象,类图如下。

- 在tomcat容器中,FilterConifg 和FilterChain的实现类分别是ApplicationFilterConfig和ApplicationFilterChain,而Filter接口由用户自己去实现,是这3个接口与Servlet中的类似,只不过ApplicationFilterChain可以把这些Filter串联起来,组成一个Filter链,这点和Jetty的Handler链在设计上有异曲同工之妙。
- 再看下如图的Filter类三个接口方法:

- Filter的一个比喻,如果有2条往返的加工流水线,我们可把这2条流水线看做 web交互中的request和response ,即请求和响应,在这2条流水线的远转图中,Filter就好比一个流水线工人对流动的产品进行处理,可以在某个工位存放或者取出或者拦截一些数据。
Servlet中的url-pattern
- 前面我们说过 Servlet 和 URL之间的对象关系 ,在tomcat有一个Mapper类实现请求访问时去对应哪个Servlet。而Filter的url匹配是在创建 ApplicationFilterChain时,对匹配的Url相应的Filter放入到ApplicationFilterChain对象的Filters数组中,然后FilterChain依次调用这些Filter。
- Url在web.xml被加载时会校验这些url-pattern是否合法,这个检查是在StandardContext的ValidateURLPattern中进行,吐过不通过就会报这个java.lang.IllegalArgumentException:Invalid ...
- 解析规则如下

Java Web 深入分析(8) Servlet工作原理解析的更多相关文章
- Servlet工作原理解析 《深入分析java web 技术内幕》第九章
参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...
- 【Java】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- Servlet 工作原理解析
转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/ Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 J ...
- JavaWeb总结--Servlet 工作原理解析
从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...
- [转]Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- Servlet 工作原理解析--转载
原文:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/index.html?ca=drs- Web 技术成为当今主流的互联网 Web 应用 ...
- 【Tomcat】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- Servlet工作原理解析(tomcat7、嵌入式服务器)
目录 Servlet 容器Tomcat Servlet 容器的启动过程 Web 应用的初始化工作 Servlet 体系结构 创建 Servlet 对象(如何被加载) 初始化 Servlet(如何被 ...
- Servlet工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 S ...
随机推荐
- daoliu平台:测试线路图
1.进行需求收集及分析 搜索关键字:导流平台 同类产品体验及熟悉 搞清楚,业务流.数据流.用户焦点 2.初步熟悉原型 初步熟悉.遍历原型, 初步进行测试需求分析 3.聆听及和权威的人进行沟通 测试人员 ...
- telnet nmap netstap
yum install nmap [root@10-13-109-236 ~]# nmap localhost Starting Nmap 6.40 ( http://nmap.org ) at 20 ...
- JavaScript Functional Programming:声明式与命令式
函数式编程属于声明式编程(declarative programming)的范畴,经常跟声明式编程一块儿讨论的是命令式编程(imperative programming),因为它们是两种不太一样的风格 ...
- Animator动画XML实现
在res下创建文件夹animator文件夹 <?xml version="1.0" encoding="utf-8"?> <objectAni ...
- linux性能监控 -CPU、Memory、IO、Network等指标的讲解
[操作系统-linux]linux性能监控 -CPU.Memory.IO.Network等指标的讲解(转) 一.CPU 1.良好状态指标 CPU利用率:User Time <= 70%,Syst ...
- DTC & MSDTC (待研究)
相关学习文档: Database Systems: The Complete Book
- 【pep8规范】arc diff 不符合 pep 8 规范
arc land 的时候,arc报错提示代码不符合pep8规范: 1.单行代码过长(括号中的换行不需要加 /) python代码换行加 / https://blog.csdn.net/codechel ...
- self-attention详解
编写你自己的 Keras 层 对于简单.无状态的自定义操作,你也许可以通过 layers.core.Lambda 层来实现.但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层. 这是一个 K ...
- 最新 开创java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.开创等10家互联网公司的校招Offer,因为某些自身原因最终选择了开创.6.7月主要是做系统复习.项目复盘.LeetCode ...
- Yarn 资源调度器
1. 概述 YARN 是一个资源调度平台,负责为运算程序提供服务器运算资源: YARN 由ResourceManager,NodeManager, ApplicationMaster 和 Contai ...