Appearance
JSP 九大内置对象、EL 表达式与 JSTL 标签库
本文系统梳理 JSP 的 9 大内置对象及其真实 Java 类型、错误页面异常捕获配置、EL 表达式(11 大隐式对象与
empty运算符)及 JSTL 核心标签库的实践应用。
1. JSP 九大内置对象映射表
JSP 页面被翻译成 Servlet .java 文件时,Tomcat 会在 _jspService() 方法的局部代码块中预先声明并初始化 9 个可以直接使用的内置对象:
| 内置对象名 | 真实 Java 接口/类类型 | 作用描述 | 作用域范围 |
|---|---|---|---|
request | javax.servlet.http.HttpServletRequest | 代表客户端的 HTTP 请求对象,可获取参数与存取请求域数据 | Request |
response | javax.servlet.http.HttpServletResponse | 代表服务器对客户端的响应对象,用以设置响应头或重定向 | Response |
session | javax.servlet.http.HttpSession | 代表客户端会话对象,用以在同一次会话期间共享数据 | Session |
application | javax.servlet.ServletContext | 代表整个 Web 应用上下文,用于全项目所有用户共享数据 | Application |
config | javax.servlet.ServletConfig | 当前 JSP 对应的 Servlet 配置对象,可获取初始化参数 | Page |
out | javax.servlet.jsp.JspWriter | 字符输出流,负责将 HTML 内容与表达式写入响应缓冲区 | Page |
pageContext | javax.servlet.jsp.PageContext | JSP 上下文核心对象,可获取其他 8 个内置对象与操作四大域 | Page |
page | java.lang.Object (即 this) | 代表当前 JSP 编译后的 Servlet 实例本身 | Page |
exception | java.lang.Throwable | 代表页面运行时的未捕获异常对象(仅在 isErrorPage="true" 时可用) | Page |
2. JSP 错误页面配置
当 Web 应用程序发生 500 内部异常或 404 资源未找到时,为避免向用户暴露敏感的 StackTrace 堆栈信息,可进行统一的错误页面兜底配置:
2.1 页面级错误配置
在业务 JSP 页面顶部设置 errorPage 属性;在专门的错误提示页(error.jsp)顶部设置 isErrorPage="true":
html
<!-- 业务页面 index.jsp -->
<%@ page contentType="text/html;charset=UTF-8" errorPage="error.jsp" %>
<!-- 错误处理页面 error.jsp -->
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>
<html>
<body>
<h2>系统繁忙,请稍后再试!</h2>
<!-- isErrorPage="true" 开启后,可以直接使用内置对象 exception -->
<p>错误原因:<%= exception != null ? exception.getMessage() : "未知异常" %></p>
</body>
</html>2.2 全局级别错误配置 (web.xml)
在项目 web.xml 中配置全局状态码捕获(优先级高于页面级设置):
xml
<!-- 捕获 404 页面不存在 -->
<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
<!-- 捕获 500 服务器内部报错 -->
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>3. EL 表达式 (Expression Language)
EL 表达式 提供了在 JSP 页面中极简读取 Java 对象、集合及域对象属性的语法。格式为 ${ 表达式 }。
3.1 域对象属性获取规则
当执行 ${ user.name } 时,EL 会按照以下优先级由小到大自动依次查找四大作用域: PageContext ➔ Request ➔ Session ➔ Application
亦可显式指定作用域:${ sessionScope.user.name }。
3.2 判空运算符 empty
empty 用于检查字符串、集合、数组或对象是否为 null 或空("" 或 size == 0):
html
<!-- 当 list 为 null 或没有元素时返回 true -->
<p>是否有商品:${ not empty cartList }</p>4. JSTL 核心标签库 (JSP Standard Tag Library)
JSTL 消除在 JSP 页面中书写传统 <% java代码 %> 脚本片段,提供标准化 XML 格式标签进行流程控制与集合遍历。
引入 JSTL 核心库指令:
html
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>4.1 条件判断 <c:if> 与 <c:choose>
html
<!-- 单条件判断 -->
<c:if test="${ sessionScope.user != null }">
<span>欢迎您,${ sessionScope.user.username }</span>
</c:if>
<!-- 多分支判断 (相当于 if-else if-else) -->
<c:choose>
<c:when test="${ user.role == 'ADMIN' }">管理员控制台</c:when>
<c:when test="${ user.role == 'VIP' }">尊贵会员中心</c:when>
<c:otherwise>普通用户个人主页</c:otherwise>
</c:choose>4.2 集合/数组遍历 <c:forEach>
html
<table border="1">
<tr><th>序号</th><th>商品名称</th><th>价格</th></tr>
<!--
items: 遍历的集合/数组
var: 当前遍历到的元素变量名
varStatus: 状态变量 (index 从 0 开始, count 从 1 开始, first, last)
-->
<c:forEach items="${ productList }" var="p" varStatus="status">
<tr>
<td>${ status.count }</td>
<td>${ p.name }</td>
<td>¥ ${ p.price }</td>
</tr>
</c:forEach>
</table>