JSP 生命周期
学习 JSP 最重要的关键是去理解 JSP 应用的声明周期,这样我们才能理解 JSP 的底层功能
JSP 生命周期指的是 JSP 应用从创建到销毁的整个过程
JSP 生命周期类似于 Servlet 的生命周期,它们的区别只在于 JSP 生命周期还包括将 JSP 文件编译成 servlet
JSP 的生命周期要经历 编译 -> 初始化 -> 执行 -> 销毁 几个阶段 :
-
- 编译阶段
- Servlet 容器编译 servlet 源文件,生成 servlet 类
-
- 初始化阶段
- 加载与 JSP 对应的 servlet 类,创建其实例,并调用它的初始化方法
-
- 执行阶段
- 调用与 JSP 对应的 servlet 实例的服务方法
-
- 销毁阶段
- 调用与 JSP 对应的 servlet 实例的销毁方法,然后销毁 servlet 实例
JSP 的生命周期是不是和 Servlet 的很相像
JSP 生命周期图示
JSP 编译
当浏览器请求一个 JSP 页面时,JSP 引擎会首先去检查是否需要编译这个文件
如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个 JSP 文件
JSP 编译的过程分为三个步骤:
- 解析 JSP 文件
- 将 JSP 文件转为 servlet
- 编译 servlet
JSP 初始化
编译好 JSP 文件,JSP 容器就会载入 JSP ,然后在处理请求前会先调用 jspInit()
方法
如果我们要执行自定义的 JSP 初始化任务,重写 jspInit()
方法就可以了
jspInit() 方法原型
public void jspInit() { // 初始化代码 }
注意,一般来说程序只会初始化一次,Servlet 和 JSP 也是如此,我们可以在 jspInit()
方法中初始化数据库连接、打开文件和创建查询表
JSP 执行
这一阶段 JSP 开始处理请求,包括一切与请求相关的交互行为,直到被销毁
当 JSP 网页完成初始化后,JSP 引擎就会调用 _jspService()
来处理请求
_jspService() 方法
JSP _jspService() 方法需要一个 HttpServletRequest 对象和一个 HttpServletResponse 对象作为它的参数
void _jspService(HttpServletRequest request, HttpServletResponse response) { // 服务端处理代码 }
_jspService() 方法会在每个 request 中被调用一次并且负责创建与之相对应的 response ,并且响应所有 7 个 HTTP 方法,比如 GET、POST、DELETE
JSP 清理
JSP 清理就是把 JSP 页面从 JSP 容器中移除
JSP 容器调用 jspDestroy() 方法来销毁 JSP 页面
当我们需要执行任何清理工作时重写 jspDestroy()方法即可,比如 释放数据库连接或者关闭文件夹等
jspDestroy() 方法
public void jspDestroy() { // 清理代码 }
范例
我们已经了解了 JSP 整个生命周期,现在,让我们写一个范例来加深印象
webapp/life_cycle.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>life.jsp</title> </head> <body> <%! private int initVar=0; private int serviceVar=0; private int destroyVar=0; %> <%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次"); } %> <% serviceVar++; System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求"); String content1="初始化次数 : "+initVar; String content2="响应客户请求次数 : "+serviceVar; String content3="销毁次数 : "+destroyVar; %> <h1>简单编程 JSP 测试实例</h1> <p><%=content1 %></p> <p><%=content2 %></p> <p><%=content3 %></p> </body> </html>
在浏览器上输入 http://localhost:8080/jsp/life_cycle.jsp 显示结果如下
每刷新一次,访问次数就会增长 1