借助Java 的跨平台特性,Servlet 被设计成一种独立于平台和协议的服务器端的 Java 应用程序,可以动态生成动态的Web页面。Servlet 由 Web服务器进行加载,该Web 服务器必须包含支持 Servlet 的 Java 虚拟机。Servlet 不是独立的 Java 应用程序, 没有 main 方法,它不是由用户直接调用,而是由容器调用的。
JSP 编译后就是 Servlet,但它并没有增强 Servlet 的功能,只是比直接使用Servlet 进行编程更加方便。Servlet 采用请求响应的工作方式,Servlet 技术作为 Web 服务器功能的增强器,其功能涵盖了从客户端请求响应动态生成文档到保证会话安全、访问后台数据库服务器等。
每个Servlet 都有自己的生命周期,都包含 init 和 destroy 方法,每个Servlet 都需要实现 Servlet 接口,其主要的逻辑将集中在 service 方法中。当一个请求映射到一个 Servlet 时,该容器执行下列步骤:
- 如果一个 Servlet 的实例并不存在,Web 容器将加载 Servlet 类,创建一个Servlet类的实调用init 方法初始化 Servlet 实例。
- 调用 service 方法,传递一个请求和响应对象。
- 如果该容器要移除这个 Servlet,可调用Servlet 的destroy 方法来结束该Servlet。
1. 加载和初始化
在Servlet 的生命周期中,仅执行一次 init 方法,它是在服务器装入 Servlet 时执行的。可以配置服务器,以便在启动服务器或客户机首次访问Servlet 时装入 Servlet。无论有多少客户机访问Servlet ,都不会重复执行init 方法。
2.处理客户端请求
每一个请求由 ServletRequest 类型的对象代表,而 Servlet 使用 ServletResponse 返回该请求。这些对象被作为 service 方法的参数传递给 Servlet ,service 方法是 Servlet 的核心。每当一个客户请求一个ServletRequest 对象时,该对象的service 方法就要被调用。
当一个客户通过html 表单发出一个 HTTP POST 请求时,doPost 方法被调用;当一个客户通过HTML表单发出一个HTTP GET 请求或直接请求一个URL时,doGet方法被调用。与GET请求相关的参数添加到URL 的后面,并与这个请求一起发送。
在HTTP 请求的情况下,容器必须提供代表请求和响应的 HttpServletRequest 和HttpServletResponse 的具体实现。
3.服务结束
destroy 方法和 init 方法一样,仅执行一次,即在服务器停止且卸载Servlet 时执行该方法。当服务器卸载Servlet 时,将所有的 service 方法调用完成后,或指定的时间间隔过后调用destroy方法。一个Servlet 在运行 service 方法时可能会产生其他的线程,因此请确认在调用destroy 方法时,这些线程已终止或完成。一旦 destroy 方法被调用,容器就不会再向该实例发送任何请求;如果容器需要再使用该Servlet ,则必须创建新的实例。
参考《J2EE核心技术与企业应用》