关于Tomcat中封装请求-响应的结构的分析
在编写Servlet时,往往只重写了doGet和doPost方法,使用Tomcat通过(HttpServletRequest 和 HttpServletResponse)接口传递来的request和response对象来处理请求并作出响应,因为学习(HttpServletRequestWrapper 和 HttpServletResponseWrapper)而引发request和response究竟是哪来的的思考,所以控制台输出了一下他们的类:
System.out.println(request.getClass());
System.out.println(response.getClass());
结果如下:
class org.apache.catalina.connector.RequestFacade
class org.apache.catalina.connector.ResponseFacade
由包名可以看出,这两个类并不是java servlet标准中的实现类,于是去Tomcat官网查看了API文档。
RequestFacade 和 ResponseFacade:
org.apache.catalina.connector
Class RequestFacade
- java.lang.Object
- org.apache.catalina.connector.RequestFacade
- All Implemented Interfaces:
- HttpServletRequest, ServletRequest
public class RequestFacade
extends java.lang.Object
implements HttpServletRequestFacade class that wraps a Coyote request object. All methods are delegated to the wrapped request.
org.apache.catalina.connector
Class ResponseFacade
- java.lang.Object
- org.apache.catalina.connector.ResponseFacade
- All Implemented Interfaces:
- HttpServletResponse, ServletResponse
public class ResponseFacade
extends java.lang.Object
implements HttpServletResponseFacade class that wraps a Coyote response object. All methods are delegated to the wrapped response.
由文档可以看出,这是两个包装类,并且实现了(HttpServletRequest 和 HttpServletResponse)接口。
再看他们的构造方法:
public RequestFacade(Request request)
Construct a wrapper for the specified request.
- Parameters:
request- The request to be wrapped
public ResponseFacade(Response response)Construct a wrapper for the specified response.
- Parameters:
response- The response to be wrapped
属性中有一个同构造方法参数类型的,很明显也是通过唯一构造持有了一个被包装的对象。
继续查找它们构造方法参数的类(org.apache.catalina.connector.Request 和 org.apache.catalina.connector.Response)
发现它们也是实现了(HttpServletRequest 和 HttpServletResponse)接口的类,不过其属性较多,而且构造函数为空,它们的属性中有一个似乎是提供了数据来源的对象,分别为(protected org.apache.coyote.Request coyoteRequest 和 protected org.apache.coyote.Response coyoteResponse)。
通过查阅相关资料得到以下信息:
原文地址:http://blog.csdn.net/zyq11223/article/details/78075268
(org.apache.coyote.Request 和 org.apache.coyote.Response)的实例是应用层拿到的请求-响应对象的底层实现,不便使用 。
(org.apache.catalina.connector.Request 和 org.apache.catalina.connector.Response)封装了(org.apache.coyote.Request 和 org.apache.coyote.Response)并实现了(HttpServletRequest 和 HttpServletResponse)接口。已经具备了实际使用能力,不过它还包含了很多Catalina的方法,这些方法不应该暴露给应用层,以免引起与其他容器实现的兼容性问题。
(RequestFacade 和 ResponseFacade)实现了(HttpServletRequest 和 HttpServletResponse)接口,并在其中分别包含了一个(org.apache.catalina.connector.Request 和 org.apache.catalina.connector.Response)对象,将所有(HttpServletRequest 和 HttpServletResponse)接口的调用都代理给(org.apache.catalina.connector.Request 和 org.apache.catalina.connector.Response)对象来处理,这样就屏蔽了Catalina的相关的内部方法,使用户可以专注于servlet的标准方法。
Ummmmm...
关于Tomcat中封装请求-响应的结构的分析的更多相关文章
- Tomcat 中get请求中含有中文字符时乱码的处理
Tomcat 中get请求中含有中文字符时乱码的处理
- HTTP 请求/响应报文结构
请求报文和响应报文都是由以下4部分组成: 1.请求行/响应行 2.请求头/响应头 3.空行 4.消息主体(请求体/响应体) 请求报文结构 请求行 格式为:Method Request-URI HTTP ...
- servlet中的请求响应与重定向区别
一.概念 请求响应(转发):将客户端请求转发另一个servlet或者jsp页面------------------------getRequestDispatcher()方法 重定向: 返回一个连接给 ...
- HTTP请求/响应报文结构
HTTP协议版本有两种:HTTP1.0和HTTP1.1 它们俩的区别在于:HTTP1.0对于每个连接都只能传送一个请求和响应,请求后就会关闭,HTTP1.0没有Host字段:而HTTP1.1在同一个连 ...
- Fiddler中session请求/响应类型与图标含义
近期在看fiddler抓包工具,发现前面都会有小图标显示,不同的图标代表了不同的含义,通过查询,整理如下: 请求发送到服务器 从服务器下载响应结果 请求在断点处被暂停 响应在断点处被暂停 请 ...
- Grafana和influxdb监控nginx日志中的请求响应时间图形化监控
监控效果如图: 监控方法: 通过logstash过滤nginx日志,然后解析出nginx日志中的request time字段 然后output到influxdb时序数据库中 通过grafana展示数据 ...
- Katalon Studio之请求响应中文乱码解决方法
最近在用Katalon做接口测试过程中发现请求响应消息中返回的中文均为乱码,这是因为我们使用的系统环境在初始安装时选择的中文简体,导致windows系统默认编码格式为GBK,但是KS的编码格式是UTF ...
- 牛客网Java刷题知识点之什么是HTTP协议、什么是HTTP隧道、HTTP响应的结构是怎么样的、HTTP报头包含哪些、HTTP中GET与POST方法有什么区别
不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21169&query=&asc= ...
- 使用C#在CEF中拦截并响应请求
一.前言 忙里偷闲,研究了一下如何在CEF中拦截请求,并作出响应.这个功能对某些需要修改服务器响应的需求来说必不可少,可以直接读取本地文件作为响应内容. C#的CEF封装项目有很多,我使用的是Chro ...
随机推荐
- webpack新版本4.12应用九(配置文件之输出(output))
output 位于对象最顶级键(key),包括了一组选项,指示 webpack 如何去输出.以及在哪里输出你的「bundle.asset 和其他你所打包或使用 webpack 载入的任何内容」. ou ...
- Java面试题:如何对HashMap按键值排序
Java中HashMap是一种用于存储“键”和“值”信息对的数据结构.不同于Array.ArrayList和LinkedLists,它不会维持插入元素的顺序. 因此,在键或值的基础上排序HashMap ...
- 【brew使用技巧】fix links
brew link --overwrite python
- CAN总线远程帧和错误帧
远程帧 通常,数据传输是由数据源节点(例如,传感器发出数据帧)自主完成的.但也可能存在目标节点向源节点请求发送数据的情况.要做到这一点,目标节点需发送一个远程帧,其中的标识符应与所需数据帧的标识符相匹 ...
- php设计模式之单例(多例),注册器,观察者模式
单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...
- 【转】使用Jmeter测试Webservice简单示例
1.webservice 先简单开发webservice,参考文档 http://www.cnblogs.com/xwdreamer/archive/2011/12/07/2296914.html w ...
- web项目WebContent目录结构参考(WEB-INF)
WEB-INF目录是Java WEB应用的安全目录,客户端(浏览器等)无法访问,只有服务端可以访问.该目录主要用来存放配置文件,如web.xml等. 若是将jsp文件放在WEB-INF目录中,则必须通 ...
- U-boot分析与移植(1)----bootloader分析
一.Boot Loader 概念 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作 ...
- select,poll,epoll,selectors
一 了解select,poll,epoll IO复用:为了解释这个名词,首先来理解下复用这个概念,复用也就是共用的意思,这样理解还是有些抽象, 为此,咱们来理解下复用在通信领域的使用,在通信领域中为了 ...
- 19-EasyNetQ:用EasyNetQ.Hosepipe重新提交错误信息
EasyNetQ.Hosepipe是EasyNetQ队列管理工具.用来取回队列中的消息并重新发布这些消息.还可以用它来检测错误队列,并重试发布消息. 用法 EasyNetQ.Hosepipe.exe ...