Руководство по Servlets. Исключения.

В данной статье мы рассмотрим исключения при работе с сервлетами.

При вызове исключения сервлетом, веб-контейнер начинает в файле web.xml поиск элементов исключений (error-page и exception-type).

Мы можем использовать, как уже имеющиеся исключения, так и создавать новые.

При работе с исключениями в сервлетах, имеет смысл помнить о следующих моментах:

  • Если есть ошибка со статусом 403 или 404, либо брошено ServletException или IOException, то должен быть вызван сервлет ErrorHandler.
  • Сервлет ErrorHandler определяется так же, как и другие сервлеты и конфигурируются в файле web.xml

Ниже приведен список атрибутов запросов, которые могут помочь нам определить причину исключения:

Атрибут и его описание
1  javax.servlet.error.message

Информация о сообщении, которое передаётся в исключении.

2  javax.servlet.error.status_code

Код статуса исключения

3 javax.servlet.error.exception_type

Тип исключения.

4 javax.servlet.error.request_uri

URL запроса, который вызвал ошибку.

5 javax.servlet.error.servlet_name

Имя сервлета, который обрабатывает исключение.

6   javax.servlet.error.exception

Информация о самом исключении.

Для понимания того, как это работает на практике, рассмотрим простой пример.

За основу возьмём данное приложение.

Класс ErrorDemo


package net.proselyte.servletstutorial;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Simple servlet that demonstrates Error handling.
 *
 * @author Eugene Suleimanov
 */

public class ErrorDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Integer code = (Integer) request.getAttribute("javax.servlet.error.status_code");
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();

        String title = "Error Handling";
        String docType = "<!DOCTYPE html>";

        writer.println(docType + "<html>" +
                "<head>" +
                "<title>" + title + "</title>" +
                "</head>" +
                "<body>");

        writer.println("<h1>Error information</h1>");
        writer.println("Code: " + code);

        writer.println("</body>");
        writer.println("</html>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Файл web.xml


<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Servlets Tutorial</display-name>

    <servlet>
        <servlet-name>SimpleServlet</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.SimpleServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>ErrorDemo</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.ErrorDemo</servlet-class>
    </servlet>


    <servlet-mapping>
        <servlet-name>SimpleServlet</servlet-name>
        <url-pattern>/SimpleServlet</url-pattern>
    </servlet-mapping>


    <servlet-mapping>
        <servlet-name>ErrorDemo</servlet-name>
        <url-pattern>/ErrorDemo</url-pattern>
    </servlet-mapping>

    <error-page>
        <error-code>404</error-code>
        <location>/ErrorDemo</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Error</exception-type>
        <location>/ErrorDemo</location>
    </error-page>

</web-app>

После этого выполним в консоли команду:


mvn tomcat7:run

И перейдём по ссылке


http://localhost:8088/blabla

В результате мы получим следующую страницу:

servletErrorDemo

На этом мы заканчиваем изучение обработки исключений при работе с сервлетами.

В следующей статье мы рассмотрим работу с фильтрами.