1、什么是servlet?
servlet 是部署运行在服务器端的java程序, 用来处理客户端请求,与数据库交互生成响应内容并返回给客户端的中间层,可生成web动态页面。
优点:
(1)Servlet在Web服务器的地址空间内执行,不会创建单独的进程来处理每一个请求。
(2)Servlet独立于平台
(3)服务器上的java安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,servlet是可信的。
(4)Java类库的全部功能对servlet都是可用的,它可以通过sockets和RMI机智与applets、数据库或其它软件进行交互。
2、Servlet架构
Servlet在Web用用程序中的位置:
3、Servlet任务
Servlet主要执行以下任务:
(1)读取客户端(Browser)发送的显式的数据,这包括网页上的HTML表单,或者也可以是来自applet或自定义的http客户端程序的表单。
(2)读取客户端隐式的HTTP请求数据,这包括cookies、媒体类型和浏览器能理解的压缩格式等等。
(3)处理数据并生成结果,这个过程可能需要访问数据库,执行RMI或CORBA调用,调用web服务,或者直接计算得出对应的响应。
(4)发送显式的数据(即文档)到客户端(Browser),该文档的格式可以试多种多样的,包括文本文件(HTML或XML)、二进制文件(GIF图像)、Excel等。
(5)发送隐式的HTTP响应到客户端(Browser),这包括高速浏览器或其它客户端被返回的文档类型(例如HTML),设置cookies和缓存参数,以及其它类似的任务。
4、Servlet包
Java Servlet是运行在带有支持Java Servlet规范的解释器的web服务器上的Java类,
Servlet可以使用javax.servlet和javax.servlet.http包创建它是Java企业版的标准组成,Java企业版是支持大型开发项目的Java类库的扩展版本。
这些类实现Java Servlet和JSP规范。
Javax.servlet.*: 存放于HTTP协议无关的一般性Servlet类。
Javax.servlet.http.*:除了继承javax.servlet.*之外,并且还增加与HTTP协议有关的功能。
注:若Servlet程序和HTTP协议无关,那么必须继承javax.servlet.GenericServlet类
若Servlet程序和HTTP协议有关,那么必须继承javax.servlet.http.HttpServlet类
Genericservlet:提供了servlet接口的基本实现,它的子类都必须实现service()方法。
HttpServlet : 创建servlet,它扩展了Genericservlet,并且提供了servlet接口中具体与HTTP的实现。
5、Servlet生命周期
servlet生命周期是指创建Servlet实例后,存在的时间以及何时销毁的整个过程。
(1) init()方法初始化Servlet
(2)service()方法处理客户端请求
(3)destroy()方法终止/结束Servlet
(4)Servlet由JVM的垃圾回收器进行销毁
init()方法
当用户调用一个Servlet时,init方法被调用,且只调用一次,负责创建或加载一些数据,用于Servlet的整个生命周期。
public void init() throws ServletException { // 初始化代码... }
service()方法
负责执行实际任务的主要方法,Servlet容器(即Web服务器)调用service()方法来处理来自客户端的请求,并把格式化的响应写回客户端。每次服务器接收到一个Servlet请求时,会产生一个新的线程并调用服务,service()方法检查HTTP请求类型(Get、Post、Put、Delete等),最终调用响应的方法。
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ }
doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
destroy() 方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:
public void destroy() { // 终止化代码... }
6、架构图
下图显示了一个典型的 Servlet 生命周期方案。
- 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
- Servlet 容器在调用 service() 方法之前加载 Servlet。
- 然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。