Jakarta EE Servlet异常处理

2025/04/07

1. 简介

在本教程中,我们将处理Jakarta EE Servlet应用程序中的异常-以便在发生错误时提供合理且预期的结果。

2. Jakarta EE Servlet异常

首先,我们将使用API注解定义一个Servlet(有关详细信息,请参阅Servlet简介),并使用一个将引发异常的默认GET处理器:

@WebServlet(urlPatterns = "/randomError")
public class RandomErrorServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        throw new IllegalStateException("Random error");
    }
}

3. 默认错误处理

现在让我们简单地将应用程序部署到Servlet容器中(我们假设应用程序在http://localhost:8080/jakarta-servlets下运行)。

当我们访问地址http://localhost:8080/jakarta-servlets/randomError时,我们将看到默认的Servlet错误处理:

默认错误处理由Servlet容器提供,可以在容器或应用程序级别进行定制。

4. 自定义错误处理

我们可以使用web.xml文件描述符定义自定义错误处理,其中我们可以定义以下类型的策略:

  • 状态码错误处理:它允许我们将HTTP错误码(客户端服务器)映射到静态HTML错误页面或错误处理Servlet
  • 异常类型错误处理:它允许我们将异常类型映射到静态HTML错误页面或错误处理Servlet

4.1 使用HTML页面处理状态码错误

我们可以在web.xml中为HTTP 404错误设置自定义错误处理策略:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <error-page>
        <error-code>404</error-code>
        <location>/error-404.html</location> <!-- /src/main/webapp/error-404.html-->
    </error-page>
</web-app>

现在,从浏览器访问http://localhost:8080/jakarta-servlets/invalid.html-获取静态HTML错误页面。

4.2 使用Servlet处理异常类型错误

我们可以在web.xml中为java.lang.Exception设置自定义错误处理策略:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/errorHandler</location>
    </error-page>
</web-app>

在ErrorHandlerServlet中,我们可以使用请求中提供的错误属性访问错误详细信息:

@WebServlet(urlPatterns = "/errorHandler")
public class ErrorHandlerServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html; charset=utf-8");
        try (PrintWriter writer = resp.getWriter()) {
            writer.write("<html><head><title>Error description</title></head><body>");
            writer.write("<h2>Error description</h2>");
            writer.write("<ul>");
            Arrays.asList(
                            ERROR_STATUS_CODE,
                            ERROR_EXCEPTION_TYPE,
                            ERROR_MESSAGE)
                    .forEach(e ->
                            writer.write("<li>" + e + ":" + req.getAttribute(e) + " </li>")
                    );
            writer.write("</ul>");
            writer.write("</html></body>");
        }
    }
}

现在,我们可以访问http://localhost:8080/jakarta-servlets/randomError来查看自定义错误Servlet的运行情况。

注意:我们在web.xml中定义的异常类型太广泛,我们应该更详细地指定我们想要处理的所有异常。

我们还可以使用ErrorHandlerServlet组件中容器提供的Servlet记录器来记录其他详细信息:

Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION);
if (IllegalArgumentException.class.isInstance(exception)) {
    getServletContext()
        .log("Error on an application argument", exception);
}

了解Servlet提供的日志记录机制之外的内容是很有价值的,请查看Slf4j指南了解更多详细信息。

5. 总结

在这篇简短的文章中,我们看到了Servlet应用程序中的默认错误处理和指定的自定义错误处理,无需添加外部组件或库。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章