Servlet 基础
在动态网站技术发展初期,为替代笨拙的 CGI 技术,Sun公司在制定 Java EE 规范时引入 Servlet,实现了基础 Java 语言的动态 Web 技术,奠定了 JavaEE 的基础,使动态 Web 开发技术达到了一个新的境界。如今,Servlet 在普遍使用的 MVC 模式的 Web 开发中仍占据了重要地位,目前流行的 Web 框架基本上都基于 Servlet 技术。
Servlet 简介
Servlet 是基于 Java 语言的 Web 服务器端编程技术,是Sun公司提供的一种动态网页的解决方案。按照 Java EE 规范定义,Servlet 是运行在 Servlet 容器的 Java 类,它能处理 Web 客户的 HTTP 请求,并产生 HTTP 响应。例如:当浏览器发送一个请求到服务器后,服务器会把请求交给一个特定的Servlet,该Servlet对请求进行处理后会构造一个合适的响应返回给客户。
Servlet 对请求的处理和响应过程可以进一步分为如下几个步骤:
1、接收HTTP请求。
2、取得请求信息,包括请求头和请求参数数据。
3、调用其他Java类方法,完成具体的业务功能。
4、实现到其他Web组件的跳转(包括重定向或请求转发)
5、生成HTTP响应。
Servlet 体系结构
Servlet是使用Servlet API 及相关类和方法的Java程序。Servlet API 包含两个软件包。
- javax.servlet 包:包含支持所有协议的通用的Web组件接口和类,主要有 javax.servlet.Servlet 接口、javax.servlet.GenericServlet 类、javax.servlet.ServletRequest接口、javax.servlet.ServletResponse 接口。
- javax.servlet.http包:包含支持HTTP协议的接口和类,主要有javax.servlet.http.HttpServlet 类、javax.servlet.http.HttpServletRequest 接口、javax.servlet.http.HttpServletResponse 接口
在Web开发中最常用的是 HttpServlet
类,它扩展了 GenericServlet
类并对 Servlet 接口提供了与 HTTP相关的实现,是在Web开发中定义Servlet最常用使用的类。
HttpServlet类中的主要方法及其描述
方法 | 方法描述 |
---|---|
service(HttpServletRequest req,HttpServletResponse resp) | HttpServlet在实现Srvlet接口时,重写了service方法,该方法会自动判断用户的请求方式,若为Get请求则调用HttpServlet的doGet() 方法,若为POST请求,则调用doPost方法。 |
doGet(HttpServletRequest req,HttpServletResponse resp) | 此方法被本类service方法调用,用来处理一个 http get请求 |
doPost(HttpServletRequest req,HttpServletResponse resp) | 此方法被本类service方法调用,用来处理一个 http post请求 |
HttpServlet 作为 HTTP请求的分发器,除了提供对GET和POST请求的处理方法 doGet() 和 doPost() 外,对于其他请求类型,如 HEAD、OPTIONS、DELETE、PUT、TRACE也提供了相应的处理方法。doHead()、doOptions() ...
HttpServlet 指能够处理 HTTP 请求的 Servlet,它在原有Servlet 接口上添加了对HTTP协议的处理,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
Servlet 生命周期
Servlet 程序本身并不直接在 java 虚拟机上运行,而是由Servlet容器负责管理其整个生命周期。Servlet生命周期是指Servlet实例从创建到响应客户请求,直至销毁的过程。在Servlet生命周期中,会经过创建、初始化、服务可用、服务不可用、处理请求、终止服务和销毁7种状态。
Servlet的生命周期按照7种状态间转换,可分为一下4个阶段。
1、加载和实例化
Servlet 的创建是指加载和实例化两个过程。Servlet容器在如下时刻加载和实例化一个Servlet:
(1)在服务器运行中,客户端首次向Servlet发出请求
(2)重新装入Servlet时
(3)在为Servlet配置了自动装入选项时,服务器在启动时会自动装入次Servlet
2、初始化
Servlet实例化后,Servlet容器将调用Servlet的 init方法来对Servlet实例进行初始化。在这一过程中,可以读取一些固定的数据、初始化JDBC的连接以及建立与其他资源的连接等操作。init方法的参数ServletConfig对象由Servlet容器创建并传递给Servlet,并在初始化后一直在内存中存在,直到Servlet被销毁。
如果初始化没有问题,Servlet 在Web容器中会处于服务可用状态。如果初始化失败,Servlet容器会从运行环境中清除掉该实例。当Servlet运行出现异常时,Servlet容器会使该实例变为服务不可用状态。
3、处理请求
服务器接收到客户端请求,会为该请求创建一个请求对象和一个响应对象并调用 service() 方法,service()方法再调用其他方法来处理请求。在Servlet 生命周期中,service()方法可能被多次调用。当多个客户端同时访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。但同时也要注意对同一对象的并发访问问题。
4、销毁
当Srvlet容器需要终止Servlet,它会先调用Servlet的destroy方法使其释放正在使用的资源。在Servlet容器调用destroy方法之前,必须让当前正在执行service()方法的任何线程完成执行,或者超过了服务器定义的时间限制。在destroy方法完成之后,Servlet容器必须释放Servlet实例以便于被垃圾回收。