servlet--百度百科

Servlet(Server Applet),全称 Java Servlet, 未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现 的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,通常状况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet能够响应任何类型的请求,但绝大多数状况下Servlet只用来扩展基于HTTP协议的Web服务器。
最先支持Servlet标准的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
外文名
Servlet
类    别
程序
环    境
Java  applet
平    台
Java Web Server

由来

编辑
Servlet 是在 服务器上运行的小程序。这个词是在 Java applet的环境中创造的,Java applet 是一种看成单独文件跟网页一块儿发送的小程序,它一般用于在客户端运行,结果获得为用户进行运算或者根据用户互做用定位图形等服务。
服务器上须要一些程序,经常是根据用户输入访问数据库的程序。这些一般是使用 公共网关接口Common Gateway Interface,CGI)应用程序完成的。然而,在服务器上运行 Java,这种程序可以使用 Java 编程语言实现。在通讯量大的服务器上,JavaServlet 的优势在于它们的执行速度更快于 CGI 程序。各个用户请求被激活成单个程序中的一个线程,而 无需建立单独的进程,这意味着 服务器端处理请求的 系统开销将明显下降。
实现过程
最先支持 Servlet 技术的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
1) 客户端发送请求至服务器端;
2) 服务器将请求信息发送至 Servlet;
3) Servlet 生成响应内容并将其传给 服务器。响应内容动态生成,一般取决于客户端的请求;
4) 服务器将响应返回给客户端。
Servlet 看起来像是一般的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。由于是对象 字节码,可动态地从网络加载,能够说 Servlet 对 Server 就如同 Applet对 Client 同样,可是,因为 Servlet 运行于 Server 中,它们并不须要一个 图形用户界面。从这个角度讲,Servlet 也被称为 FacelessObject。
一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展 服务器的性能,服务器上驻留着能够经过“请求-响应”编程模型来访问的应用程序。虽然 Servlet 能够对任何类型的请求产生响应,但一般只用来扩展 Web 服务器的应用程序。
目前最新版本为 3.1。

命名

编辑
Servlet 的命名能够看出 sun 命名的特色,如 Applet 表示小应用程序;Scriptlet = Script + Applet,表示小脚本程序;一样 Servlet = Service + Applet,表示小服务程序。

生命周期

编辑
  1. 客户端请求该 Servlet;
  2. 加载 Servlet 类到内存;
  3. 实例化并调用init()方法初始化该 Servlet;
  4. service()(根据请求方法不一样调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions());
  5. destroy()。
