在编写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

org.apache.catalina.connector

Class ResponseFacade

  • java.lang.Object
    • org.apache.catalina.connector.ResponseFacade

由文档可以看出,这是两个包装类,并且实现了(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中封装请求-响应的结构的分析的更多相关文章

  1. Tomcat 中get请求中含有中文字符时乱码的处理

    Tomcat 中get请求中含有中文字符时乱码的处理

  2. HTTP 请求/响应报文结构

    请求报文和响应报文都是由以下4部分组成: 1.请求行/响应行 2.请求头/响应头 3.空行 4.消息主体(请求体/响应体) 请求报文结构 请求行 格式为:Method Request-URI HTTP ...

  3. servlet中的请求响应与重定向区别

    一.概念 请求响应(转发):将客户端请求转发另一个servlet或者jsp页面------------------------getRequestDispatcher()方法 重定向: 返回一个连接给 ...

  4. HTTP请求/响应报文结构

    HTTP协议版本有两种:HTTP1.0和HTTP1.1 它们俩的区别在于:HTTP1.0对于每个连接都只能传送一个请求和响应,请求后就会关闭,HTTP1.0没有Host字段:而HTTP1.1在同一个连 ...

  5. Fiddler中session请求/响应类型与图标含义

    近期在看fiddler抓包工具,发现前面都会有小图标显示,不同的图标代表了不同的含义,通过查询,整理如下:  请求发送到服务器  从服务器下载响应结果  请求在断点处被暂停  响应在断点处被暂停  请 ...

  6. Grafana和influxdb监控nginx日志中的请求响应时间图形化监控

    监控效果如图: 监控方法: 通过logstash过滤nginx日志,然后解析出nginx日志中的request time字段 然后output到influxdb时序数据库中 通过grafana展示数据 ...

  7. Katalon Studio之请求响应中文乱码解决方法

    最近在用Katalon做接口测试过程中发现请求响应消息中返回的中文均为乱码,这是因为我们使用的系统环境在初始安装时选择的中文简体,导致windows系统默认编码格式为GBK,但是KS的编码格式是UTF ...

  8. 牛客网Java刷题知识点之什么是HTTP协议、什么是HTTP隧道、HTTP响应的结构是怎么样的、HTTP报头包含哪些、HTTP中GET与POST方法有什么区别

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21169&query=&asc= ...

  9. 使用C#在CEF中拦截并响应请求

    一.前言 忙里偷闲,研究了一下如何在CEF中拦截请求,并作出响应.这个功能对某些需要修改服务器响应的需求来说必不可少,可以直接读取本地文件作为响应内容. C#的CEF封装项目有很多,我使用的是Chro ...

随机推荐

  1. 限制UITextfield的输入字符为50个字符

    1.实现UITextfieldDelegate 2.在UITextfield的代理方法中判断添加字符还是删除字符,从而做不同的操作 #pragma mark-UITextfield的代理方法 - (B ...

  2. Android Theme的使用

    原文地址 http://www.cnblogs.com/Dentist/p/4369816.html Theme是一套UI控件和Activity的样式.可以给Application 和 activit ...

  3. laravel中好用的支付安装包

    是包括支付宝和微信的支付 准用包,在测试中 https://github.com/yansongda/laravel-pay 这个包,看上去很好但是composer require时,要求php太高, ...

  4. 庖丁解牛-----Live555源码彻底解密(根据MediaServer讲解Rtsp的建立过程)

    live555MediaServer.cpp服务端源码讲解 int main(int argc, char** argv) { // Begin by setting up our usage env ...

  5. Eclipse格式化代码,自动换行设置

    每次用Eclipse自带的Ctrl+shift+f格式化代码时,如果原来的一行代码大于80列,Eclipse就会自动换为多行,这点个人感觉不是很舒服,简单试了一下,通过以下方式可以修改   1.pre ...

  6. Zabbix 客户端自定义端口监控

    http://www.linuxidc.com/Linux/2013-05/83780.htm 

  7. 缓存 memcached 与 redis

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  8. mysql跟踪执行的sql语句

    修改my.cnf配置文件 /usr/local/mysql/bin/mysql --verbose --help | grep -A 1 'Default options' Default optio ...

  9. 【js与jquery】javascript中url编码与解码

    本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数 编码/解码 escape / u ...

  10. MVC原理图解

    注解: 视图中通过Action方法向控制器请求数据 控制器通过view()方法向视图呈现数据