Java Web后端原生基石:一文吃透 Servlet 与 JSP 核心原理、内置对象与四大作用域
目录
在 Java Web 开发的发展长河中,Servlet 与 JSP 是所有 Web 框架的鼻祖与基石。如今流行的 SpringMVC、SpringBoot 底层本质上依然是对 Servlet 规范的封装与升级。
很多开发者只会使用框架开发,却完全不了解最底层的 Web 运行机制:不清楚 Servlet 与 JSP 的渊源关系、分不清九大内置对象的用途、搞不懂四大作用域的传递范围。
本文基于经典面试考点,深度拆解 Servlet 与 JSP 的底层关系、核心区别、九大内置对象职能、四大作用域层级,搭配完整实战代码,带你从零吃透 Java Web 原生底层核心。
一、Servlet 与 JSP 的底层渊源与核心区别
很多人误以为 JSP 和 Servlet 是两个完全独立的技术,实则不然:JSP 本质就是 Servlet 的扩展与简化写法。
Servlet 是纯 Java 代码,专注后台逻辑;JSP 是 HTML 与 Java 代码混合的页面,专注视图展示。二者相辅相成,构成了早期 Java Web 的 MVC 雏形。
1.1 核心定位差异
Servlet:纯 Java 程序,专注控制逻辑、业务处理、请求分发。Servlet 中写 Java 代码非常便捷,但输出 HTML 页面极其繁琐,需要大量拼接字符串。
JSP:Servlet 的升级简化版,专注视图渲染、页面展示。JSP 可以直接编写 HTML,嵌入少量 Java 脚本,极大简化了页面开发。
1.2 底层本质关系
JSP 页面在服务器运行时,会被 Tomcat 容器自动编译成一个 Servlet 类执行。
简单总结:JSP 是披着 HTML 外衣的 Servlet。
1.3 核心区别总结
1. 编程形式不同:Servlet 纯 Java 文件;JSP 是 HTML+Java 混合文件。
2. 职责不同:Servlet 负责后台控制逻辑;JSP 负责前台视图展示。
3. 开发效率不同:Servlet 适合逻辑处理、不适合页面输出;JSP 适合快速编写页面视图。
二、JSP 九大内置对象:页面开发的原生工具库
JSP 为了简化页面开发,内置了 9 个无需手动 new、可直接使用的核心对象,覆盖了请求、响应、会话、页面、异常、输出等全部 Web 场景,是 JSP 页面运行的核心支撑。
2.1 九大内置对象详解
1. request(请求对象)
封装客户端浏览器的所有请求信息,可获取请求参数、请求头、请求方式等,是接收前端数据的核心对象。
2. response(响应对象)
封装服务器对客户端的所有响应信息,可实现页面跳转、重定向、设置响应头、输出数据等操作。
3. session(会话对象)
用户会话级对象,服务器为每个浏览器单独分配一个 session,用于存储单个用户全程访问的专属数据。
4. application(全局应用对象)
整个 Web 项目的全局对象,所有用户共享,项目启动创建、项目关闭销毁。
5. pageContext(页面上下文对象)
页面级核心对象,可获取其他所有内置对象,同时管理 page 作用域属性,是页面的“总管家”。
6. out(输出流对象)
页面输出打印流,用于在 JSP 页面直接输出文本、HTML 内容到浏览器。
7. config(配置对象)
获取当前 Servlet / JSP 的 web.xml 配置参数信息。
8. page(页面对象)
代表当前 JSP 页面本身,等价于 Java 中的 this 关键字。
9. exception(异常对象)
专门用于异常页面,封装当前页面抛出的所有异常信息,用于统一异常展示。
三、JSP 四大作用域:数据存储与传递的层级体系
JSP 提供四个层级的数据作用域,由小到大依次为:page → request → session → application。作用域决定了数据的存活时间、共享范围,是 Web 数据传值的核心知识点。
3.1 四大作用域完整解析
1. page 页面作用域
最小作用域,数据仅在当前页面有效,页面刷新、跳转后数据立即失效,适合页面临时数据。
2. request 请求作用域
数据在一次请求过程中有效,服务器内部跳转可共享数据,浏览器刷新、新请求数据失效。常用于单次请求的页面传值、查询结果回显。
3. session 会话作用域
数据在单个用户整个会话期间有效,同一浏览器多次请求、多次页面跳转数据不丢失,关闭浏览器后数据销毁。常用于存储用户登录信息、个人临时数据。
4. application 全局作用域
最大作用域,整个项目全局共享、所有用户共享,服务器启动创建,服务器关闭销毁。适合存储项目全局常量、网站访问量、全局配置。
四、全套实战代码演示(作用域传值对比)
通过代码直观验证四大作用域的传值范围与生命周期差异。
4.1 JSP 四大作用域赋值演示(scope.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP四大作用域测试</title>
</head>
<body>
<%
// 1. page作用域:仅当前页面有效
pageContext.setAttribute("pageMsg","page页面作用域数据");
// 2. request作用域:一次请求有效
request.setAttribute("requestMsg","request请求作用域数据");
// 3. session作用域:当前用户会话有效
session.setAttribute("sessionMsg","session会话作用域数据");
// 4. application作用域:全局所有用户有效
application.setAttribute("appMsg","application全局作用域数据");
%>
<h3>【当前页面获取数据】</h3>
page数据:<%=pageContext.getAttribute("pageMsg")%> <br/>
request数据:<%=request.getAttribute("requestMsg")%> <br/>
session数据:<%=session.getAttribute("sessionMsg")%> <br/>
application数据:<%=application.getAttribute("appMsg")%> <br/>
<%-- 服务器内部跳转,延续一次请求 --%>
<jsp:forward page="target.jsp"/>
</body>
</html>
4.2 跳转页面取值演示(target.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>跳转页面取值</title>
</head>
<body>
<h3>【跳转后页面获取数据】</h3>
page数据:<%=pageContext.getAttribute("pageMsg")%> <br/>
request数据:<%=request.getAttribute("requestMsg")%> <br/>
session数据:<%=session.getAttribute("sessionMsg")%> <br/>
application数据:<%=application.getAttribute("appMsg")%> <br/>
</body>
</html>
4.3 运行结果分析
1. page数据:跳转后为 null,仅当前页面生效;
2. request数据:服务器跳转可获取,新浏览器窗口失效;
3. session数据:同浏览器全程有效,关闭浏览器失效;
4. application数据:所有页面、所有浏览器均可获取,全局永久有效。
五、Servlet 基础代码对照(纯后台逻辑)
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 原生Servlet:专注后台逻辑处理
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求参数
String name = request.getParameter("name");
// 设置request作用域数据
request.setAttribute("name",name);
// 请求转发跳转到JSP页面
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
}
由此可见:Servlet 负责接收请求、处理逻辑、封装数据;JSP 负责展示页面、渲染数据,完美体现前后端职责分离的原始设计思想。
六、面试核心考点精炼总结
1. Servlet 和 JSP 区别?
JSP 是 Servlet 的扩展,本质编译后就是 Servlet;Servlet 纯 Java、侧重后台逻辑控制;JSP 混合HTML、侧重视图展示。
2. JSP 九大内置对象?
request、response、session、application、pageContext、out、config、page、exception。
3. 四大作用域范围?
page(单页面)、request(单次请求)、session(单次会话)、application(全局项目)。
七、文末小结
Servlet 与 JSP 是 Java Web 的开山之作。Servlet 用纯粹的 Java 代码扛起了后台逻辑的大旗,JSP 用简洁的页面语法补齐了视图展示的短板。
九大内置对象简化了 Web 开发的繁琐操作,四大作用域规范了数据的存储与传递层级。如今虽然前后端分离成为主流,但所有 Spring 系列框架,依然是 Servlet 规范的延伸与封装。吃透这套底层原理,才算真正读懂 Java Web 的底层运行逻辑。
更多推荐


所有评论(0)