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版规范中已经被废弃了,所以不要再使用了。

文档信息

Servlet 2.4 规范之第二篇:Servlet接口的更多相关文章

  1. Servlet 2.4 规范之第一篇:概览

          写在前面的话: 本系列是对<Java Servlet Specification Version 2.4>的完全翻译,力争但不保证完美表达出英文原文的思想内涵.如有疏漏之处,还 ...

  2. Servlet和JSP规范及版本对应关系

    JSR 53: JavaTM Servlet 2.3 and JavaServer PagesTM 1.2 JSR 154: JavaTM Servlet 2.4 JSR 154: JavaTM Se ...

  3. Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】

    Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...

  4. Servlet第二篇(介绍、ServletConfig;ServletContext)

    什么是Serlvet? Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们编写java程序想要在网上实现 ...

  5. servlet类第二篇

    1servlet的生命周期是什么? 服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始 ...

  6. Servlet 2.4 规范之第三篇:Servlet生命周期

        SRV.2.3    Servlet生命周期 servlet有着定义良好且明确的生命周期,它定义了servlet以怎样的方式加载和实例化.初始化.怎样处理客户端请求.以及怎样停止服务.生命周期 ...

  7. Servlet 2.3 规范

    Servlet2.3规范 第一章: servlet2.3规范用到了一下的一些规范:J2EE.JSP1.1.JNDI 在14章中讲述了规范中的所有的classes类或接口(改文中不讲述).对开发者而言以 ...

  8. EL&Filter&Listener:EL表达式和JSTL,Servlet规范中的过滤器,Servlet规范中的监听器,观察着设计模式,监听器的使用,综合案例学生管理系统

    EL&Filter&Listener-授课 1 EL表达式和JSTL 1.1 EL表达式 1.1.1 EL表达式介绍 *** EL(Expression Language):表达式语言 ...

  9. JBoss和Tomcat版本、及Servlet、JSP规范版本对应一览 【转】

    原文地址:http://blog.csdn.net/hills/article/details/40896357 JBoss和Tomcat版本.及Servlet.JSP规范版本对应一览 JBossAS ...

随机推荐

  1. 朴素贝叶斯分类<转载>

    转自http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html 0.写在前面的话 我个人一直很喜欢 ...

  2. 验证IP端与数据库Ip端是否重复!!!

    select COUNT(id) from house_info_config hic where (hic.ip_start <![CDATA[<=]]> #{ipend} AND ...

  3. 6.python

    最早的'密码本' ascii 涵盖了英文字母大小写,特殊字符,数字.01010101ascii 只能表示256种可能,太少,创办了万国码 unicode 16表示一个字符不行,32位表示一个字符. A ...

  4. vc生产垃圾清理

    @echo off echo 清除所有obj pch idb pdb ncb opt plg res sbr ilk suo文件,请稍等...... pause del /f /s /q .\*.ob ...

  5. PAT (Advanced Level) Practise - 1097. Deduplication on a Linked List (25)

    http://www.patest.cn/contests/pat-a-practise/1097 Given a singly linked list L with integer keys, yo ...

  6. ios之UIImageView

    UIImageView,顾名思义,是用来放置图片的.使用Interface Builder设计界面时,当然可以直接将控件拖进去并设置相关属性,这就不说了,这里讲的是用代码. 1.创建一个UIImage ...

  7. JS与IOS、安卓的交互

    最近做的项目中涉及到了与安卓和ios的交互问题,对于一个新手来说,多多少少会有点迷糊.在调用安卓和ios的callback回调时,很轻松的就调用成功了,而且,步骤也不那么繁琐.刚开始,只知道那样使用可 ...

  8. Python面向对象(约束,异常处理,md5加密)(五)

    1. 类的约束 1. 写一个父类. 父类中的某个方法要抛出一个异常 NotImplementedError class Base: def login(self): raise NotImplemen ...

  9. 图论:POJ2186-Popular Cows (求强连通分量)

    Popular Cows Description Every cow's dream is to become the most popular cow in the herd. In a herd ...

  10. PHP-redis命令之 字符串 (strings)

    一.string (字符串) 1.set:设置键 $reids->set('mykey',111); 2.get:获取键 $redis->get('mykey'); 3.del:删除键 $ ...