加载和实例化 Servlet。这项操做通常是动态执行的。然而,Server 一般会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。
Server 建立一个 Servlet的实例
第一个客户端的请求到达 Server
Server 调用 Servlet 的 init() 方法(可配置为 Server 建立 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)
一个客户端的请求到达 Server
Server 建立一个请求对象,处理客户端请求
Server 建立一个响应对象,响应客户端请求
Server 激活 Servlet 的 service() 方法,传递请求和响应对象做为参数
service() 方法得到关于请求对象的信息,处理请求,访问其余资源,得到须要的信息
service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员本身开发的新的方法。
对于更多的客户端请求,Server 建立新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象做为 参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。通常 Servlet 只初始化一次( 只有一个对象),当 Server 再也不须要 Servlet 时(通常当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

工做模式

编辑
客户端发送请求至 服务器
服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回客户端

比较

编辑

与 Applet 的比较

类似之处:
* 它们不是独立的应用程序,没有 main() 方法。
* 它们不是由用户或程序员调用,而是由另一个应用程序(容器)调用。
* 它们都有一个生存周期,包含 init() 和 destroy() 方法。
不一样之处:
* Applet具备很好的图形界面( AWT),与浏览器一块儿,在客户端运行。
* Servlet 则没有图形界面,运行在 服务器端。

与 CGI 比较

与传统的 CGI 和许多其余相似 CGI 的技术相比,Java Servlet 具备更高的效率,更容易使用,功能更强大,具备更好的可移植性,更节省投资。在将来的技术发展过程当中,Servlet 有可能完全取代 CGI。
在传统的 CGI中,每一个请求都要启动一个新的进程,若是 CGI 程序自己的执行时间较短,启动进程所须要的开销极可能反而超过实际执行时间。而在 Servlet 中,每一个请求由一个轻量级的 Java 线程处理(而不是重量级的操做系统进程)。
在传统 CGI 中,若是有 N 个并发的对同一 CGI程序的请求,则该CGI程序的代码在内存中重复装载了 N 次;而对于 Servlet,处理请求的是 N 个线程,只须要一份 Servlet 类代码。在性能优化方面,Servlet 也比 CGI 有着更多的选择。
* 方便
Servlet 提供了大量的实用工具例程,例如自动地解析和解码 HTML 表单数据、读取和设置 HTTP头、处理 Cookie、跟踪会话状态等。
* 功能强大
在Servlet中,许多使用传统 CGI 程序很难完成的任务均可以轻松地完成。例如,Servlet 可以直接和 Web 服务器交互,而普通的 CGI 程序不能。Servlet 还可以在各个程序之间共享数据,使得数据库 链接池之类的功能很容易实现。
* 可移植性好
Servlet 用 Java 编写,Servlet API具备完善的标准。所以,为 IPlanet Enterprise Server 写的 Servlet 无需任何实质上的改动便可移植到 ApacheMicrosoftIIS 或者 WebStar。几乎全部的主流 服务器都直接或经过 插件支持 Servlet。
* 节省投资
不只有许多廉价甚至免费的 Web 服务器可供我的或小规模网站使用,并且对于现有的服务器,若是它不支持 Servlet 的话,要加上这部分功能也每每是免费的(或只须要极少的投资)。

与 JSP 比较

JSP 和 Servlet 的区别到底在应用上有哪些体现,不少人搞不清楚。简单的说,SUN 首先发展出 Servlet,其功能比较强劲,体系设计也很先进,只是,它输出 HTML 语句仍是采用了老的 CGI 方式,是一句一句输出,因此,编写和修改 HTML 很是不方便。
Java Server Pages(JSP)是一种实现普通静态HTML 和动态 HTML 混合编码的技术,JSP 并无增长任何本质上不能用 Servlet 实现的功能。可是,在 JSP 中编写静态HTML 更加方便,没必要再用 println语 句来输出每一行 HTML 代码。更重要的是,借助内容和外观的分离,页面制做中不一样性质的任务能够方便地分开:好比,由页面设计者进行 HTML设计,同时留出供 Servlet 程序员插入动态内容的空间。
后来 SUN 推出了相似于 ASP 的镶嵌型的 JSP,把 JSP TAG 镶嵌到 HTML 语句中,这样,就大大简化和方便了网页的设计和修改。新型的网络语言如 ASP,PHP,JSP 都是镶嵌型的语言。 这是 JSP 和 Servlet 区别的运做原理层面。
从网络三层结构的角度看 JSP 和 Servlet 的区别,一个网络项目最少分三层:data layer(数据层),business layer(业务层),presentation layer(表现层)。固然也能够更复杂。Servlet 用来写 business layer 是很强大的,可是对于写 presentation layer 就很不方便。JSP 则主要是为了方便写 presentation layer 而设计的。固然也能够写 business layer。写惯了 ASPPHP,CGI的朋友,常常会不自觉的把 presentation layer 和 business layer 混在一块儿。
根据 SUN 本身的推荐,JSP中应该仅仅存放与 presentation layer 有关的东西,也就是说,只放输出 HTML 网页的部分。而全部的数据计算,数据分析,数据库联结处理,通通是属于 business layer,应该放在 Java BEANS 中。经过 JSP 调用 Java BEANS,实现两层的整合。
实际上,微软前不久推出的 DNA 技术,简单说,就是 ASP+COM/DCOM 技术。与J SP+BEANS 彻底相似,全部的 presentation layer 由 ASP 完成,全部的 business layer 由 COM/DCOM 完成。经过调用,实现整合。
为何要采用这些组件技术呢?由于单纯的 ASP/JSP 语言是很是低效率执行的,若是出现大量用户点击,纯 SCRIPT 语言很快就到达了他的功能上限,而组件技术就能大幅度提升功能上限,加快执行速度。
另一方面,纯 SCRIPT 语言将 presentation layer 和 business layer 混在一块儿,形成修改不方便,而且代码不能重复利用。若是想修改一个地方,常常会牵涉到十几页 code,采用组件技术就只改组件就能够了。
综上所述,Servlet 是一个早期的不完善的产品,写 business layer 很好,写 presentation layer 就很臭,而且两层混杂。
因此,推出JSP+BEAN,用 JSP 写 presentation layer,用 BEAN 写 business layer。SUN 本身的意思也是未来用 JSP 替代 Servlet。这是技术更新方面 JSP 和 Servlet 的区别。
但是,这不是说,学了 Servlet 没用,实际上,你仍是应该从 Servlet 入门,再上 JSP,再上 JSP+BEAN。
强调的是:学了JSP,不会用 Java BEAN 并进行整合,等于没学。你们多花点力气在 JSP+BEAN 上。
咱们能够看到,当 ASP+COM 和 JSP+BEAN 都采用组件技术后,全部的组件都是先进行编译,并驻留内存,而后快速执行。因此,你们常常吹的 Servlet/JSP 先编译驻内存后执行的速度优点就没有了。
反之,ASP+COM+IIS+NT 紧密整合,应该会有较大的速度优点呈现。并且,ASP+COM+IIS+NT 开发效率很是高,虽然bug 不少。
那么,为何还用 JSP+BEAN?由于 Java 实在前途远大。微软分拆后,操做系统将群雄并起,应用软件的开发商一定要找一个通用开发语言进行开发,Java 一统天下的时机就到了。若是微软分拆顺利,从中分出的应用软件公司将成为 Java 的新领导者。目前的 Java 大头 SUN 和 IBM 都死气沉沉,使人失望。但愿新公司能注入新活力。不过,新公司颇有可能和旧 SUN 展开 Java 标准大战,双方各自制定标准,影响 Java 跨平台。
简单分析了一下 JSP 和 Servlet 的区别和 Java Web 开发方面的发展。随着机器速度愈来愈快,Java 的速度劣势很快就能够被克服。

新增功能

编辑

Servlet 2.2

:引入了 self-contained Web applications 的概念。

servlet 2.3

: 2000年10月份出来
Servlet API 2.3中最重大的改变是增长了 filters
Servlet 2.3 增长了 filters 和 filter chains 的功能。引入了 context 和 session listeners 的概念,当 context 或 session 被初始化或者被将要被释放的时候,和当向 context 或 session 中绑定属性或解除绑定的时候,能够对类进行监测。

servlet 2.4

: 2003年11月份出来
Servlet 2.4 加入了几个引发关注的特性,没有特别突出的新内容,而是花费了更多的功夫在推敲和阐明之前存在的一些特性上,对一些不严谨的地方进行了校验。
Servlet 2.4 增长了新的最低需求,新的监测 request 的方法,新的处理 response 的方法,新的国际化支持,RequestDispatcher 的几个处理,新的 request listener 类,session 的描述,和一个新的基于 Schema 的并拥有 J2EE 元素的发布描述符。这份文档规范全面而严格的进行了修订,除去了一些可能会影响到跨平台发布的模糊不清的因素。总而言之,这份规范增长了四个新类,七个新 方法,一个新常量,再也不推荐使用一个类。
注意:改成 Schema 后主要增强了两项功能:
(1) 元素不依照顺序设定;
(2) 更强大的验证机制。
主要体如今:
a.检查元素的值是否为合法的值
b.检查元素的值是否为合法的文字字符或者数字字符
c.检查 Servlet, Filter, EJB-ref 等等元素的名称是否惟一
2.新增 Filter 四种设定:REQUEST、FORWARD、INCLUDE 和 ERROR。
3.新增 Request Listener、Event和Request Attribute Listener、Event。
4.取消 SingleThreadModel 接口。当 Servlet 实现 SingleThreadModel 接口时,它能确保同时间内,只能有一个 thread 执行此 Servlet。
5.<welcome-file-list>能够为Servlet。
6.ServletRequest接口新增一些方法。
public String getLocalName();
public String getLocalAddr();
public int getLocalPort();
public int getRemotePort()

Servlet 2.5

2005 年 9 月发布 Servlet 2.5
Servlet 2.5 一些变化的介绍:
1) 基于最新的 J2SE 5.0 开发的。
2) 支持 annotations 。
3) web.xml 中的几处配置更加方便。
4) 去除了少数的限制。
5) 优化了一些实例
Servlet 的各个版本对监听器的变化有:
(1) Servlet 2.2 和 jsp1.1
新增Listener:HttpSessionBindingListener
新增Event: HttpSessionBindingEvent
(2) Servlet 2.3 和 jsp1.2
新增Listener:ServletContextListener,ServletContextAttributeListener
,HttpSessionListener,HttpSessionActivationListener,HttpSessionAttributeListener
新增Event: ServletContextEvent,ServletContextAttributeEvent,HttpSessionEvent
(3) Servlet 2.4 和 jsp2.0
新增Listener:ServletRequestListener,ServletRequestAttribureListener
新增Event: ServletRequestEvent,ServletRequestAttributeEvent

