Servlet程序员

Servlet 体系结构

2017-12-14  本文已影响31人  紫霞等了至尊宝五百年

我们知道 Java Web 应用是基于 Servlet 规范运转的,那么 Servlet 本身又是如何运转的呢?为何要设计成这样呢

Servlet 顶层类关联图
从上图可以看出 Servlet 规范就是基于这几个类运转的,与 Servlet 主动关联三个类 ServletConfigServletRequest , ServletResponse
这三个类都是通过容器传递给 Servlet 的

我们很清楚ServletRequestServletResponse 在 Servlet 运行时的意义,但是 ServletConfigServletContext 对 Servlet 有何价值?

ServletConfig 是在 Servlet init 时由容器传过来的,那么 ServletConfig 到底是个什么对象呢?

ServletConfig,ServletContext在 Tomcat 容器中的类关系

可以看出 StandardWrapperStandardWrapperFacade 都实现了 ServletConfig 接口,而 StandardWrapperFacadeStandardWrapper 门面类。
所以传给 Servlet 的是 StandardWrapperFacade 对象,它能够保证从 StandardWrapper 中拿到 ServletConfig 所规定的数据,而又不把 ServletConfig不关心的数据暴露给 Servlet

ServletContextServletConfig 也有类似的结构,Servlet 中能拿到的 ServletContext 的实际对象是 ApplicationContextFacade ApplicationContextFacade 同样保证 ServletContex只能从容器中拿到它该拿的数据,它们都起到对数据的封装作用,它们使用的都是门面设计模式
通过 ServletContext 可以拿到 Context 容器中一些必要信息,比如应用的工作路径,容器支持的 Servlet 最小版本等。

Servlet 中定义的两个 ServletRequestServletResponse 它们实际的对象又是什么呢?
我们在创建自己的 Servlet 类时通常使用的都是 HttpServletRequestHttpServletResponse,它们继承了 ServletRequest 和** ServletResponse**
为何 Context 容器传过来的 ServletRequestServletResponse 可以被转化为 HttpServletRequestHttpServletResponse 呢?

Tomcat 接受到请求首先将会创建 org.apache.coyote.Requestorg.apache.coyote.Response
这两个类是 Tomcat 内部使用的描述一次请求和响应的信息类
它们是一种轻量级的类,作用就是在服务器接收到请求后,经过简单解析将这个请求快速分配给后续线程去处理,所以它们的对象很小,很容易被 JVM 回收。

接下来当交给一个用户线程去处理这个请求时又创建 org.apache.catalina.connector.Requestorg.apache.catalina.connector.Response .这两个对象一直穿越整个 Servlet 容器直到要传给 Servlet,传给 Servlet 的是 Request 和 Response 的门面类 RequestFacadeResponseFacade,这里使用门面模式与前面一样都是基于同样的目的即封装容器中的数据

与Request 相关的类结构图

一次请求对应的 Request 和 Response 的类转化如下图


Request 和 Response 的转变过程
上一篇 下一篇

猜你喜欢

热点阅读