关于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

 

 


 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...

posted @ 2018-01-18 03:37  Leroscox  阅读(1250)  评论(0编辑  收藏  举报