Servlet概述

    |     2015年5月6日   |   Servlet与Jsp   |     0 条评论   |    1635

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 流程

webserver1

一句话总结:Servlet 是容器里的普通 Java 对象:init 一次、请求进线程调 service、卸装时 destroy。

转载请注明来源:Servlet概述
本文链接地址:https://ai.zhousir.top/?p=622
回复 取消