zoukankan      html  css  js  c++  java
  • 关于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...

  • 相关阅读:
    第12组(78) 团队展示(组长)
    第一次结对编程作业
    Alpha冲刺总结
    第02组Alpha冲刺(6/6)
    第02组Alpha冲刺(5/6)
    第02组Alpha冲刺(4/6)
    第02组Alpha冲刺(3/6)
    第02组Alpha冲刺(2/6)
    第02组Alpha冲刺(1/6)
    第02组(51)需求分析报告
  • 原文地址:https://www.cnblogs.com/Leroscox/p/8307869.html
Copyright © 2011-2022 走看看