Jsp技术入门指南【四】详细讲解jsp与Servlet的对比和Jsp生命周期和工作原理
- 前言
- 一、JSP与Servlet的对比区别
- 1. 设计定位与职责分工
- 2. 会话管理机制
- 3. 隐式对象(Implicit Objects)
- 4. 执行流程与编译方式
- 5. 代码可读性与维护性
- 二、JSP生命周期
- 1. 翻译阶段(Translation Phase)
- 2. 加载与编译阶段(Load & Compile Phase)
- 3. 初始化阶段(Initialization Phase)
- 4. 请求处理阶段(Request Handling Phase)
- 5. 销毁阶段(Destruction Phase)
- 三、JSP工作原理
- 1. 翻译阶段(Translation Stage)
- 步骤1:JSP文件解析
- 步骤2:生成Servlet源文件
- 步骤3:编译为字节码文件
- 2. 请求处理阶段(Request Handling Stage)
- 步骤1:接收请求
- 步骤2:实例化与初始化(首次请求)
- 步骤3:处理请求
- 步骤4:响应客户端
- 步骤5:销毁(非必要时)
- 总结
前言
- 在Java Web开发中,JSP(Java Server Pages)和Servlet是两大核心技术。
- JSP作为Servlet的延伸,简化了动态页面的开发;
- 而Servlet则是Java Web的底层技术,提供了更细粒度的控制。
- 本文将深入对比两者的差异,并解析JSP的生命周期和工作原理,帮助开发者理解其核心机制。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的JSP知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12950980.html?spm=1001.2014.3001.5482
一、JSP与Servlet的对比区别
JSP和Servlet本质上都是Servlet(JSP会被编译为Servlet类),但在设计目标、开发方式和应用场景上有明显区别,以下从核心特性展开对比:
1. 设计定位与职责分工
-
Servlet:
- 核心职责:处理请求逻辑(如接收参数、操作数据库、业务逻辑处理),属于MVC架构中的“控制器(Controller)”。
- 代码结构:以Java类为载体,通过重写
doGet
/doPost
等方法处理请求,需手动拼接HTML响应内容,开发视图繁琐。 - 优势:适合处理复杂业务逻辑,控制流程灵活。
-
JSP:
- 核心职责:聚焦页面展示(HTML/CSS/JS),嵌入少量Java代码(或EL表达式、JSTL标签),属于MVC中的“视图(View)”。
- 代码结构:以
.jsp
文件为载体,支持直接编写HTML,通过<% %>
标签嵌入逻辑,简化页面动态化开发。 - 优势:开发效率高,页面逻辑直观,适合快速构建前端视图。
2. 会话管理机制
-
Servlet:
- 会话管理需显式启动,通过
HttpServletRequest.getSession()
获取HttpSession
对象(若参数为true
,无会话时会自动创建)。 - 示例:
HttpSession session = request.getSession(true); // 显式获取会话
- 会话管理需显式启动,通过
-
JSP:
- 会话管理自动启动,默认启用会话支持(由
page
指令的session="true"
控制)。 - 可直接使用隐式对象
session
,无需手动获取。 - 示例:
<% session.setAttribute("user", "admin"); %> <!-- 直接使用session隐式对象 -->
- 会话管理自动启动,默认启用会话支持(由
3. 隐式对象(Implicit Objects)
-
JSP专属特性:
JSP内置11个隐式对象,无需声明即可直接使用,典型包括:request
(HttpServletRequest)、response
(HttpServletResponse)、session
(HttpSession)application
(ServletContext)、out
(JspWriter,用于输出内容)pageContext
(PageContext,访问页面上下文)、config
(ServletConfig)page
(当前JSP页面实例,等价于this
)、exception
(处理异常,仅在错误页面有效)
-
Servlet:
需手动通过方法参数获取相关对象,例如:HttpServletRequest request = req; HttpSession session = request.getSession();
4. 执行流程与编译方式
-
Servlet:
- 直接编写Java类,编译为
.class
文件后部署,修改后需重启服务器或重新部署。
- 直接编写Java类,编译为
-
JSP:
- 首次请求时由JSP引擎编译为Servlet源文件(
.java
),再编译为.class
文件,后续请求直接执行编译后的类。 - 修改JSP文件后,无需重启服务器,下次请求时会重新编译(生产环境需谨慎使用)。
- 首次请求时由JSP引擎编译为Servlet源文件(
5. 代码可读性与维护性
-
Servlet:
- 纯Java代码,逻辑清晰,适合复杂业务,但拼接HTML代码可读性差(需用
PrintWriter.println()
输出)。
- 纯Java代码,逻辑清晰,适合复杂业务,但拼接HTML代码可读性差(需用
-
JSP:
- HTML中嵌入Java代码(称为“脚本段”),若逻辑复杂会导致页面臃肿(“意大利面条式代码”),现代开发推荐结合EL+JSTL标签减少脚本段,或使用前后端分离架构。
二、JSP生命周期
JSP的生命周期遵循Servlet规范,可分为5个阶段,核心通过编译后的Servlet类(如HelloWorld_jsp
)实现:
1. 翻译阶段(Translation Phase)
- 首次请求时触发:JSP引擎将
.jsp
文件转换为Servlet源文件(命名规则类似*_jsp.java
),并继承HttpJspBase
(最终继承HttpServlet
)。 - 关键操作:
- 将HTML内容转换为
out.write()
语句,Java脚本段(<% %>
)保留为方法内代码。 - 生成隐式对象(如
request
、response
、session
)的声明和初始化逻辑。
- 将HTML内容转换为
2. 加载与编译阶段(Load & Compile Phase)
- 编译Servlet源文件为
.class
字节码文件,加载到JVM中。
3. 初始化阶段(Initialization Phase)
- 调用
_jspInit()
方法(对应Servlet的init()
),用于初始化JSP特有的资源(如数据库连接)。 - 仅在JSP实例化后执行一次,可通过
page
指令的init-method
属性自定义初始化方法。
4. 请求处理阶段(Request Handling Phase)
- 每次请求时调用
_jspService(request, response)
方法(重写Servlet的service()
),根据请求方法(GET/POST)分发到doGet
/doPost
等方法。 - 核心逻辑:
- 创建或获取隐式对象(如
pageContext
、out
)。 - 执行JSP中的Java代码和标签,生成动态内容并写入
out
对象。 - 最终通过
response.getWriter()
将内容输出到客户端。
- 创建或获取隐式对象(如
5. 销毁阶段(Destruction Phase)
- 当JSP引擎关闭或重新部署时,调用
_jspDestroy()
方法(对应Servlet的destroy()
),用于释放初始化阶段申请的资源。
三、JSP工作原理
JSP的核心原理是“一次翻译,多次执行”,其工作流程可分为两大阶段:
1. 翻译阶段(Translation Stage)
步骤1:JSP文件解析
- JSP引擎读取
.jsp
文件,分离静态内容(HTML/CSS/JS)和动态内容(Java脚本、EL表达式、JSTL标签)。
步骤2:生成Servlet源文件
- 将静态内容转换为
out.write("HTML内容")
形式的代码,动态内容保留为Java逻辑。 - 示例:
转换为Servlet代码(简化版):<!-- JSP代码 --> <html><body><% String name = "JSP"; %><h1>Hello, <%= name %>!</h1></body> </html>
out.write("<html>\r\n\t<body>\r\n\t\t"); String name = "JSP"; out.write("<h1>Hello, "); out.print(name); // 对应<%= name %> out.write("!</h1>\r\n\t</body>\r\n</html>");
步骤3:编译为字节码文件
- 将生成的
.java
文件编译为.class
,加载到内存中,形成JSP对应的Servlet实例。
2. 请求处理阶段(Request Handling Stage)
步骤1:接收请求
- 客户端发送请求到JSP页面,服务器匹配到对应的Servlet(即编译后的JSP类)。
步骤2:实例化与初始化(首次请求)
- 若JSP类未实例化,创建实例并调用
_jspInit()
初始化(仅首次请求执行)。
步骤3:处理请求
- 调用
_jspService()
方法,处理用户请求:- 解析请求参数,执行JSP中的业务逻辑(如数据库查询)。
- 生成动态内容,通过
out
对象写入响应体。
步骤4:响应客户端
- 将包含动态内容的HTML响应返回给浏览器,关闭相关资源(隐式对象由容器管理,无需手动关闭)。
步骤5:销毁(非必要时)
- 当服务器关闭或JSP文件被修改时,销毁实例,释放资源。
总结
- JSP vs Servlet:Servlet是底层控制核心,适合复杂逻辑;JSP是视图层技术,简化动态页面开发,二者在MVC架构中互补。
- JSP生命周期:经历翻译、加载、初始化、请求处理、销毁,核心通过编译后的Servlet类实现,首次请求触发翻译和编译。
- 工作原理:JSP本质是“模板化的Servlet”,通过隐式对象和自动会话管理提升开发效率,最终转换为Servlet代码执行。
理解JSP与Servlet的差异及JSP的底层机制,有助于在开发中合理分工(如Servlet处理业务、JSP负责展示),并优化应用性能(如避免在JSP中编写复杂逻辑)。随着前后端分离架构的普及,JSP的视图职责逐渐被前端框架取代,但其核心思想仍对理解Java Web生态至关重要。
以上就是这篇博客的全部内容,下一篇我们将继续探索JSP的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的JSP知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12950980.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |