tomcat中Servlet的工作机制
在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而对客户端请求处理时则调用service方法。对于这些机制的支持都必须由Tomcat内部去支持,具体则是由Wrapper容器提供支持。
在tomcat中消息流的流转机制是通过四个不同级别的容器管道机制进行流转的,对于每个请求都是一层一层处理的。如下图,当客户端请求到达服务端后请求被抽象成request对象后向四个容器进行传递,首先经过Engine容器的管道通过若干阀门,最后通过StandardEngineValve阀门流转到Host容器的管道,处理后继续往下流转,通过StandardHostValve阀门流转到Context容器的管道,继续往下流转,通过StandardContextValve阀门流转到Wrapper容器的管道,而对Servlet的核心处理也正是在StandardWrapperValve阀门中。StandardWrapperValve阀门调用Servlet的service方法队请求进行处理,然后对客户端响应。
下面更深入了解下StandardWrapperValve阀门调用Servlet的过程。
web应用的Servlet类都是根据Servlet接口,例如一般我们在写业务处理Servlet类时都会继承HttpServlet类,为了遵循Servlet规范,它其实最终也是实现了Servlet接口,只是HttpServlet定义了HTTP协议的Servlet,将协议共性的东西抽离出来复用。Servlet处理客户端请求的核心方法为service方法,所以对于HttpServlet来说,它需要针对http协议的GET、POST、PU、DELETE、HEAD、OPTIONS、TRACE等请求方法做出不同的分发处理,为方便理解,下面用个简化的代码展示:
public abstract class HttpServlet extends Servlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String method = req.getMethod();
if (method.equals("GET")) {
doGet(request, response);
}else if (method.equals("POST")) {
doPost(request, response);
}else if (method.equals("HEAD")) {
doHead(request, response);
}
}
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}
service方法将请求对象和响应对象转换成HttpServletRequest和HttpServletResponse,然后获取请求方法,根据请求方法调用不同的处理方法,例如如果为GET方法则调用doGet方法,那么在继承了HttpServlet类的Servlet只需重写doGet或doPost方法完成业务逻辑处理,这就是我们熟悉的Servlet了。
这样一来,StandardWrapperValve阀门调用Servlet的工作其实就是通过反射机制实现对Servlet对象的控制,例如在不配置load-on-startup情况下,客户端首次访问该Servlet时由于还不存在该Servlet对象,需要通过反射机制实例化出该Servlet对象,并且调用初始化方法,所以这也是为什么第一次访问某个Servlet时会比较耗时的原因,后面客户端再对该Servlet访问时都会使用该Servlet对象,无需再做实例化和初始化操作。有了Servlet对象后调用其service方法即完成了对客户端请求的处理。
实际上通过反射机制实例化Servlet对象是一个比较复杂的过程,它除了完成实例化和初始化工作外还要解析该Servlet类包含的各种注解并作处理,另外,对于实现了SingleThreadModel接口的Servlet类,它还要维护一个该Servlet对象池。
综上所述,Servlet工作机制大致流程是:request -> StandardEngineValve -> StandardHostValve -> StandardContextValve -> StandardWrapperValve -> 实例化并初始化Servlet对象 -> 调用该Servlet对象的service方法 -> response。
tomcat中Servlet的工作机制的更多相关文章
- kubernetes 中的证书工作机制
一文带你彻底厘清 Kubernetes 中的证书工作机制 搬砖者: 张首富 时 间: 2020-05-26 w x: y18163201 原文地址:https://zhaohuabing.com/po ...
- Tomcat中JSP引擎工作原理
http://blog.csdn.net/linjiaxingqqqq/article/details/7164449 JSP运行环境: 执行JSP代码需要在服务器上安装JSP引擎,比较常见的引擎有W ...
- 关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...
- Tomcat中session的管理机制
1. 请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取s ...
- tomcat中servlet冲突问题
在启动tomcat以后,控制台发现“Offending class: javax/servlet/Servlet.class”信息: 信息: validateJarFile(E:\code\MyApp ...
- 深入了解tomcat中servlet的创建方式实现
Tomcat如何创建Servlet? A.先到缓存中寻找有没有这个对象(Servlet是单实例的,只会创建一次) 如果没有: 1.通过反射去创建相应的对象(执行构造方法) 2.tomcat会把对象存放 ...
- tomcat中session在两个webapp中实现共享
现在遇到一个需求就是要求完成简单的单点登录,通过在一个tomcat实例中放置两个webapps应用ROOT应用和CEO应用来完成在ROOT应用登录后,在CEO可以直接使用,而未在ROOT应用登录时,不 ...
- MapReduce的工作机制
<Hadoop权威指南>中的MapReduce工作机制和Shuffle: 框架 Hadoop2.x引入了一种新的执行机制MapRedcue 2.这种新的机制建议在Yarn的系统上,目前用于 ...
- Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
WEB简介 Web项目 是 B/S结构 浏览器/服务器模式的 浏览器发起请求,服务器作出响应 请求的发起和响应使用HTTP协议进行通讯 所谓协议也就是一种固定格式 而Socket是应用 ...
随机推荐
- ●UVA 10652 Board Wrapping
题链: https://vjudge.net/problem/UVA-10652 题解: 计算几何,Andrew求凸包, 裸题...(数组开小了,还整了半天...) 代码: #include<c ...
- 【UVA–11997 K Smallest Sums 】
·哦,这题要用优先队列?那大米饼就扔一个手写堆上去吧! ·英文题,述大意: 输入n个长度为n的序列(题中是k,2<=k<=750).一种结果定义为:从每个序列中都要挑选一个数加 ...
- 5650 so easy
so easy Accepts: 512 Submissions: 1601 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6553 ...
- 习题 7-3 uva211
题意:给你28个多米勒牌,要求刚好铺满一个7x8的图,输出所有答 案.每个牌只能使用一次 思路: 对每个位置分别搜索其右边 和 下边. 但是在中途,细节上有点问题.最开始想的是搜到最后一个点输出答案, ...
- hihocoder1257(构造)(2015北京ACM/ICPC)
题意: 给你n条蛇,a[i]的长度为i,要求组成一个矩形.奇数蛇可折叠奇数次,偶数蛇折叠偶数次,然后按蛇的次序输出 (即一条蛇的输出只能是一个方向的) 2 3 1 2 1 3 2 3 1 1 2 1 ...
- Saltstack基础
salt介绍 salt简单介绍 一个基础平台管理工具 一个配置管理系统,能够维护预定义状态的远程节点 一个分布式远程执行系统,用来在远程节点上执行命令和查询数据 salt的核心功能 使命令发送到远程系 ...
- JPA注解实体类,给表添加创建时间,更新时间,id的生成以及创建唯一约束
首先创建一个BaseModel,自动生成创建时间和更新时间 @SuppressWarnings("serial") @MappedSuperclass public class B ...
- C++ C# python 中常用数学计算函数对比
1.求x 的n次幂. C++ #include<cmath> f=pow(x,n) C# f=Math.Pow(x,n) python import numpy as np f=np.po ...
- HttpServletRequest获取URL?后面的内容
获取URL?后面的内容 如https://i.cnblogs.com/EditPosts.aspx?opt=1 String para = request.getQueryString(): para ...
- easing--缓动函数--贝塞尔函数--圆盘转动抽奖应用
http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js http://www.robertpenner.com/easing/penn ...