Servlet 体系结构

简介: 我们知道 Java Web 应用是基于 Servlet 规范运转的,那么 Servlet 本身又是如何运转的呢?为何要设计成这样呢Servlet 顶层类关联图从上图可以看出 Servlet 规范就是基于这几个类运转的,与 Servle...

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

img_44e88b2632b33b3f00f345c8f817a731.png
Servlet 顶层类关联图

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

  • ServletConfig 在 Servlet 初始化时传给 Servlet
  • 后两个在请求达到时调用 Servlet 时才传递

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

  • 仔细查看 ServletConfig 接口中声明的方法,发现都是为了获取这个 Servlet 的一些配置属性,而这些配置属性可能在 Servlet 运行时被用到。
  • ServletContext 又是干什么的呢? Servlet 的运行模式是一个典型的“握手型的交互式”运行模式。
    所谓“握手型的交互式”就是两个模块为了交换数据通常都会准备一个交易场景,这个场景一直跟随交易过程直到交易完成。这个交易场景的初始化是根据这次交易对象指定的参数来定制的,这些指定参数通常就会是一个配置类。所以对号入座,
    • 交易场景由 ServletContext 描述
    • 定制的参数集合由 ServletConfig描述
    • ServletRequestServletResponse 是要交互的具体对象,它们通常都是作为运输工具来传递交互结果

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

img_b102ade162eb62e9e432cf18b2040019.png
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,这里使用门面模式与前面一样都是基于同样的目的即封装容器中的数据

img_a5b10f0fd75c839ade26cab915fb868a.png
与Request 相关的类结构图

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


img_7c56ebbf8704a52cc9ffb963e8c8c10e.png
Request 和 Response 的转变过程
目录
相关文章
|
7月前
Servlet方法介绍及体系结构
Servlet方法介绍及体系结构
64 0
|
6月前
|
应用服务中间件
|
7月前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
73 2
|
7月前
|
Web App开发 XML Java
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
123 2
|
开发框架 Java .NET
|
安全 Java 应用服务中间件
javaweb servlet体系结构与原理剖析
1.Servlet的工作过程 当用户通过 URL 发出一个请求时,这些 Java servlet 类就将之转换成一个 HttpServletRequest,并发送给 URL 所指向的目标。当服务器端完成其工作时,Java 运行时环境(JRE)就将结果包装在一个 HttpServletResponse 中,然后将原 HTTP 响应送回给发出该请求的客户机。 在与 Web 应用程序进行交互时,通常会发出多个请求并获得多个响应。所有这些都是在一个会话语境中,Java 语言将之包装在一个 HttpSession 对象中。在处理响应时,您可以访问该对象,并在创建响应时向其添加事件。它提供了一些跨请求的语
181 0
javaweb servlet体系结构与原理剖析
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
41 3
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
40 1