前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet 体系结构

Servlet 体系结构

作者头像
JavaEdge
发布2018-05-16 10:26:43
8110
发布2018-05-16 10:26:43
举报
文章被收录于专栏:JavaEdge

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

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 到底是个什么对象呢?

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 的转变过程

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.12.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档