Servlet 3.0

Servlet 3.0 做为 Java EE 6 规范体系中一员 [1]   ,随着 Java EE 6 规范一块儿发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到很是兴奋,同时也得到了 Java 社区的一片赞誉之声: [2]  
  1. 异 步处理支持:有了该特性,Servlet 线程再也不须要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求以后,Servlet 线程能够将耗时的操做委派给另外一个线程来完成,本身在不生成响应的状况下返回至容器。针对业务处理较耗时的状况,这将大大减小服务器资源的占用,而且提升 并发处理速度。 [2]  
  2. 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始再也不是必选的了。 [2]  
  3. 可 插性支持:熟悉 Struts2 的开发者必定会对其经过插件的方式与包括 Spring 在内的各类经常使用框架的整合特性记忆犹新。将相应的插件封装成 JAR 包并放在类路径下,Struts2 运行时便能自动加载这些插件。如今 Servlet 3.0 提供了相似的特性,开发者能够经过插件的方式很方便的扩充已有 Web 应用的功能,而不须要修改原有的应用。 [2]  

Servlet 4.0草案

从3.1到4.0将是对Servlet 协议的一次大改动,而改动的关键之处在于对HTTP/2的支持。HTTP2将是是继上世纪末HTTP1.1协议规范化以来首个HTTP协议新版本,相对于 HTTP1.1,HTTP2将带来许多的加强。在草案提议中,Shing Wai列举出了一些HTTP2的新特性,而这些特性也正是他但愿在Servlet 4.0 API中实现并暴露给用户的新功能,这些新特性以下: [3]  
1.请求/响应复用(Request/Response multiplexing)
  2.流的优先级(Stream Prioritization)
  3.服务器推送(Server Push)
  4.HTTP1.1升级(Upgrade from HTTP 1.1) [3]  

