Servlet

Servlet

July 28, 2017
Java, Web, Servlet

这里有一些概念非常的恶心,一开始的时候不太好理解是什么。通过一段时间的实践,我逐渐理解,所以直到今天才开始写这一篇。 容器Container # 这个概念从我一开始接触Java就让我很困惑。 首先你需要先去看一下我在后面的一篇关于tomcat的配置文件:server.xml。在那里了解一下配置文件的结构,你可以看懂下面的这张图片。 首先,容器这个东西是针对servlet来说的,也就是我们说的容器都是放置和运行servlet的程序。tomcat是个容器。但是上面的每一级都算是一种容器,只是大小不同。 为什么要有容器 # 其实对于计算机软件体系来说,一切的东西的出现都是因为标准和规定。 所谓容器其实就是一个程序,这个程序按照servlet需要的标准实现了一些接口,使得当你写了一个servlet以后可以成功的放在这个程序中运行,再直白一点就是,你把你的servlet程序交给这个容器,容器可以成功的运行你的程序。 他们之间通过约定一些标志物信息来实现无缝对接。 所以学习这写东西就是在学习了解他们之间约定的事物,以及,为什么这么约定,这样的约定有什么好处和坏处。 容器是一段程序吗? # 在tomcat中,并没有容器这个东西,所以容器并不是一个东西,就像水果并不是一个具体的苹果一样。容器是一个抽象的概念。 在tomcat中,如上图,有很多的层。这些层就是一个容器结构。他们一起构成了一个完整的容器。 Engine 是一段基础的引擎程序。我认为是整个tomcat的基础,所有的其他容器都在其的调度控制之下。 Host 这是一个逻辑概念,但也有对应的实体。在讲tomcat的配置文件servers.xml 的时候,有提到这个host是什么回事。有了这一层,可以在一个tomcat容器中部署不同的项目,这些项目的域名都是不同的。也就是这个容器可以容纳很多的servlet并且这些servlet可以是几种粒度的。 你可以是完全不同的两个网站,域名都不同,放在一个容器中运行。你也可以是一个网站的不同组件,放在不同的Context内运行。 所以容器是个体系,不是一个东西。 其实按照这个思路,一切皆容器。因为一切的这些都是调度管理,操作系统调度进程,进程调度线程。一切都是接口和约定。所以万物皆容器。 什么是servlet # 这是一个标准,你的程序符合这个标准就是一个servlet程序。 一个类其实就是一个servlet,但是很多个类在一起只要有一个servlet的接口,也是一个servlet。 (在此我们不再讨论tomcat的启动过程,我们更关心一个servlet放入tonmcat容器以后的过程) 来看一下这个图片,这就是servlet主要关联的几个类。 **摘抄:** 从上图可以看出 Servlet 规范就是基于这几个类运转的,与 Servlet 主动关联的是三个类,分别是 ServletConfig、ServletRequest 和 ServletResponse。这三个类都是通过容器传递给 Servlet 的,其中 ServletConfig 是在 Servlet 初始化时就传给 Servlet 了,而后两个是在请求达到时调用 Servlet 时传递过来的。 我们很清楚 ServletRequest 和 ServletResponse 在 Servlet 运行的意义,但是 ServletConfig 和 ServletContext 对 Servlet 有何价值? 仔细查看 ServletConfig 接口中声明的方法发现,这些方法都是为了获取这个 Servlet 的一些配置属性,而这些配置属性可能在 Servlet 运行时被用到。 而 ServletContext 又是干什么的呢? Servlet 的运行模式是一个典型的“握手型的交互式”运行模式。所谓“握手型的交互式”就是两个模块为了交换数据通常都会准备一个交易场景,这个场景一直跟随个这个交易过程直到这个交易完成为止。这个交易场景的初始化是根据这次交易对象指定的参数来定制的,这些指定参数通常就会是一个配置类。所以对号入座,交易场景就由 ServletContext 来描述,而定制的参数集合就由 ServletConfig 来描述。而 ServletRequest 和 ServletResponse 就是要交互的具体对象了,它们通常都是作为运输工具来传递交互结果。 ...