Servlet 异常处理是在Servlet执行过程中捕获和处理错误的技术,确保应用程序的健壮性和用户体验。本文将介绍Servlet中异常的类型、处理方法及实现方式。


目录

  1. 异常处理概述
  2. Servlet中的异常类型
  3. 异常处理方法
  4. 使用web.xml配置异常页面
  5. 完整示例
  6. 部署与测试
  7. 参考资料

1. 异常处理概述

  • 目的:捕获运行时错误(如参数缺失、数据库故障),提供友好的错误响应。
  • 方式
  • 在Servlet代码中手动处理。
  • 通过web.xml配置全局异常页面。
  • 重要性:避免直接暴露堆栈跟踪,增强安全性。

2. Servlet中的异常类型

  • ServletException:Servlet特定的异常,通常由初始化或请求处理失败引发。
  • IOException:输入输出操作(如写响应)失败时抛出。
  • 运行时异常:如 NullPointerExceptionNumberFormatException 等。
  • 自定义异常:开发者定义的业务异常。

3. 异常处理方法

在Servlet中处理

使用 try-catch 捕获异常:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        String num = request.getParameter("num");
        int value = Integer.parseInt(num); // 可能抛出NumberFormatException
        out.println("<h1>数字: " + value + "</h1>");
    } catch (NumberFormatException e) {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST, "请输入有效数字");
    }
}

抛出异常

让容器处理:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String num = request.getParameter("num");
    if (num == null) {
        throw new ServletException("缺少参数: num");
    }
    int value = Integer.parseInt(num);
    response.getWriter().println("<h1>数字: " + value + "</h1>");
}

4. 使用web.xml配置异常页面

全局异常处理通过 web.xml 配置错误页面。

配置示例

<web-app>
    <error-page>
        <error-code>400</error-code>
        <location>/error400.html</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/error404.html</location>
    </error-page>
    <error-page>
        <exception-type>javax.servlet.ServletException</exception-type>
        <location>/errorServlet.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/errorGeneral.jsp</location>
    </error-page>
</web-app>

错误页面示例:error400.html

<!DOCTYPE html>
<html>
<head><title>400 错误</title></head>
<body>
    <h1>400 - 请求错误</h1>
    <p>请检查您的输入。</p>
</body>
</html>

JSP错误页面:errorServlet.jsp

<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head><title>Servlet 异常</title></head>
<body>
    <h1>Servlet 异常</h1>
    <p>错误信息: <%= exception.getMessage() %></p>
</body>
</html>

5. 完整示例

以下是一个展示异常处理的Servlet。

Servlet:ErrorServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ErrorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String action = request.getParameter("action");
        try {
            if ("divide".equals(action)) {
                String num = request.getParameter("num");
                int value = 10 / Integer.parseInt(num); // 可能抛出异常
                out.println("<h1>结果: " + value + "</h1>");
            } else {
                out.println("<h1>欢迎使用</h1>");
            }
        } catch (NumberFormatException e) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "请输入有效数字");
        } catch (ArithmeticException e) {
            throw new ServletException("除以零错误");
        }
    }
}

配置:web.xml

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>ErrorServlet</servlet-name>
        <servlet-class>ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ErrorServlet</servlet-name>
        <url-pattern>/error</url-pattern>
    </servlet-mapping>

    <error-page>
        <error-code>400</error-code>
        <location>/error400.html</location>
    </error-page>
    <error-page>
        <exception-type>javax.servlet.ServletException</exception-type>
        <location>/errorServlet.jsp</location>
    </error-page>
</web-app>

HTML:index.html

<!DOCTYPE html>
<html>
<head><title>异常测试</title></head>
<body>
    <form method="GET" action="/myapp/error">
        数字: <input type="text" name="num"><br>
        <input type="hidden" name="action" value="divide">
        <input type="submit" value="除以10">
    </form>
</body>
</html>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar ErrorServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. index.htmlerror400.htmlerrorServlet.jsp 放入 myapp/
  3. 更新 web.xml
  4. 部署 myapp 到Tomcat的 webapps 目录。
  5. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/index.html
  • 输入“2”:显示“结果: 5”。
  • 输入“abc”:跳转到 error400.html
  • 输入“0”:跳转到 errorServlet.jsp,显示“除以零错误”。

7. 参考资料

出站链接

其他资源

  • 《Servlet Programming》 – 异常处理章节。
  • X社区:搜索 #ServletException 获取示例。

这篇指南展示了Servlet异常处理的多种方式。如果需要更复杂的内容(如日志记录异常或自定义异常类),请告诉我!