规范

编辑
1.简化开发
2.便于部署
3.支持 Web2.0 原则
为了简化开发流程,Servlet 3.0 引入了注解(annotation),这使得 web 部署描述符 web.xml 再也不是必须的选择。
Pluggability 可插入性
当使用任何第三方的框架,如 Struts,JSF 或 Spring,咱们都须要在 web.xml 中添加对应的 Servlet 的入口。这使得 web 描述符笨重而难以维护。Servlet3.0 的新的可插入特性使得 web 应用程序模块化而易于维护。经过 web fragment 实现的可插入性减轻了开发人员的负担,不须要再在 web.xml 中配置不少的 Servlet 入口。
Asynchronous Processing 异步处理
另一个显著的改变就是 Servlet 3.0 支持异步处理,这对 AJAX 应用程序很是有用。当一个 Servlet 建立一个线程来处理某些请求的时候,如查询数据库或消息链接,这个线程要等待直到得到所须要的资源才可以执行其余的操做。异步处理经过运行线程执行其余的 操做来避免了这种阻塞。
Apart from the features mentioned here, several other enhancements have been made to the existing API. The sections towards the end of the article will explore these features one by one in detail.
除了这些新特性以外, Servlet 3.0对已有的 API 也作了一些改进,在本文的最后咱们会作介绍。
Annotations in Servlet Servlet 中使用注解
Servlet 3.0 的一个主要的改变就是支持注解。使用注解来定义 Servlet 和 filter 使得咱们不用在 web.xml 中定义相应的入口。
@WebServlet
@WebServlet 用来定义 web 应用程序中的一个 Servlet。这个注解能够应用于继承了 HttpServlet。这个注解有多个属性,例如 name,urlPattern, initParams,咱们可使用者的属性来定义 Servlet 的行为。urlPattern 属性是必须指定的。

编程接口

