Servlet接口是Servlet API的最核心抽象类。所有的servlets都直接实现了这个接口,或者以更通用的方式继承了这个接口的实现类。Servlet API自带了两个实现了Servlet接口的类:GenericServlet和HttpServlet。绝大多数情况下,开发人员都会继承HttpServlet来开发servlets。

SRV.2.1    处理请求的方法

Servlet接口定义了一个service方法来处理客户端请求。servlet容器把每一个请求都路由到对应的Servlet中,然后调用这个方法。

值得注意的是,开发人员需要自行设计servlets以满足对并发请求的处理要求。通常情况下,Web容器通过在不同的线程中并发执行同一个servlet的service方法来实现对并发请求的处理。

SRV.2.1.1    HTTP协议相关的请求处理方法

HttpServlet这个抽象子类在Servlet接口的基础上扩充了几个方法,Servlet处理HTTP请求时service方法会自动调用对应的扩充方法。方法列表如下:

doGet         处理HTTP GET请求。

doPost       处理HTTP POST请求。

doPut         处理HTTP PUT请求。

doDelete    处理HTTP DELETE请求。

doHead      处理HTTP HEAD请求。

doOptions  处理HTTP OPTIONS请求。

doTrace      处理HTTP TRACE请求。

一般情况下,开发人员编写基于HTTP的servlets时只写好doGet和doPost方法就足够了。其他的几个方法只有特别熟悉HTTP协议的人员才有可能用得到。

SRV.2.1.2    附加的方法

doPut和doDelete方法是为支持HTTP/1.1协议准备的。HttpServlet的doHead方法其实就是doGet方法的特殊形式而已——它只返回doGet方法产生的头信息。doOptions方法负责响应HTTP对应的方法。doTrace方法负责生成包含了所有头信息的响应并返回给TRACE请求。

SRV.2.1.3    GET请求的其他可选项

HttpServlet接口定义了getLastModified方法以支持额外的GET操作,用于返回在某个时间点之后有过修改的资源。适当情况下,实现这个方法可能会有助于提升网络资源的响应效率。

SRV.2.2    实例的数量

servlet声明(The servlet declaration)是Web应用中部署描述符的一部分,这些内容会在SRV.13中解释。部署描述符(Deployment Descriptor)控制着servlet容器生成servlet实例的方式。

非分布式环境中,servlet容器能且只能为每一个servlet创造一个实例。不过,针对实现了SingleThreadModel接口的servlet来说,servlet容器是可以实现多个实例来处理大量请求的加载并路由到不同的实例中进行服务。

当servlet作为一个分布式应用系统的一部分组成来部署时,容器可能会为每一个JVM生成一个servlet实例。然而,如果分布式应用系统中的servlet实现了SingleThreadModel接口,容器可能会为每一个JVM生成多个servlet实例。

SRV.2.2.1    关于单线程模式(The Single Thread Model)的提示

SingleThreadModel接口的使用就注定了会保证servlet的一个实例每次只能执行一个线程。记住这一点很重要:这种保证是针对每一个servlet实例的,因此容器可以通过建立servlet实例池来同时执行多个请求。某些对象一次可以共享给多个servlet实例共同访问,例如HttpSession,即使实现了SingleThreadModel,它也可能同时共享给多个servlet。

强烈建议开发人员采取其他措施来解决这些实例数量和并发访问的问题,不要去实现SingleThreadModel接口。例如,避免实例变量的使用,或者对访问这些资源的代码块加上同步锁等。SingleThreadModel接口在2.4版规范中已经被废弃了,所以不要再使用了。

文档信息

最新文章

  1. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
  2. zoom和transform:scale的区别
  3. 操作系统和程序设计语言的API使用的字符编码分析
  4. ST第二次作业,相关程序测试及测试用例
  5. GetRelevantAnimTimeRemainingFraction节点Bug
  6. [leetcode]_K Sum 问题
  7. dos命令弹出对话框---Msg命令详解
  8. MyEclipse第一个Servlet程序 --解决Win7系统下MyEclipse与Tomcat连接问题
  9. oracle迁移mysql数据库注意(转)
  10. 74LS183 加法器 【数字电路】
  11. 封装一个button上带图片的,图片在上,文字在下的按钮
  12. JVM笔记6-垃圾回收概述
  13. Kali Linux远程连接Windows服务器
  14. sqlserver建立远程查询
  15. Firebird Embedded 部署的一个坑
  16. js 时间戳转换为‘yyyy-MM-dd hh:mm’格式(es6语法)
  17. Notepad++的一个用法 转换为unix 格式的文件
  18. 【python】给正则匹配部分命名
  19. 51Nod1317 相似字符串对 容斥原理 动态规划
  20. node.js中的框架

热门文章

  1. BCB:AnsiString和String的区别
  2. OpenCV2:第八章 界面事件
  3. Django-C001-快速入门
  4. shell脚本,按空格开始60秒的倒计时。
  5. ios之键盘的自定义
  6. JavaScript设计模式基础之闭包(终)
  7. 洛谷 P2921 在农场万圣节
  8. GIMP模版的制作
  9. CSS3-transform3D
  10. PAT Basic 1022