“【1+X】Java Web 应用开发”实验报告

生命周期和Servlet API

生命周期和Servlet API 一.Servlet 生命周期 Servlet 是运行在服务器端的一段程序,所以 Servlet 的生命周期会受 Servlet 容器的控制。Servlet 生命周期包括加载、初始化、服务、销毁、卸载 5 个部分 通常情况下,加载和卸载阶段可以由 Servlet 容器来处理,开发者只需要关注初始化、服务、销毁三个阶段,与 Servlet 生命周期相关的方法如表所示。

Servlet 生命周期相关方法: 图片描述 初始化:当一个 Servlet 被加载完毕并实例化以后,Servlet 容器将调用 init() 方法初始化这个对象,执行一些初始化的工作,如读取资源配置信息等。如果初始化阶段发生错误,此 Servlet 实例将被容器直接卸载。

服务:初始化完成以后,Servlet 就会去调用 service() 的具体实现方法 doGet() 或 doPost() 来处理请求;ServletRequest 类型的参数封装了客户端请求信息,而 ServletResponse 类型的参数用于封装响应信息。

销毁:Servlet 容器在销毁 Servlet 对象前,可以通过 destroy() 方法定义。 二.Servlet 生命周期的执行流程 1.在 ServletProject 项目 src/main/java/org/lanqiao/servlet 文件夹下创建 LifeCycleServlet.java 文件代码如下: 图片描述 2.启动服务器后通过浏览器的地址栏访问服务器,属于 get 方式的请求。现在直接通过浏览器访问 /LifeCycleServlet 在 Servlet 生命周期中,初始化 init() 方法只在第一次访问时执行一次;而 doGet() 或 doPost() 方法会在服务器每次接收请求时都执行一次。 图片描述 三.JSP 生命周期 1.类似于 Servlet 生命周期,JSP 生命周期就是指 JSP 从创建到销毁的整个过程。JSP 最终会被翻译成 Servlet,因此 JSP 的生命周期就是在 Servlet 生命周期开始之前,多了一个将 JSP 文件翻译成 Servlet 的初始过程。这个翻译的初始化过程可以分解为解析 JSP 文件和将 JSP 文件转为 Servlet 文件两个步骤。以下是 Tomcat 服务器将 JSP 文件翻译成的 Servlet 文件的代码结构。 public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports {

public void _jspInit() { }

public void _jspDestroy() { }

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {

} } 2.其中 jspInit() 方法对应类似于我们自定义在 Servlet 中的 init() 方法;jspService() 方法类似于自定义 Servlet 中的 service() 方法;jspDestroy() 方法类似于自定义 Servet 中的 destroy() 方法。 四.Servlet API 1.Servlet API 由两个软件包组成:一个是对应 HTTP 协议的软件包,另一个是对应除 HTTP 协议以外通用的软件包。这两个软件包的同时存在使得 Servlet API 能够适应任何请求-响应协议,本书使用的 javax.servlet.http 包中的类和接口都是基于 HTTP 协议的。 2.下图是 Servlet 的继承及聚合关系图。由图可知,自定义的 Servlet,会依次继承 HttpServlet、GenericServlet。而 GenericServlet 会实现 ServletConfig、Servlet 和 Serializable 接口。 图片描述 五.ServletConfig 接口

图片描述

说明:以前学过“接口中的方法均为抽象方法,且 abstract 可省”,所以 ServletConfig 接口中的方法,如 getServletContext()、getInitParameter(String name) 等,实际上都是抽象方法,即省略了关键字 abstract。在使用 ServletConfig 接口时,通常也会用到 ServletContext、ServletRequest、HttpServletRequest、ServletResponse 、HttpServletResponse 等接口。

最新评论
暂无评论~