编辑
HTTPServlet 使用一个 HTML 表单来发送和接收数据。要建立一个 HTTPServlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表单的 GenericServlet 的一个子类。 HTML 表单是由 <form> 和 </form> 标记定义的。表单中典型地包含输入字段(如文本输入字段、 复选框单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定 服务器应执行哪个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是 继承的。
(1) init() 方法
在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 能够 配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 不管有多少客户机访问 Servlet,都不会重复执行 init() 。
缺省的 init() 方法一般是符合要求的,但也能够用定制 init() 方法来覆盖它,典型的是管理 服务器端 资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另外一个示例是初始化数据库链接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 所以全部覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法以前,应确保已完成了 init() 方法。
(2) service() 方法
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,并且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象做为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 若是 HTTP 请求方法为 GET,则缺省状况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。由于 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,没必要要覆盖 service() 方法。只需覆盖相应的 do 方法就能够了。
Servlet 的响应能够是下列几种类型:
一个输出流,浏览器根据它的内容类型(如 text/html)进行解释。
一个 HTTP 错误响应,重定向到另外一个 URL、servlet、JSP。
(3) doGet() 方法
当一个客户经过 HTML 表单发出一个 HTTP GET 请求或直接请求一个 URL 时,doGet() 方法被调用。与 GET 请求相关的参数添加到 URL 的后面,并与这个请求一块儿发送。当不会修改 服务器端的数据时,应该使用 doGet() 方法。
(4) doPost() 方法
当一个客户经过 HTML 表单发出一个 HTTP POST 请求时,doPost() 方法被调用。与 POST 请求相关的参数做为一个单独的 HTTP 请求从浏览器发送到服务器。当须要修改服务器端的数据时,应该使用 doPost() 方法。
(5) destroy() 方法
destroy() 方法仅执行一次,即在服务器中止且卸装 Servlet 时执行该方法。典型的,将 Servlet 做为服务器进程的一部分来关闭。缺省的 destroy() 方法一般是符合要求的,但也能够覆盖它,典型的是管理服务器端资源。例如,若是 Servlet 在运行时会累计统计数据,则能够编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另外一个示例是关闭数据库链接。
服务器卸 装 Servlet 时,将在全部 service() 方法调用完成后,或在指定的时间间隔事后调用 destroy() 方法。一个 Servlet 在运行 service() 方法时可能会产生其它的线程,所以请确认在调用 destroy() 方法时,这些线程已终止或完成。
(6) getServletConfig() 方法
getServletConfig() 方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和 ServletContext。ServletContext 接口提供有关 servlet 的环境信息。
(7) getServletInfo() 方法
getServletInfo() 方法是一个可选的方法,它提供有关 servlet 的信息,如做者、版本、版权。
服务器调用 sevlet 的 service()、doGet() 和 doPost() 这三个方法时,均须要 “请求”和“响应”对象做为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个将响应信息返回给浏览器的一个通讯途径。
javax.servlet 软件包中的相关类为 ServletResponse 和 ServletRequest,而 javax.servlet. http 软件包中的相关类为 HttpServletRequest 和 HttpServletResponse。Servlet 经过这些对象与 服务器通讯并最终与客户端通讯。Servlet 能经过调用"请求"对象的方法获知客户端环境,服务器环境的信息和全部由客户机提供的信息。Servlet 能够调用“响应”对象的方法发送响应,该响应是准备发回客户端的。

常见容器

编辑
Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss 等等。(提供了 Servlet 功能的服务器,叫作 Servlet 容器。对 web 程序来讲,Servlet 容器的做用就至关于桌面程序里操做系统的做用,都是提供一些编程基础设施)

建议

编辑
在 Web 应用程序中,一个 Servlet 在一个时刻可能被多个用户同时访问。这时 Web 容器将为每一个用户建立一个线程来执行 Servlet。若是 Servlet 不涉及共享资源的问题,没必要关心多线程问题。但若是 Servlet 须要共享资源,须要保证 Servlet 是 线程安全的。
下面是编写线程安全的 Servlet 的一些建议:
(1)用方法的局部变量保存请求中的专有数据。对方法中定义的局部变量,进入方法的每一个线程都有本身的一份方法变量拷贝。任何线程都不会修改其余线程的局部变量。若是要在不一样的请求之间共享数据,应该使用会话来共享这类数据。
(2)只用 Servlet的成员变量来存放那些不会改变的数据。有些数据在 Servlet 生命周期中不发生任何变化,一般是在初始时肯定的,这些数据可使用成员变量保存,如数据库链接名称、其余资源的路径等。
(3)对可能被请求修改的成员变量同步。有时数据成员变量或者环境属性可能被请求修改。当访问这些数据时应该对它们同步,以免多个线程同时修改这些数据。
(4)若是 Servlet 访问外部资源,那么须要同步访问这些资源。例如,假设 Servlet 要从文件中读写数据。当一个线程读写一个文件时,其余线程也可能正在读写这个文件。文件访问自己不是线程安全的,因此必须编写同步访问这些资源的代码。在 编写线程安全的 Servlet 时,下面两种方法是不该该使用的:
(1)在 Servlet API 中提供了一个 SingleThreadModel 接口,实现这个接口的 Servlet 在被多个客户请求时一个时刻只有一个线程运行。这个接口已被标记不推荐使用。
(2)对 doGet() 或doPost() 方法同步。若是必须在 Servlet 中使用同步代码,应尽可能在最小的代码块范围上进行同步。同步代码越小,Servlet 执行得才越好。 [4]  
相关文章
相关标签/搜索