【JavaWeb学习 | 第17篇】JSP内置对象(隐式对象)
在JSP页面中,容器(Tomcat等)会自动为我们创建并注入9个内置对象(也称为隐式对象或预定义对象)。这些对象无需我们手动声明或实例化,就可以直接在<% %>脚本片段、表达式<%= %>或EL表达式中使用,大大简化了JSP开发。
这9个内置对象对应Servlet中的核心组件,理解它们是掌握JSP的关键。
一、JSP九大内置对象一览表
| 序号 | 对象名称 | Java类型 | 主要作用域 | 核心功能描述 |
|---|---|---|---|---|
| 1 | request | javax.servlet.http.HttpServletRequest | request | 获取客户端请求信息(参数、头信息、Cookie等) |
| 2 | response | javax.servlet.http.HttpServletResponse | – | 设置响应信息(重定向、设置头、Cookie等) |
| 3 | out | javax.servlet.jsp.JspWriter | page | 向客户端输出内容(类似PrintWriter) |
| 4 | session | javax.servlet.http.HttpSession | session | 管理用户会话状态(保存用户登录信息等) |
| 5 | application | javax.servlet.ServletContext | application | 整个Web应用共享的数据(全局配置、计数器等) |
| 6 | config | javax.servlet.ServletConfig | page | 当前JSP/Servlet的配置信息(初始化参数) |
| 7 | pageContext | javax.servlet.jsp.PageContext | page | 最强大:管理四大作用域、跳转、获取其他内置对象 |
| 8 | page | java.lang.Object(实际是当前JSP的Servlet实例) | page | 代表当前JSP页面本身(很少直接使用) |
| 9 | exception | java.lang.Throwable | page(仅错误页) | 异常对象,仅在isErrorPage="true"的页面可用 |
注意:其中exception对象只有在页面指令<%@ page isErrorPage="true" %>时才可用。
二、四大作用域(与内置对象紧密相关)
JSP通过pageContext可以操作四大作用域,数据共享范围从大到小依次是:
- page(页面作用域):当前JSP页面
- request(请求作用域):一次请求(包括转发)
- session(会话作用域):一次会话(浏览器关闭前)
- application(应用作用域):整个Web应用(服务器重启前)
常用方法:
setAttribute(String name, Object value)getAttribute(String name)removeAttribute(String name)
三、常用内置对象详细说明与示例
1. request 对象(最常用)
用于获取表单参数、请求头、客户端信息等。
<%-- 获取表单参数 --%>
姓名:<%= request.getParameter("username") %>
<%-- 获取所有参数名 --%>
<%
java.util.Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
out.println(name + " = " + request.getParameter(name) + "<br>");
}
%>
<%-- 请求头 --%>
User-Agent: <%= request.getHeader("User-Agent") %>
2. response 对象
常用于重定向、设置响应头。
<%
// 重定向(客户端行为,地址栏改变)
response.sendRedirect("success.jsp");
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
%>
注意:sendRedirect()后不能再输出内容,否则可能抛异常。
3. out 对象
用于输出内容到客户端。JspWriter类型,比response.getWriter()更方便(有缓冲)。
<% out.print("Hello JSP!"); %>
<% out.println("换行输出"); %>
<%-- 表达式其实就是 out.print() --%>
<%= "直接输出" %>
4. session 对象
保存用户会话数据(默认30分钟超时)。
<%
session.setAttribute("user", "张三");
String user = (String) session.getAttribute("user");
out.println("当前登录用户:" + user);
// 获取Session ID
out.println("Session ID: " + session.getId());
%>
5. application 对象
整个应用共享,常用于在线人数统计、全局配置。
<%
Integer count = (Integer) application.getAttribute("onlineCount");
if(count == null) count = 1;
else count++;
application.setAttribute("onlineCount", count);
out.println("当前在线人数:" + count);
%>
6. pageContext 对象(超级重要)
可以获取其他内置对象、管理四大作用域、实现页面跳转(forward)。
<%-- 设置/获取不同作用域 --%>
<% pageContext.setAttribute("msg", "page作用域"); %>
<% pageContext.setAttribute("msg", "request作用域", PageContext.REQUEST_SCOPE); %>
<%-- 获取其他对象 --%>
<%
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
JspWriter o = pageContext.getOut();
%>
<%-- 转发(服务器内部跳转,地址栏不变) --%>
<% pageContext.forward("target.jsp"); %>
7. config 对象
获取web.xml中为当前Servlet/JSP配置的初始化参数。
<%= config.getInitParameter("paramName") %>
8. page 对象
基本等同于this,指向当前JSP翻译成的Servlet实例,很少直接用。
9. exception 对象(错误处理页专用)
在错误页面中使用:
<%-- error.jsp --%>
<%@ page isErrorPage="true" contentType="text/html;charset=UTF-8" %>
<h2>发生错误!</h2>
错误信息:<%= exception.getMessage() %>
<br>
堆栈信息:
<pre><%= exception.getStackTrace() %></pre>
四、实际开发小贴士
- EL表达式中也可以直接使用这些对象(如
${param.username}、${sessionScope.user}、${pageContext.request.contextPath})。 - pageContext 是连接其他对象的桥梁,很多框架(如JSTL)都依赖它。
- 作用域选择原则:能用小的作用域就不要用大的,避免内存浪费和数据混乱。
- JSP现在逐渐被Thymeleaf、Freemarker等模板引擎替代,但在学习JavaWeb基础时,熟练掌握内置对象仍是必须的。
五、练习建议
- 写一个登录页面,用
request获取用户名密码,存入session,跳转后显示欢迎信息。 - 实现一个简单的在线计数器(用
application)。 - 创建一个错误页面,演示
exception对象的使用。 - 使用
pageContext在不同作用域间传递数据,并比较区别。
掌握了这9个内置对象,你就真正进入了JSP开发的“门”。
系列文章导航(持续更新中):
- 第16篇:JSP基础语法(指令、脚本、表达式、动作标签)
- 第17篇:JSP内置对象(本文)
- 第18篇:JSP与Servlet的结合、JSP开发模式(MVC)…
有任何疑问(如某个对象的具体方法想看更多示例),随时在评论区留言,我会继续补充!
继续加油,JavaWeb学习之路越走越宽!🚀