目录
1. JSP 生命周期概述
JSP(JavaServer Pages)在 Web 服务器中运行时,经历 翻译、编译、执行和销毁 这几个阶段。JSP 文件在 第一次被请求 时会被 转换成 Servlet,并由 Web 容器管理其生命周期。
JSP 生命周期 6 个主要阶段
- 翻译(Translation):JSP 转换为 Servlet Java 代码。
- 编译(Compilation):JSP 编译为
.class
字节码文件。 - 加载与实例化(Loading & Instantiation):Web 容器加载并创建 Servlet 实例。
- 初始化(Initialization):调用
jspInit()
进行初始化。 - 请求处理(Request Processing):每次请求调用
_jspService()
方法。 - 销毁(Destruction):JSP 生命周期结束时,调用
jspDestroy()
释放资源。
2. JSP 生命周期各阶段
1. 翻译阶段(Translation)
过程:
- JSP 容器将
.jsp
文件转换为 Java Servlet 代码(.java
)。 - JSP 页面中的 HTML 保持不变,而 JSP 代码被嵌入到
service()
方法中。
示例:JSP 转换的 Servlet 代码
JSP 代码(index.jsp
):
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
<h1>欢迎访问 JSP 页面</h1>
</body>
</html>
转换后的 Servlet 代码(index_jsp.java
):
public final class index_jsp extends HttpServlet {
public void _jspService(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
out.write("<html><body><h1>欢迎访问 JSP 页面</h1></body></html>");
}
}
2. 编译阶段(Compilation)
过程:
- 生成的 Servlet Java 代码被 JSP 编译器编译为 Java 字节码(
.class
文件)。 - 该
.class
文件由 Web 容器管理,并执行请求。
执行命令(Tomcat 自动完成):
javac index_jsp.java -d /WEB-INF/classes/
3. 加载与实例化(Loading & Instantiation)
过程:
- Web 容器加载 JSP 生成的 Servlet
.class
文件。 - 容器创建 Servlet 实例并存入内存中。
Servlet 实例的生命周期:
- 单实例多线程:默认情况下,一个 JSP 页面 只有一个 Servlet 实例,多个请求会 共享这个实例。
- 会话管理:多个用户的请求共用一个 Servlet,但不同用户的
session
是独立的。
4. 初始化(Initialization)
过程:
- JSP 生成的 Servlet 首次加载时,容器会调用
jspInit()
方法进行初始化。 - 该方法在 JSP 生命周期内 只执行一次,可以在此进行资源分配(如数据库连接)。
示例:自定义 jspInit()
方法
<%!
public void jspInit() {
System.out.println("JSP 初始化...");
}
%>
执行顺序
JSP 初始化...
5. 请求处理(Request Processing)
过程:
- 每次有用户请求 JSP 页面时,都会调用
_jspService()
方法。 - 该方法负责:
- 接收 HTTP 请求
- 处理数据
- 生成 HTML 响应
示例:处理用户请求
<%
String user = request.getParameter("name");
out.print("<p>欢迎, " + user + "!</p>");
%>
请求:
http://localhost:8080/myapp/index.jsp?name=Tom
响应:
<p>欢迎, Tom!</p>
6. 销毁(Destruction)
过程:
- 当 JSP 页面不再使用,或服务器关闭时,Web 容器调用
jspDestroy()
方法进行 资源清理。 - 这时可以关闭数据库连接、释放文件流等。
示例:自定义 jspDestroy()
方法
<%!
public void jspDestroy() {
System.out.println("JSP 被销毁...");
}
%>
执行顺序
JSP 被销毁...
3. JSP 生命周期中的方法
方法 | 说明 | 何时调用 | 可否重写 |
---|---|---|---|
jspInit() | 初始化 JSP | JSP 首次加载时 | ✅ |
_jspService() | 处理 HTTP 请求 | 每次请求执行 | ❌(不可重写) |
jspDestroy() | 释放资源 | JSP 被卸载时 | ✅ |
4. 完整 JSP 生命周期示例
<%@ page language="java" contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>JSP 生命周期示例</title>
</head>
<body>
<h1>JSP 生命周期</h1>
<%!
public void jspInit() {
System.out.println("JSP 初始化...");
}
public void jspDestroy() {
System.out.println("JSP 被销毁...");
}
%>
<%-- 处理请求 --%>
<p>当前时间: <%= new java.util.Date() %></p>
</body>
</html>
控制台输出
JSP 初始化...
JSP 处理请求...
JSP 处理请求...
JSP 被销毁...
5. 参考资料
出站链接
其他资源
- 《Head First Servlets and JSP》——JSP/Servlet 经典书籍
- JSP 教程合集
这篇文章详细解析了 JSP 生命周期,如果你想深入学习 JSP 内存管理、Servlet 工作机制,欢迎继续探索!🚀
发表回复