深入剖析Spring Web源码(五) - DispatcherServlet的实现 - 通用Servlet和HTTP Servlet

 

1.1.1   通用 Servlet 和 HTTP Servlet

HTTP Hyper Text Transfer Protocol)是超文本传输协议的缩写,它用于传送 WWW方式的数据,关于 HTTP协议的详细内容请参考 RFC2616 HTTP协议采用了请求 /响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、 URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于 MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

 

HTTP协议支持各种类型的方法,其中包括, GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE

  • GET方法将请求参数放在请求的头中,请求服务器做某些服务操作并返回响应。
  • POST方法从客户机向服务器传送数据,并可能要求服务器做出某些服务操作进行响应。
  • PUT方法请求将一个资源放在服务器的某个路径下。
  • DELETE方法请求将服务器某路径下的一个资源删除。
  • HEAD要求服务器查找某对象的头信息,包括应该包含的请求体的长度,而不是对象本身。
  • OPTION方法用来查询服务器的实现信息。
  • TRACE多数情况下用在调试目操作上。

下图是 Servlet规范的接口和实现类的继承结构,每个类的方法包括实体方法,抽象方法或者占位符方法。抽象方法和占位符方法由子类实现。

 

图表 4‑2

 

从上图我们可以看出, Servlet接口定义了 3个重要的接口方法, init()方法是在 Sevlet初始化的时候调用的,提供给 Servlet组件进行初始化自己的机会。与此相对应, detroy()方法是在 Servlet析构时候调用的,提供给 Servlet组件进行释放使用过的资源的机会。而 sevice()方法是用来处理每一个 Web容器传递进来的请求与响应的。

 

通用 Servlet实现了 Servlet的接口方法 init(), 方法中保存了 Servlet容器传递过来的 ServletConfig对象。如下图程序片段所示,

 

 

通用 Servlet的方法 service()是一个显示定义的抽象方法,要求实现类必须重写这个方法的实现。因为不同的 Servlet实现会依赖不同的协议,实现各不相同。 D

 

destroy()是一个方法占位符,子类可以有选择的实现进而进行资源的清理。

 

HTTP Servlet正如我们所愿,实现了通用 Servlet service()方法,根据 HTTP请求中所标识的方法,把 HTTP请求派遣到不同的处理方法中。如下图所示,

 

图表 4‑3

 

这些不同的方法有不同的实现,这些处理方法中的大部分是占位符,但是,它为 doOptions() doTrace()提供了具体实现,因为对于不同的 HTTP Servlet组件,这两个方法的行为基本是不变的。他们都是用于返回服务器信息和调试目的。如下图代码注释,

 

 

从上面两个方法的实现中我们可以看到, HTTP Servlet根据不同的 HTTP方法进行了 HTTP请求的分发。这样,不同方法的请求会使用不同的处理方法进行处理。事实上 doGet() doPost(), doPut(), doDelete()都是占位符实现,子类应该有选择的重写这些方法来实现真正的服务逻辑。 Spring Web MVC就是通过重写这些方法,开始控制流的实现的。

 

下面是 doGet()方法的代码注释。

 

 

doHead()方法的实现通过对 HTTP响应类进行包装,实现了 NoBodyReponse类,这个类忽略了对 HTTP响应体的输出。重用了 doGet()方法的实现,并且保留了 HTTP头信息的输出。所以,如果一个子类 Servlet重写了 doGet()方法,这个方法 doHead()是不需要重写的。代码注释如下,

 

 

doPost(), doPut(), doDelete()方法的实现和 doGet()方法的实现是类似的,他们都是一个占位符的实现,子类 Servlet需要有选择的进行重写进而实现真正需要的 HTTP服务。

 

然而, doOptions() doTrace()对任何 Servlet的实现,基本是不变的,他们是用来查询服务器信息和调试所用,他们的实现如下,

 

 

从上面的代码注释中,我们可以看到 Servlet规范中的 HTTP Servlet的实现只是一个占位符实现,并不包含完全的服务实现,一些服务的实现是由子类 Servlet完成的。 Spring Web MVC就是通过实现这些占位符方法来派遣 HTTP请求到 Spring Web MVC的控制器组件方法的。

 

下面一节我们将深入剖析 Spring Web MVC 的控制器是如何进行派遣和处理 HTTP 请求的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值