目录

  1. JSP 生命周期概述
  2. JSP 生命周期各阶段
  3. JSP 生命周期中的方法
  4. 完整 JSP 生命周期示例
  5. 参考资料

1. JSP 生命周期概述

JSP(JavaServer Pages)在 Web 服务器中运行时,经历 翻译、编译、执行和销毁 这几个阶段。JSP 文件在 第一次被请求 时会被 转换成 Servlet,并由 Web 容器管理其生命周期。

JSP 生命周期 6 个主要阶段

  1. 翻译(Translation):JSP 转换为 Servlet Java 代码。
  2. 编译(Compilation):JSP 编译为 .class 字节码文件。
  3. 加载与实例化(Loading & Instantiation):Web 容器加载并创建 Servlet 实例。
  4. 初始化(Initialization):调用 jspInit() 进行初始化。
  5. 请求处理(Request Processing):每次请求调用 _jspService() 方法。
  6. 销毁(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()初始化 JSPJSP 首次加载时
_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 工作机制,欢迎继续探索!🚀