在 JSP 程序设计中,Servlet 对象是连接 JSP 页面与底层 Java 逻辑的重要桥梁,而 page 对象作为 Servlet 对象的重要组成部分,虽在日常开发中不常直接使用,但理解其本质与用法,能帮助我们更深入掌握 JSP 的运行原理。今天就带大家从概念出发,通过完整实例,一步步搞懂 page 对象。
一、page对象概述
首先要明确一个关键前提:JSP 引擎会为每个 JSP 页面生成对应的 Servlet 类,我们编写的 JSP 代码最终都会被转译为 Servlet 的 Java 源代码并执行。而 page 对象,正是这个生成的 Servlet 实例的引用,它相当于 Servlet 类中的this关键字,是Object类的一个实例。
简单来说:
-
page 对象 = 当前 JSP 页面转译后的 Servlet 实例
-
它可以访问 Servlet 类的所有变量和方法
-
日常开发中使用频率较低,但理解它能帮我们搞懂 JSP 与 Servlet 的关联
二、实例:page对象方法运用
光说概念不够直观,下面通过一个完整实例,展示如何用 page 对象调用getServletInfo()方法,获取page指令中定义的页面信息。
1. 完整 JSP 代码(pageDemo01.jsp)
java
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" info="这是通过page指令定义的页面信息" %>
<%
// 定义页面基础路径(用于页面资源引用,符合JSP规范写法)
String basePath = request.getScheme() + "://" + request.getServerName() + ":"
+ request.getServerPort() + request.getContextPath() + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>JSP page对象实战示例</title>
<style>
body { font-family: "Microsoft YaHei"; padding: 20px; }
h3 { color: #2c3e50; }
.result { color: #e74c3c; font-weight: bold; margin-top: 10px; }
</style>
</head>
<body>
<h3>JSP page对象用法演示</h3>
<p>通过page对象调用getServletInfo()方法,获取page指令中定义的info属性值:</p>
<div class="result">
<%
// 关键步骤:将page对象强制转换为HttpJspPage类型(因page默认是Object类型)
// 然后调用getServletInfo()方法获取页面信息
javax.servlet.jsp.HttpJspPage pageInstance = (javax.servlet.jsp.HttpJspPage) page;
String pageInfo = pageInstance.getServletInfo();
out.print("页面info属性值:" + pageInfo);
%>
</div>
</body>
</html>
2. 代码关键解析
这段代码有两个核心要点,缺一不可:
(1)page 指令定义 info 属性
在页面顶部的page指令中,我们添加了info属性:
java
<%@ page ... info="这是通过page指令定义的页面信息" %>
当 JSP 引擎将页面转译为 Servlet 时,会自动生成getServletInfo()方法,该方法的返回值就是info属性的内容。转译后的 Servlet 代码(部分)如下:
java
public final class pageDemo01_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
// 自动生成的getServletInfo()方法
public String getServletInfo() {
return "这是通过page指令定义的页面信息";
}
// 其他Servlet逻辑...
}
(2)page 对象强制转换与方法调用
由于 page 对象默认是Object类型,而getServletInfo()是HttpJspPage接口的方法,因此必须先将 page 对象强制转换为HttpJspPage类型,才能调用该方法:
java
// 强制转换类型
javax.servlet.jsp.HttpJspPage pageInstance = (javax.servlet.jsp.HttpJspPage) page;
// 调用方法获取信息
String pageInfo = pageInstance.getServletInfo();
当然,也可以简化为一行代码:
java
out.print("页面info属性值:" + ((javax.servlet.jsp.HttpJspPage) page).getServletInfo());
3.运行效果:看 page 对象如何工作
当我们将上述 JSP 文件部署到 Tomcat 等服务器,通过浏览器访问(如http://localhost:8080/项目名/pageDemo01.jsp)时,页面会显示如下内容:

-
标题:JSP page 对象实战示例
-
提示文本:通过 page 对象调用 getServletInfo () 方法,获取 page 指令中定义的 info 属性值:
-
结果(红色加粗):页面 info 属性值:这是通过 page 指令定义的页面信息
4.注意事项与拓展思考
(1)page 对象与 this 的关系
前面提到 page 对象是this的同义词,因此在 JSP 脚本中,((HttpJspPage) page).getServletInfo()与this.getServletInfo()效果完全一致,甚至可以直接省略this,写成getServletInfo()(因 JSP 脚本默认处于 Servlet 的_jspService()方法中,this指代当前 Servlet 实例)。
(2)为什么 page 对象使用频率低?
因为 page 对象能做的事情,this或其他内置对象(如 request、response)基本都能覆盖,且使用更简洁。比如获取页面信息用getServletInfo(),但实际开发中更多是通过 request 传递参数,而非依赖 page 指令的 info 属性。
(3)类型转换的必要性
必须将 page 对象强制转换为HttpJspPage或其实现类(如转译后的pageDemo01_jsp),否则无法调用getServletInfo()等 Servlet 特有的方法 ------ 因为 page 对象的声明类型是Object,仅包含Object类的默认方法。
5.总结
通过本文的讲解与实例,相信大家对 JSP 的 page 对象有了清晰的认识:它不是一个 "新" 对象,而是当前 JSP 转译后 Servlet 实例的引用,本质是this的同义词。虽然日常开发中不常用,但理解它的原理,能帮助我们更深入地掌握 JSP 与 Servlet 的底层关联,为后续学习更复杂的 JSP 技术打下基础。
如果在实践中遇到问题,比如类型转换错误、页面信息无法显示等,不妨回头看看本文的代码解析,检查是否遗漏了page指令的 info 属性,或是否正确进行了类型转换。