在编写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. SPOJ1812 Longest Common Substring II

    题意 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is th ...

  2. __init__.py文件的作用

    原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了.当 ...

  3. php小白和菜鸟 上班路上可以看的修行博客

    上班地铁 公交上我们不要去追剧 不要去打游戏 不要看看有效性的海量新闻, 我们需要去技术博客里遨游, 下面就推荐点与php有关的可以学习的技术博客; 大部分程序员在自学的道路上不知道走了多少坑,这个视 ...

  4. redis的安装和类型及基本命令

    一.memcached和redis区别 1. redis 可以存储,memcached用来缓存, 2. 数据类型,memcached只有string:redis有string,链表,哈希结构,集合,有 ...

  5. 张瀚荣:如何用UE4制作3D动作游戏

    转自:http://www.gamelook.com.cn/2015/06/218267 GameLook报道/ 6月5日,2015年第三期GameLook开放日‧虚幻引擎专场活动在上海正式举行,此次 ...

  6. 给安卓端调用的短信发送接口demo

    package com.js.ai.modules.pointwall.action; import java.io.IOException; import java.util.HashMap; im ...

  7. python--open用法

    open/文件操作f=open('/tmp/hello','w') #open(路径+文件名,读写模式) #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式 如:' ...

  8. 当我们谈 SQL 优化时在谈些什么?

    作者 |孙银行编辑 | 顾乡 背景 Mysql数据库作为数据持久化的存储系统,在实际业务中应用广泛.在应用也经常会因为SQL遇到各种各样的瓶颈.最常用的Mysql引擎是innodb,索引类型是B-Tr ...

  9. error: undefined reference to 'av_register_all()'

    cygwin下ndk编译工程中使用ffmpeg时出现的错误:“error: undefined reference to 'av_register_all()'” 使用ffmpeg的源文件是  *.c ...

  10. React 常用面试题目与分析

    调用 setState 之后发生了什么? 在代码中调用setState函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation).经过调和过程 ...