目录

  1. 什么是 JSP 异常处理
  2. 为什么要进行异常处理
  3. JSP 异常处理的方法
  4. 代码示例
  1. 异常对象的常用方法
  2. 工作原理详解
  3. 优点与应用场景
  4. 常见问题与注意事项
  5. 参考资料与出站链接

什么是 JSP 异常处理

JSP 异常处理是指在 JSP 页面运行时捕获和处理可能出现的错误或异常(如 NullPointerException、ArithmeticException 等),以避免程序中断并向用户提供友好的错误信息。JSP 提供了内置机制(如 <%@ page errorPage %><error-page>)来管理异常。


为什么要进行异常处理

  • 用户体验:避免直接暴露堆栈跟踪,提供友好提示。
  • 程序健壮性:防止未处理的异常导致页面崩溃。
  • 调试便利:记录异常信息,便于开发者定位问题。
  • 安全性:隐藏敏感信息(如服务器路径、数据库细节)。

JSP 异常处理的方法

JSP 支持两种主要异常处理方式:

  1. 页面级异常处理
  • 使用 <%@ page errorPage="错误页面.jsp" %> 指定错误处理页面。
  • 在错误页面中使用 isErrorPage="true" 获取异常对象。
  1. 全局异常处理
  • web.xml 中通过 <error-page> 配置,适用于整个 Web 应用。
  • 可按异常类型或 HTTP 状态码(如 404、500)指定处理页面。

代码示例

页面级异常处理

主页面 (main.jsp)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="error.jsp"%>
<html>
<head>
    <title>JSP 页面级异常处理</title>
</head>
<body>
    <h1>测试异常</h1>
    <%
        // 故意抛出异常
        String str = null;
        out.println(str.length());
    %>
</body>
</html>

错误页面 (error.jsp)

1
2
3
4
5
6
7
8
9
10
11
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%>
<html>
<head>
    <title>错误页面</title>
</head>
<body>
    <h1>发生错误</h1>
    <p>错误信息:<%= exception.getMessage() %></p>
    <p>异常类型:<%= exception.getClass().getName() %></p>
</body>
</html>

运行结果:

  • main.jspNullPointerException 跳转到 error.jsp
  • 显示:错误信息:null异常类型:java.lang.NullPointerException

全局异常处理

配置 web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         version="4.0">
    <!-- 按异常类型处理 -->
    <error-page>
        <exception-type>java.lang.NullPointerException</exception-type>
        <location>/globalError.jsp</location>
    </error-page>
    <!-- 按状态码处理 -->
    <error-page>
        <error-code>404</error-code>
        <location>/notFound.jsp</location>
    </error-page>
</web-app>

全局错误页面 (globalError.jsp)

1
2
3
4
5
6
7
8
9
10
11
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%>
<html>
<head>
    <title>全局错误页面</title>
</head>
<body>
    <h1>系统错误</h1>
    <p>异常信息:<%= exception.getMessage() %></p>
    <p>请联系管理员。</p>
</body>
</html>

404 页面 (notFound.jsp)

1
2
3
4
5
6
7
8
9
10
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>404 未找到</title>
</head>
<body>
    <h1>页面未找到</h1>
    <p>您请求的页面不存在!</p>
</body>
</html>

运行结果:

  • 抛出 NullPointerException 时跳转到 globalError.jsp
  • 访问不存在页面时显示 notFound.jsp

异常对象的常用方法

isErrorPage="true" 的页面中,JSP 提供隐式对象 exception(类型为 Throwable),常用方法包括:

  • getMessage():返回异常消息。
  • getClass().getName():返回异常类型。
  • printStackTrace():输出堆栈跟踪(调试用)。
  • toString():返回异常的字符串表示。

工作原理详解

  1. 页面级处理
  • JSP 编译为 Servlet 时,若发生异常且指定了 errorPage,则转发到错误页面。
  • 错误页面通过 exception 对象访问异常详情。
  1. 全局处理
  • Web 容器根据 web.xml 配置拦截异常或状态码。
  • 使用 RequestDispatcher 将请求转发到指定页面。
  1. 异常传递
  • 未处理异常会冒泡到容器,最终触发全局配置。

优点与应用场景

优点

  • 集中管理:全局配置统一处理异常。
  • 用户友好:自定义错误页面提升体验。
  • 灵活性:支持按类型或状态码分类处理。

应用场景

  • 处理运行时异常(如空指针、数组越界)。
  • 自定义 404、500 等错误页面。
  • 日志记录异常信息。

常见问题与注意事项

  1. 错误页面未生效
  • 检查 errorPageweb.xml 配置路径是否正确。
  • 确保错误页面在 WEB-INF 外可访问。
  1. 异常对象不可用
  • 仅在 isErrorPage="true" 的页面中可用。
  1. 编码问题
  • 确保所有 JSP 文件使用一致编码(如 UTF-8)。
  1. 性能影响
  • 避免在错误页面执行复杂逻辑,以免二次异常。
  1. 调试技巧
  • 在开发阶段保留堆栈跟踪,生产环境隐藏敏感信息。

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 工具支持

如果您需要更复杂的异常处理示例(例如结合日志框架),请告诉我,我会进一步扩展!