JSP 本质是 Servlet 的“语法糖”。当用户首次访问某 JSP 页面时,Web 容器(如 Tomcat)会将请求交给 JSP 引擎处理:
.jsp 文件翻译成一个继承自 HttpJspBase 的 Servlet 类(通常命名为 _jspServlet),并编译为 .class 字节码。jspInit()。_jspService(request, response) 方法。此方法内会创建或获取 9 大隐式对象供页面使用。jspDestroy()。性能提示:首次访问因翻译编译较慢,后续访问若 JSP 未修改,容器直接复用已加载的 Servlet 实例,性能等同于手写 Servlet。
JSP 引擎在 _jspService 中自动声明并初始化以下 9 个变量,开发者可直接在脚本let(<% %>)或表达式(<%= %>)中使用:
| 变量名 | 真实类型 | 作用域 | 核心用途 |
|---|---|---|---|
request | HttpServletRequest | request | 封装客户端请求信息(参数、头、属性等) |
response | HttpServletResponse | response | 控制响应内容、状态码、重定向、Cookie 等 |
pageContext | PageContext | page | 页面上下文核心对象,封装其它 8 个对象,自身也是域对象 |
session | HttpSession | session | 用户会话数据存储(登录状态、购物车等) |
application | ServletContext | application | 全局应用级数据共享(配置、缓存、计数器等) |
out | JspWriter | page | 字符输出流,向客户端写内容(比 response.getWriter() 更强,支持缓冲) |
config | ServletConfig | page | 当前 JSP 对应 Servlet 的初始化参数 |
page | Object (this) | page | 当前页面实例引用,极少直接使用 |
exception | Throwable | page | 仅在 isErrorPage="true" 的错误页面可用,封装异常信息 |
它是 JSP 技术中最重要的对象,原因有三:
getRequest()、getSession()、getApplication() 等方法可获取其它 8 个隐式对象。setAttribute(name, value) / getAttribute(name) 在 page 范围存取数据。scope 参数的重载方法,可操作 request/session/application 三大域:setAttribute(name, value, PageContext.REQUEST_SCOPE)getAttribute(name, PageContext.SESSION_SCOPE)forward()、include()、findAttribute()(按 page→request→session→application 顺序查找)等高频操作。设计启示:若将 pageContext 传递给普通 Java 类,该类即可拥有访问 Web 所有域数据、转发包含资源的能力,实现了视图层与工具类的解耦。
| 作用域 | 生命周期 | 典型场景 |
|---|---|---|
| page | 仅当前页面渲染期间 | 临时计算结果、标签间传值 |
| request | 一次 HTTP 请求链(含转发) | Controller 传数据给 View、表单回显 |
| session | 用户会话期间(浏览器关闭或超时失效) | 登录用户信息、权限、购物车 |
| application | Web 应用启动到关闭 | 全局配置、缓存数据、在线人数统计 |
page 对象:它只是 this 引用,无任何 Web 语义,切勿当作域对象用。exception:必须在页面指令设置 <%@ page isErrorPage="true" %> 才会注入该变量,否则编译报错。out 与 response.getWriter():out 是 JspWriter,带缓冲、clearBuffer() 等增强功能;直接用 response.getWriter() 会绕过 JSP 缓冲机制,导致输出顺序混乱。web.xml 中 <session-config><session-timeout>30</session-timeout></session-config> 单位是分钟,非秒。九大隐式对象是 JSP 简化 Web 开发的基石。深入理解它们的真实类型、作用域边界、核心 API,特别是 pageContext 的聚合与跨域能力,能让你在维护老项目或编写模板页面时得心应手。现代开发虽多用 MVC 框架(Spring MVC 等)隐藏了这些细节,但底层原理不变,掌握它们等于掌握了 Java Web 的“内功心法”。