Life of a JSP file
**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 API 历史| Servlet API 版本 | 发布日期 | 平台 | 重要变化 |
| --- | --- | --- | --- |
| Servlet 5.0 | 2020年6月12日 （页面存档备份，存于） | Jakarta EE 9 | 移到包名到"`jakarta.servlet`" |
| Servlet 4.0.3 | 2019年3月13日 （页面存档备份，存于） | Jakarta EE 8 | 去除"Java"商标 |
| Servlet 4.0 | 2017年9月 （页面存档备份，存于） | Java EE 8 | HTTP/2 |
| Servlet 3.1 | 2013年5月 （页面存档备份，存于） | Java EE 7 | Non-blocking I/O, HTTP protocol upgrade mechanism (WebSocket) |
| Servlet 3.0 | 2009年12月 | Java EE 6, Java SE 6 | Pluggability, Ease of development, Async Servlet, Security, File Uploading |
| Servlet 2.5 | 2005年9月 | Java EE 5, Java SE 5 | Requires Java SE 5, supports annotation |
| Servlet 2.4 | 2003年11月 | J2EE 1.4, J2SE 1.3 | web.xml uses XML Schema |
| Servlet 2.3 | 2001年8月 | J2EE 1.3, J2SE 1.2 | Addition of `Filter` |
| Servlet 2.2 | 1999年8月 | J2EE 1.2, J2SE 1.2 | Becomes part of J2EE, introduced independent web applications in .war files |
| Servlet 2.1 | 1998年11月 | Unspecified | First official specification, added `RequestDispatcher`, `ServletContext` |
| Servlet 2.0 |  | JDK 1.1 | Part of Java Servlet Development Kit 2.0 |
| Servlet 1.0 | 1997年6月 |  |  |

工作模式
----

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

通用Servlet
---------

一般來說，通用Servlet由javax.servlet.GenericServlet實作Servlet介面。程序设计人员可以通过使用或继承这个类来实现通用Servlet应用。

### HttpServlet

javax.servlet.http.HttpServlet实现了专门用于响应HTTP请求的Servlet，提供了响应对应HTTP标准请求的doGet()、doPost()等方法。

生命周期
----

当servlet被部署在应用服务器中（应用服务器中用于管理Java组件的部分被抽象成为容器）以后，由容器控制servlet的生命周期。除非特殊指定，否则在容器启动的时候，servlet是不会被加载的，servlet只会在第一次请求的时候被加载和实例化。servlet一旦被加载，一般不会从容器中删除，直至应用服务器关闭或重新启动。但当容器做記憶體回收动作时，servlet有可能被删除。也正是因为这个原因，第一次访问servlet所用的时间要大大多于以后访问所用的时间。

servlet在服务器的运行生命周期为，在第一次请求（或其实体被内存垃圾回收后再被访问）时被加载并执行一次初始化方法，跟着执行正式运行方法，之后会被常驻并每次被请求时直接执行正式运行方法，直到服务器关闭或被清理时执行一次销毁方法后实体销毁。

与JSP的关系
-------

Java服务器页面（JSP）是HttpServlet的扩展。由于HttpServlet大多是用来响应HTTP请求，并返回Web页面（例如HTML、XML），所以不可避免地，在编写servlet时会涉及大量的HTML内容，这给servlet的书写效率和可读性带来很大障碍，JSP便是在这个基础上产生的。其功能是使用HTML的书写格式，在适当的地方加入Java代码片段，将程序员从复杂的HTML中解放出来，更专注于servlet本身的内容。

JSP在首次被访问的时候被应用服务器转换为servlet，在以后的运行中，容器直接调用这个servlet，而不再访问JSP页面。JSP的实质仍然是servlet。

参见
--

* Java、JSP、J2EE
* Struts
* HTTP

参考文献
----

1. ↑ .  [2016-09-07]. （原始内容存档于2017-01-17）.

外部链接
----

* JSR 369 （页面存档备份，存于） - Java servlet 4.0 documentation
* JSR 340 （页面存档备份，存于） - Java servlet 3.1 documentation
* JSR 315 （页面存档备份，存于） - Java servlet 3.0 documentation
* JSR 154 （页面存档备份，存于） - Java servlet 2.4 documentation
* JSR 53 （页面存档备份，存于） - Java servlet 2.3 documentation


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
Java |
| --- |
|  |
| Java平臺 | 
* Java
	+ Java版本歷史
	+ Java 5.0
* JVM
	+ Java字节码
* Java ME
* Java SE
* Java EE
* Java Card
* Android SDK

 |  |
|  |
| Oracle技术 | 
* Squawk（英语：）
* JDK
* OpenJDK
* Java虚拟机
* JavaFX
* Maxine VM（英语：）

 |
|  |
| 平台技术 | 
* Java集合框架
* Servlets
* MIDlet（英语：）
* JSP
* Web Start (JNLP)（英语：）
* applet

 |
|  |
| 主要的第三方技术 | 
* Blackdown（英语：）
* Eclipse
* GNU Classpath
* GWT
* Harmony
* Hibernate
* IcedTea（英语：）
* Jazelle（英语：）
* Spring
* Struts
* TopLink
* WildFly

 |
|  |
| 历史 | 
* Java版本歷史
* JCP
* 昇陽電腦
* 自由的Java实现

 |
|  |
| 主要JVM语言（英语：） | 
* BeanShell（英语：）
* Clojure
* Groovy
* Oxygene（英语：）
* JRuby
* Jython
* Kotlin
* Processing
* Rhino
* Scala
* Tcl/Java（英语：）

 |
|  |
| 会议（英语：） | 
* JavaOne
* Devoxx（英语：）

 |

 |