Servlet Обработка исключений

Когда Servlet генерирует исключение, Web-контейнер в [web.xml], который использует элемент exception-type,web.xmlищет конфигурацию, соответствующую типу сгенерированного исключения.

В web.xml необходимо использоватьerror-pageэлемент, чтобы указать, что для конкретногоисключенияили HTTPкода состояния,следует выполнить соответствующий вызов Servlet.

Конфигурация web.xml

Предположим, естьErrorHandlerServlet, который вызывается при возникновении любого определённого исключения или ошибки. Ниже будет запись, созданная в web.xml.

<!-- servlet 定义 -->
<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet 映射 -->
<servlet-mapping>
        <servlet-name>ErrorHandler</servlet-name>
        <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<!-- error-code 相关的错误页面 -->
<error-page>
    <error-code>404</error-code>
    <location>/ErrorHandler</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/ErrorHandler</location>
</error-page>

<!-- exception-type 相关的错误页面 -->
<error-page>
    <exception-type>
          javax.servlet.ServletException
    </exception-type >
    <location>/ErrorHandler</location>
</error-page>

<error-page>
    <exception-type>java.io.IOException</exception-type >
    <location>/ErrorHandler</location>
</error-page>

Если вы хотите универсальный обработчик ошибок для всех исключений, вам следует определить следующий error-page вместо определения отдельного элемента error-page для каждого исключения:

<error-page>
    <exception-type>java.lang.Throwable</exception-type >
    <location>/ErrorHandler</location>
</error-page>

Ниже приведены моменты, на которые следует обратить внимание, относительно обработки исключений в web.xml выше:

  • Сервлет ErrorHandler определяется так же, как другие сервлеты, и настраивается в web.xml.
  • Если возникает любой код состояния ошибки, будь то 404 (Не найдено) или 403 (Запрещено), будет вызван сервлет ErrorHandler.
  • Если Web-приложение выбрасываетServletExceptionилиIOException, то Web-контейнер вызовет сервлет ErrorHandler.
  • Вы можете определить различные обработчики ошибок для обработки разных типов ошибок или исключений. Приведённый выше пример очень универсален; мы надеемся, что вы сможете понять основные концепции на этом примере.

Атрибуты запроса - Ошибка/Исключение

Ниже приведён список атрибутов запроса, к которым может получить доступ сервлет обработки ошибок; они используются для анализа характера ошибки/исключения.

Нет.Атрибут & Описание
1javax.servlet.error.status_code
Этот атрибут предоставляет код состояния, который можно сохранить и проанализировать после сохранения в виде типа данных java.lang.Integer.
2javax.servlet.error.exception_type
Этот атрибут предоставляет информацию о типе исключения, которую можно сохранить и проанализировать после сохранения в виде типа данных java.lang.Class.
3javax.servlet.error.message
Этот атрибут предоставляет информацию о точном сообщении об ошибке, которую можно сохранить и проанализировать после сохранения в виде типа данных java.lang.String.
4javax.servlet.error.request_uri
Этот атрибут предоставляет информацию об URL, который вызвал сервлет, которую можно сохранить и проанализировать после сохранения в виде типа данных java.lang.String.
5javax.servlet.error.exception
Этот атрибут предоставляет информацию об исключении, которое было выброшено, которую можно сохранить и проанализировать после сохранения в виде типа данных java.lang.Throwable.
6javax.servlet.error.servlet_name
Этот атрибут предоставляет имя сервлета, которое можно сохранить и проанализировать после сохранения в виде типа данных java.lang.String.

Пример обработчика ошибок сервлета

Ниже приведён экземпляр сервлета, который будет действовать как обработчик ошибок для любых ошибок или исключений, которые вы определите.

Этот пример даёт базовое понимание обработки исключений в сервлетах, и вы можете использовать те же концепции для написания более сложных приложений обработки исключений:

//导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

//扩展 HttpServlet 类
public class ErrorHandler extends HttpServlet {

    // 处理 GET 方法请求的方法
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Throwable throwable = (Throwable)
        request.getAttribute("javax.servlet.error.exception");
        Integer statusCode = (Integer)
        request.getAttribute("javax.servlet.error.status_code");
        String servletName = (String)
        request.getAttribute("javax.servlet.error.servlet_name");
        if (servletName == null){
            servletName = "Unknown";
        }
        String requestUri = (String)
        request.getAttribute("javax.servlet.error.request_uri");
        if (requestUri == null){
            requestUri = "Unknown";
        }
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
    
        PrintWriter out = response.getWriter();
        String title = "Example Error/Exception 信息";
       
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
            "<html>\n" +
             "<head><title>" + title + "</title></head>\n" +
             "<body bgcolor=\"#F0F0F0\">\n");
           out.println("<h1>Example异常信息实例演示</h1>");
           if (throwable == null && statusCode == null){
              out.println("<h2>错误信息丢失</h2>");
              out.println("请返回 <a href=\"" + 
            response.encodeURL("http://localhost:8080/") + 
                "\">主页</a>。");
           }else if (statusCode != null) {
              out.println("错误代码 : " + statusCode);
        }else{
               out.println("<h2>错误信息</h2>");
              out.println("Servlet Name : " + servletName + 
                              "</br></br>");
              out.println("异常类型 : " + 
                              throwable.getClass( ).getName( ) + 
                              "</br></br>");
              out.println("请求 URI: " + requestUri + 
                              "<br><br>");
              out.println("异常信息: " + 
                                  throwable.getMessage( ));
           }
           out.println("</body>");
           out.println("</html>");
    }
    // 处理 POST 方法请求的方法
    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
       throws ServletException, IOException {
        doGet(request, response);
    }
}

Скомпилируйте обычным способомErrorHandler.java, поместите файлы классов в <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Давайте добавим следующую конфигурацию в web.xml для обработки исключений:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>com.example.test.ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
        <servlet-name>ErrorHandler</servlet-name>
        <url-pattern>/TomcatTest/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
    <error-code>404</error-code>
    <location>/TomcatTest/ErrorHandler</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type >
    <location>/ErrorHandler</location>
</error-page>
</web-app>  

Теперь попробуйте использовать сервлет, который вызовет исключение, или введите неправильный URL, что заставит веб-контейнер вызватьErrorHandlerсервлет и отобразить соответствующее сообщение. Например, если вы введете неправильный URL (например, http://localhost:8080/TomcatTest/UnKonwPage), отобразится следующий результат:

Другие расширения