关于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 HttpServletRequest
Facade 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 HttpServletResponse
Facade 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...