Tomcat为什么要使用Facade模式对Request对象进行封装?

377 阅读3分钟

前言:HttpServletRequest 类的作用

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求发来的HTTP协议信息 解析好 封装到Request对象中,然后传递到 service()方法中(调用doGet()或doPost()方法) 供编程人员使用,编程人员通过HttpServletRequest对象,可以获取到请求的所有信息。

原文链接:blog.csdn.net/cmm0401/art…

image.png

Tomcat为什么要使用Facade模式对Request对象进行封装?

为了屏蔽内部catalina容器的相关方法,使用户免受非servlet标准方法的干扰。

tomcat中request的包装结构:

image.png

org.apache.catalina.connector.Request类(tomcat80/Request.java at trunk · apache/tomcat80 · GitHub)封装了org.apache.coyote.Request类,实现了HttpServletRequest接口,已经具备了实际使用能力,不过它还包含了很多Catalina的方法,这些方法不应该暴露给应用层,以免引起与其他容器实现的兼容性问题。

org.apache.catalina.connector.RequestFacade类(tomcat80/RequestFacade.java at trunk · apache/tomcat80 · GitHub)实现了HttpServletRequest接口,并在其中包含了一个org.apache.catalina.connector.Request对象,将所有HttpServletRequest接口的调用,都代理给org.apache.catalina.connector.Request对象来处理,这样就屏蔽了Catalina的相关的内部方法,使用户可以专注于servlet的标准方法。

从org.apache.catalina.connector.RequestFacade这个类,我们可以看到,这是一个使用了fa?ade模式的包装类,所以我们需要先了解一下fa?ade模式的相关知识。 Facade模式介绍 facade模式的核心是为子系统的一组接口提供一个统一的界面,方便客户端使用子系统,客户端也不必关心子系统的具体实现。 facade设计模式的适用情况:

  1. 原来的类提供的接口比较多,也比较复杂,而我们只需要使用其部分接口;
  2. 原类提供的接口只能部分的满足我们的需要,且不希望重写一个新类来代替原类; ... 在本文中,RequestFacade是对Request的一个封装,由于Request本身提供的接口非常之多,而本系统中只需要使用其部分功能,在实际分析过程中,我们发现Request的具体工作最后delegate到底层的coyote.Request去做。

java中Servlet与Tomcat的关系是什么?

(1)Tomcat是什么?

Tomcat其实是Web服务器和Servlet容器的结合体

(2)什么是Web服务器?

比如,我当前在杭州,你能否用自己的电脑访问我桌面上的一张图片?恐怕不行,我们太习惯通过URL访问的一个网站、下载一部电影了。一个资源,如果没有URL映射,那么外界几乎很难访问,而Web服务器的作用说穿了就是:将某个主机上的资源映射为一个URL供外界访问

(3)什么是Servlet容器?

Servlet是运行在Web服务器或应用服务器上的程序。

Servlet容器,顾名思义里面存着Servlet对象,我们为什么能够通过Web服务器映射的URL访问资源?肯定需要写程序处理请求,主要3个过程:接受请求,处理请求,响应请求。