Servlet概述
Servlet 是一种独立于平台和协议的服务器端 Java 应用程序,用来生成动态 Web 页面。它不从命令行启动,而是由 Web 服务器加载;这台服务器必须包含支持 Servlet 的 Java 虚拟机。
和 Applet 一样,Servlet 没有 main(),生命周期由容器调用;和 JSP 相比,JSP 只是把静态 HTML 写起来更方便,本质能力并没有超出 Servlet。
写 HTTP Servlet 时,通常扩展 HttpServlet,覆盖 doGet() / doPost(),并在 init() / destroy() 里管理一次性资源。
一、概述
Servlet 位于 Web 服务器内部。容器负责装入、初始化、把请求派到对应方法,并在卸载时做清理。先把它和普通 Java 程序、Applet、JSP 放在一张表里对照。
| 对比项 | 普通 Java 程序 | Applet | Servlet |
|---|---|---|---|
| 入口 | 有 main() | 无 main(),由浏览器/容器调用 | 无 main(),由 Servlet 容器调用 |
| 运行位置 | 本机独立进程 | 客户端,随浏览器 | 服务器端 |
| 图形界面 | 可选 | AWT/图形界面 | 没有图形界面 |
| 生命周期 | 自己管 | init() / destroy() | init() / service() / destroy() |
和 JSP 的关系
JSP(JavaServer Pages)把静态 HTML 和动态内容混在一个页面里写。它并没有增加任何本质上不能用 Servlet 实现的功能,只是不必再用 println 输出每一行 HTML。内容和外观可以分开:页面设计者写 HTML,程序员在预留位置插入动态结果。
二、HTTP Servlet 编程接口
要创建 HTTP Servlet,请扩展 javax.servlet.http.HttpServlet。这个类提供 init()、destroy()、service() 等方法。HTML 表单提交时,会指定服务器应执行哪一个 Servlet。
1. init()
在 Servlet 的生命期中,只执行一次。可以配置成服务器启动时装入,或客户第一次访问时装入。无论有多少客户访问,都不会重复执行。
缺省的 init() 通常够用。覆盖它时,典型用途是管理服务器端资源:一次性装入 GIF 图片、初始化数据库连接。覆盖带 ServletConfig 参数的版本时,应调用 super.init(config),否则初始化参数和配置会丢。service() 被调用之前,必须保证 init() 已经完成。
2. service()
service() 是 Servlet 的核心。每次客户请求一个 HttpServlet 对象,就会调用它,并传入请求对象和响应对象。HttpServlet 里已有实现:缺省会按 HTTP 方法分发到 doGet()、doPost() 等。一般不必覆盖 service(),覆盖对应的 do 方法即可。
-
POST:表单提交、会修改服务器端数据时用 doPost(),参数在请求体里。 -
GET:直接访问 URL、只读查询时用 doGet(),参数跟在 URL 后面。 -
响应可以是输出流(浏览器按 content-type 解释)、HTTP 错误,或重定向到另一个 URL / Servlet / JSP。
3. destroy()
只执行一次:服务器停止并卸装 Servlet 时调用。可用来保存统计数据、关闭数据库连接。容器会等到所有 service() 完成,或超过指定时间间隔后再调用。如果 service 里还派生了别的线程,调用 destroy 前要确认它们已经结束。
4. getServletConfig() / getServletInfo()
getServletConfig() 返回 ServletConfig,用来读取初始化参数和 ServletContext。getServletInfo() 可选,用来返回作者、版本、版权等信息。
容器调用 service()、doGet()、doPost() 时,都会传入请求和响应对象。通用包是 ServletRequest / ServletResponse,HTTP 包是 HttpServletRequest / HttpServletResponse。Servlet 通过它们了解客户端和环境,并把结果写回浏览器。
三、Servlet 主要任务
-
读取客户端显式数据:HTML 表单字段。 -
读取隐式 HTTP 请求数据:Cookie、媒体类型、浏览器能理解的压缩格式等。 -
处理数据并生成结果:访问数据库、调用 Web 服务,或直接计算。 -
发送显式文档:HTML / XML、二进制图片、Excel 等。 -
发送隐式 HTTP 响应:Content-Type、Cookie、缓存参数等。
四、正确认识 Servlet
1. Servlet 不可以独立运行
必须运行在 Servlet 容器中,由容器执行生命周期方法,因此不需要 main()。
2. Servlet 不是线程
它是实现了 Servlet 接口的普通 Java 对象,并不继承 Thread。服务器收到请求时,会在一个单独的线程里执行 Servlet 的方法;同一个实例可能被多个线程同时调用,共享字段时要自己处理并发。
五、Web 服务器和 Servlet 容器
1. Web 服务器
Web Server 是互联网上部署了系统软件和共享资源的机器。客户端通过 HTTP 访问这些资源。
2. Servlet 容器
Servlet Container 是 Web 服务器或应用服务器的组成部分:为 Servlet 提供请求/响应服务,管理生命周期,还可以提供资源、安全、线程等服务。它可以集成进服务器,也可以作为独立程序嵌入。
3. Servlet 流程
一句话总结:Servlet 是容器里的普通 Java 对象:init 一次、请求进线程调 service、卸装时 destroy。
转载请注明来源:Servlet概述









