Skip to content

JSP 九大内置对象、EL 表达式与 JSTL 标签库

本文系统梳理 JSP 的 9 大内置对象及其真实 Java 类型、错误页面异常捕获配置、EL 表达式(11 大隐式对象与 empty 运算符)及 JSTL 核心标签库的实践应用。

1. JSP 九大内置对象映射表

JSP 页面被翻译成 Servlet .java 文件时,Tomcat 会在 _jspService() 方法的局部代码块中预先声明并初始化 9 个可以直接使用的内置对象:

内置对象名真实 Java 接口/类类型作用描述作用域范围
requestjavax.servlet.http.HttpServletRequest代表客户端的 HTTP 请求对象,可获取参数与存取请求域数据Request
responsejavax.servlet.http.HttpServletResponse代表服务器对客户端的响应对象,用以设置响应头或重定向Response
sessionjavax.servlet.http.HttpSession代表客户端会话对象,用以在同一次会话期间共享数据Session
applicationjavax.servlet.ServletContext代表整个 Web 应用上下文,用于全项目所有用户共享数据Application
configjavax.servlet.ServletConfig当前 JSP 对应的 Servlet 配置对象,可获取初始化参数Page
outjavax.servlet.jsp.JspWriter字符输出流,负责将 HTML 内容与表达式写入响应缓冲区Page
pageContextjavax.servlet.jsp.PageContextJSP 上下文核心对象,可获取其他 8 个内置对象与操作四大域Page
pagejava.lang.Object (即 this)代表当前 JSP 编译后的 Servlet 实例本身Page
exceptionjava.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 会按照以下优先级由小到大自动依次查找四大作用域: PageContextRequestSessionApplication

亦可显式指定作用域:${ 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>

基于 VitePress 构建 | 技术知识库