Когда сервлет генерирует исключение, веб-контейнер выполняет поиск конфигураций в файле web.xml , в которых используется элемент типа исключения, для поиска соответствия с выброшенным типом исключения.
Вам придется использовать элемент error-page в web.xml, чтобы указать вызов сервлетов в ответ на определенные исключения или коды состояния HTTP.
Конфигурация web.xml
Учтите, у вас есть сервлет ErrorHandler, который будет вызываться всякий раз, когда есть какое-либо определенное исключение или ошибка. Ниже будет запись, созданная в web.xml.
<!-- servlet definition --> <servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet mappings --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <!-- error-code related error pages --> <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 related error pages --> <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> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
Ниже приведены замечания, которые необходимо отметить в отношении вышеупомянутого web.xml для обработки исключений.
-
Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.
-
Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.
-
Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.
-
Вы можете определить разные обработчики ошибок для обработки различных типов ошибок или исключений. Приведенный выше пример очень общий и надеюсь, что он послужит цели, чтобы объяснить вам основную концепцию.
Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.
Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.
Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.
Вы можете определить разные обработчики ошибок для обработки различных типов ошибок или исключений. Приведенный выше пример очень общий и надеюсь, что он послужит цели, чтобы объяснить вам основную концепцию.
Атрибуты запроса – ошибки / исключения
Ниже приведен список атрибутов запроса, к которым сервлет обработки ошибок может получить доступ для анализа природы ошибки / исключения.
Sr.No. | Атрибут и описание |
---|---|
1 |
javax.servlet.error.status_code Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer. |
2 |
javax.servlet.error.exception_type Этот атрибут предоставляет информацию о типе исключения, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Class. |
3 |
javax.servlet.error.message Этот атрибут дает информацию о точном сообщении об ошибке, которое может быть сохранено и проанализировано после сохранения в типе данных java.lang.String. |
4 |
javax.servlet.error.request_uri Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String. |
5 |
javax.servlet.error.exception Этот атрибут дает информацию о возникшем исключении, которая может быть сохранена и проанализирована. |
6 |
javax.servlet.error.servlet_name Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String. |
javax.servlet.error.status_code
Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer.
javax.servlet.error.exception_type
Этот атрибут предоставляет информацию о типе исключения, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Class.
javax.servlet.error.message
Этот атрибут дает информацию о точном сообщении об ошибке, которое может быть сохранено и проанализировано после сохранения в типе данных java.lang.String.
javax.servlet.error.request_uri
Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String.
javax.servlet.error.exception
Этот атрибут дает информацию о возникшем исключении, которая может быть сохранена и проанализирована.
javax.servlet.error.servlet_name
Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String.
Пример сервлета обработчика ошибок
Этот пример даст вам базовое понимание обработки исключений в сервлете, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию –
Этот пример даст вам базовое представление об обработке исключений в сервлете, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Extend HttpServlet class public class ErrorHandler extends HttpServlet { // Method to handle GET method request. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Analyze the servlet exception 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"; } // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Error/Exception Information"; String docType = "<!doctype html public "-//w3c//dtd html 4.0 " + "transitional//en">n"; out.println(docType + "<html>n" + "<head><title>" + title + "</title></head>n" + "<body bgcolor = "#f0f0f0">n"); if (throwable == null && statusCode == null) { out.println("<h2>Error information is missing</h2>"); out.println("Please return to the <a href="" + response.encodeURL("http://localhost:8080/") + "">Home Page</a>."); } else if (statusCode != null) { out.println("The status code : " + statusCode); } else { out.println("<h2>Error information</h2>"); out.println("Servlet Name : " + servletName + "</br></br>"); out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>"); out.println("The request URI: " + requestUri + "<br><br>"); out.println("The exception message: " + throwable.getMessage( )); } out.println("</body>"); out.println("</html>"); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Скомпилируйте ErrorHandler.java обычным способом и поместите ваш файл класса в / WebApps / ROOT / WEB-INF / классы.
Давайте добавим следующую конфигурацию в web.xml для обработки исключений:
<servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet mappings --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/ErrorHandler</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
Теперь попробуйте использовать сервлет, который вызывает любое исключение или вводит неправильный URL-адрес, это приведет к тому, что Web-контейнер вызовет сервлет ErrorHandler и отобразит соответствующее сообщение, как запрограммировано. Например, если вы введете неправильный URL-адрес, будет показан следующий результат:
The status code : 404
Приведенный выше код может не работать с некоторыми веб-браузерами. Так что попробуйте с Mozilla и Safari, и это должно работать.
Содержание
- Servlet – Exception Handling
- Important Points
- Сервлеты – обработка исключений
- Конфигурация web.xml
- Атрибуты запроса – ошибки / исключения
- Пример сервлета обработчика ошибок
- Servlet — Error Handling
- Request attributes related to error information
- Types of error a Servlet/Filter can throw
- Servlets — Exception Handling
- Learn Complete Java — Core Java, JSP & Servlets
- Servlets and JSP Tutorial For Beginners!
- JSP and Servlets — The Complete Course
- web.xml Configuration
- Request Attributes − Errors/Exceptions
- Error Handler Servlet Example
- Учебное пособие по исключениям и обработке ошибок сервлета
- Сервлет Исключение
- Ошибка сервлета
- Исключение сервлета и обработка ошибок
Servlet – Exception Handling
When a servlet throws an exception, the web container looks for a match with the thrown exception type in web.xml configurations that employ the exception-type element. To define the invocation of servlets in response to particular errors or HTTP status codes, you’d have to utilize the error-page element in web.xml.
Exception Handling is the process of transforming system error messages into user-friendly error messages.
- Programmatically exception handling technique: This method of managing exceptions in Java programming by using try and catch blocks are known as a programmatic exception handling mechanism.
- A mechanism for managing declarative exceptions: Declarative exception handling technique refers to the method of managing exceptions using XML elements in the web.xml file. If an error occurs in more than one servlet application, this method is handy.
Important Points
- If the web application throws a ServletException or an IOException, the web container calls the /ErrorHandler servlet.
- Different Error Handlers can be defined to handle different sorts of errors or exceptions.
- The ErrorHandler servlet is specified in the web.xml file and is defined in the same way as any other servlet.
- If an error with the status code 404INot Found) or 403 is encountered, the ErrorHandler servlet is invoked (Forbidden)
Request Attributes – Errors/Exception
Источник
Сервлеты – обработка исключений
Когда сервлет генерирует исключение, веб-контейнер выполняет поиск конфигураций в файле web.xml , в которых используется элемент типа исключения, для поиска соответствия с выброшенным типом исключения.
Вам придется использовать элемент error-page в web.xml, чтобы указать вызов сервлетов в ответ на определенные исключения или коды состояния HTTP.
Конфигурация web.xml
Учтите, у вас есть сервлет ErrorHandler, который будет вызываться всякий раз, когда есть какое-либо определенное исключение или ошибка. Ниже будет запись, созданная в web.xml.
Если вы хотите иметь универсальный обработчик ошибок для всех исключений, вам следует определить следующую страницу ошибок вместо определения отдельных элементов страницы ошибок для каждого исключения –
Ниже приведены замечания, которые необходимо отметить в отношении вышеупомянутого web.xml для обработки исключений.
Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.
Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.
Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.
Вы можете определить разные обработчики ошибок для обработки различных типов ошибок или исключений. Приведенный выше пример очень общий и надеюсь, что он послужит цели, чтобы объяснить вам основную концепцию.
Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.
Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.
Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.
Вы можете определить разные обработчики ошибок для обработки различных типов ошибок или исключений. Приведенный выше пример очень общий и надеюсь, что он послужит цели, чтобы объяснить вам основную концепцию.
Атрибуты запроса – ошибки / исключения
Ниже приведен список атрибутов запроса, к которым сервлет обработки ошибок может получить доступ для анализа природы ошибки / исключения.
Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer.
Этот атрибут предоставляет информацию о типе исключения, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Class.
Этот атрибут дает информацию о точном сообщении об ошибке, которое может быть сохранено и проанализировано после сохранения в типе данных java.lang.String.
Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String.
Этот атрибут дает информацию о возникшем исключении, которая может быть сохранена и проанализирована.
Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String.
Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer.
Этот атрибут предоставляет информацию о типе исключения, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Class.
Этот атрибут дает информацию о точном сообщении об ошибке, которое может быть сохранено и проанализировано после сохранения в типе данных java.lang.String.
Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String.
Этот атрибут дает информацию о возникшем исключении, которая может быть сохранена и проанализирована.
Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String.
Пример сервлета обработчика ошибок
Этот пример даст вам базовое понимание обработки исключений в сервлете, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию –
Этот пример даст вам базовое представление об обработке исключений в сервлете, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию:
Скомпилируйте ErrorHandler.java обычным способом и поместите ваш файл класса в / WebApps / ROOT / WEB-INF / классы.
Давайте добавим следующую конфигурацию в web.xml для обработки исключений:
Теперь попробуйте использовать сервлет, который вызывает любое исключение или вводит неправильный URL-адрес, это приведет к тому, что Web-контейнер вызовет сервлет ErrorHandler и отобразит соответствующее сообщение, как запрограммировано. Например, если вы введете неправильный URL-адрес, будет показан следующий результат:
Приведенный выше код может не работать с некоторыми веб-браузерами. Так что попробуйте с Mozilla и Safari, и это должно работать.
Источник
Servlet — Error Handling
A customized content can be returned to a Web client when a servlet generates an error. We can do that by adding elements in web.xml
The following table describes the elements we can use within an element.
Sr.No. | Атрибут и описание |
---|---|
1 |
A fully-qualified class name of a Java exception type, for example, java.lang.RuntimeException
The location of the resource to display in response to the error. For example, /myErrorPage.html . The location can be a Servlet or a JSP page as well.
When an error occurs, and are matched against the current error. On finding a match the request is redirected to the destination defined by .
If the destination is a servlet or a JSP page:
The original request and response objects are passed to the destination.
The request path and attributes are set as if a RequestDispatcher.forward to the error resource had been performed.
The request attributes are set with the followings.
Element | Required/ Optional |
Description |
---|---|---|
Optional | A valid HTTP error code, for example, 500 | |
Optional |
Request Attributes | Type |
---|---|
javax.servlet.error.status_code | java.lang.Integer |
javax.servlet.error.exception_type | java.lang.Class |
javax.servlet.error.message | java.lang.String |
javax.servlet.error.exception | java.lang.Throwable |
javax.servlet.error.request_uri | java.lang.String |
javax.servlet.error.servlet_name | java.lang.String |
Types of error a Servlet/Filter can throw
A servlet or filter may throw the following exceptions during processing of a request:
- Unchecked exceptions i.e. RuntimeException, Error and subclasses
- ServletException or subclasses
- IOExceptions or subclasses
All other exception should be wrapped in ServletException
Источник
Servlets — Exception Handling
Learn Complete Java — Core Java, JSP & Servlets
240 Lectures 30 hours
Servlets and JSP Tutorial For Beginners!
41 Lectures 4.5 hours
JSP and Servlets — The Complete Course
42 Lectures 5.5 hours
When a servlet throws an exception, the web container searches the configurations in web.xml that use the exception-type element for a match with the thrown exception type.
You would have to use the error-page element in web.xml to specify the invocation of servlets in response to certain exceptions or HTTP status codes.
web.xml Configuration
Consider, you have an ErrorHandler servlet which would be called whenever there is any defined exception or error. Following would be the entry created in web.xml.
If you want to have a generic Error Handler for all the exceptions then you should define following error-page instead of defining separate error-page elements for every exception −
Following are the points to be noted about above web.xml for Exception Handling −
The servlet ErrorHandler is defined in usual way as any other servlet and configured in web.xml.
If there is any error with status code either 404 (Not Found) or 403 (Forbidden ), then ErrorHandler servlet would be called.
If the web application throws either ServletException or IOException, then the web container invokes the /ErrorHandler servlet.
You can define different Error Handlers to handle different type of errors or exceptions. Above example is very much generic and hope it serve the purpose to explain you the basic concept.
Request Attributes − Errors/Exceptions
Following is the list of request attributes that an error-handling servlet can access to analyze the nature of error/exception.
This attribute give status code which can be stored and analyzed after storing in a java.lang.Integer data type.
This attribute gives information about exception type which can be stored and analysed after storing in a java.lang.Class data type.
This attribute gives information exact error message which can be stored and analyzed after storing in a java.lang.String data type.
This attribute gives information about URL calling the servlet and it can be stored and analysed after storing in a java.lang.String data type.
This attribute gives information about the exception raised, which can be stored and analysed.
This attribute gives servlet name which can be stored and analyzed after storing in a java.lang.String data type.
Error Handler Servlet Example
This example would give you basic understanding of Exception Handling in Servlet, but you can write more sophisticated filter applications using the same concept −
Compile ErrorHandler.java in usual way and put your class file in /webapps/ROOT/WEB-INF/classes.
Let us add the following configuration in web.xml to handle exceptions −
Now try to use a servlet which raise any exception or type a wrong URL, this would trigger Web Container to call ErrorHandler servlet and display an appropriate message as programmed. For example, if you type a wrong URL then it would display the following result −
The above code may not work with some web browsers. So try with Mozilla and Safari and it should work.
Источник
Учебное пособие по исключениям и обработке ошибок сервлета
Некоторое время назад я написал пост об обработке исключений в Java, но когда дело доходит до веб-приложения, нам нужно больше, чем обычная обработка исключений в Java.
Сервлет Исключение
Если вы заметили, что методы doGet () и doPost () ServletException и IOException , давайте посмотрим, что произойдет, когда мы выбросим эти исключения из нашего приложения. Я напишу простой сервлет, который выдаст исключение ServletException.
MyExceptionServlet.java
Теперь, когда мы вызываем этот сервлет через браузер методом GET, мы получаем ответ, как на картинке ниже.
Поскольку браузер понимает только HTML, когда наше приложение генерирует исключение, контейнер сервлета обрабатывает исключение и генерирует HTML-ответ. Эта логика специфична для контейнера сервлетов, я использую tomcat и получаю эту страницу с ошибкой, но если вы будете использовать некоторые другие серверы, такие как JBoss или Glassfish, вы можете получить другой HTML-ответ об ошибке.
Проблема с этим ответом заключается в том, что он не имеет значения для пользователя. Кроме того, он показывает пользователям наши классы приложений и информацию о сервере, что не имеет смысла для пользователя и не очень хорошо с точки зрения безопасности.
Ошибка сервлета
Я уверен, что вы, должно быть, увидели ошибку 404, когда пытались найти URL, который не существует. Давайте посмотрим, как наш контейнер сервлетов отвечает на ошибку 404. Если мы отправим запрос на неверный URL, мы получим ответ HTML, как показано на рисунке ниже.
Опять же, это общий HTML-код, сгенерированный сервером от нашего имени и не имеющий никакой ценности для пользователя.
Исключение сервлета и обработка ошибок
Servlet API обеспечивает поддержку настраиваемых сервлетов Exception и Error Handler, которые мы можем настроить в дескрипторе развертывания. Целью этих сервлетов является обработка Exception или Error, возникающих в приложении, и отправка HTML-ответа, который будет полезен для пользователя. Мы можем предоставить ссылку на домашнюю страницу приложения или некоторые детали, чтобы сообщить пользователю, что пошло не так.
Поэтому прежде всего нам нужно создать собственный сервлет Exception and Error Handler. У нас может быть несколько сервлетов обработки исключений и ошибок для приложения, но для простоты я создам один сервлет и использую его как для исключений, так и для ошибок.
Источник
Adblock
detector
Sr.No. | Attribute & Description |
---|---|
1 |
As of now, we have discussed Filter in Servlet. In this article, we will discuss an Exception in Servlet. As we know, Exception is an unwanted event that arises during the execution of a program, therefore these need to be handled in the program. So, In this article, we will discuss How Exception is handled in Servlet.
What is Exception in Servlet?
The Exception in Servlet is an abnormal condition that arises during the execution of a program that interrupts the normal flow of execution.
- Servlet provides support for Exception that is configured in the web.xml file of the application.
- The whole purpose of these is to handle the Exception and send a useful response to the user.
- Following is the web.xml file configuration for Exception Handling.
<!--Servlet--> <servlet> <servlet-name>ErrorHandle</servlet-name> <servlet-class>ErrorHandle</servlet-class> <servlet> <servlet-mapping> <servlet-name>ErrorHandle</servlet-name> <url-pattern>/ErrorHandle</url-pattern> </servlet-mapping> <!--Error code--> <error-page> <error-code>403</error-code> <location>/ErrorHandle</location> </error-page> <!--Exception type---> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/ErrorHandle</location> </error-page>
For generic Exception, We should define the following error-page instead of defining separate error-page elements.
<error-page> <exception-type>java.lang.Throwable</exception-type> <location>ErrorHandle</location> </error-page>
Request Attributes for Exception
- javax.servlet.error.status_code: This attribute gives us the status code.
- javax.servlet.error.exception_type: This attribute gives us the type of exception that occurred. As in the above web.xml file, the ServletException type is used.
- javax.servlet.error.message: This attribute gives us the exact error message.
- javax.servlet.error.request_uri: This attribute gives us the information on the URL calling the servlet.
- javax.servlet.error.exception: This attribute gives us the information of Exception raised.
- javax.servlet.error.servlet_name: This attribute gives us the servlet-name.
Let’s see the Example for Exception Handling in Servlet
In this example first, we will create a single servlet and web.xml file that will give you an understanding of attributes in Exception Handling.
Demo.java
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Demo */ @WebServlet("/Demo") public class Demo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Demo() { super(); // TODO Auto-generated constructor stub } protected 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"); PrintWriter out = response.getWriter(); String title = "Error/Exception Information"; String docType = "<!doctype html public "-//w3c//dtd html 4.0 " + "transitional//en">n"; out.println(docType + "<html>n" + "<head><title>" + title + "</title></head>n" + "<body bgcolor = "#f0f0f0">n"); if (throwable == null && statusCode == null) { out.println("<h2>Error info is missing</h2>"); out.println("Please return to the <a href="" + response.encodeURL("http://localhost:8088/") + "">Home Page</a>."); } else if (statusCode != null) { out.println("The status code : " + statusCode); } else { out.println("<h2>Error information</h2>"); out.println("Servlet Name : " + servletName + "</br></br>"); out.println("Exception Type : " + throwable.getClass().getName() + "</br></br>"); out.println("The request URI: " + requestUri + "<br><br>"); out.println("The exception message: " + throwable.getMessage()); } out.println("</body>"); out.println("</html>"); } }
Web.xml
<?xml version="1.0" encoding="UTF-8"?> <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_0.xsd" id="WebApp_ID" version="3.0"> <display-name>ExceptionHandlerDemo</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>Demo</servlet-name> <servlet-class>Demo</servlet-class> </servlet> <!-- servlet mappings --> <servlet-mapping> <servlet-name>Demo</servlet-name> <url-pattern>/Demo</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/Demo</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/Demo</location> </error-page> </web-app>
Output
In this, if you type the wrong URL. You will get the following output which means we have handled the Error 404 page.
Thus we have seen How to Handle Exception in Servlet. Let us see How to handle cookies in servlet in detail in the next article.
When a servlet throws an exception, the web container searches the configurations in web.xml that use the exception-type element for a match with the thrown exception type.
You would have to use the error-page element in web.xml to specify the invocation of servlets in response to certain exceptions or HTTP status codes.
web.xml Configuration
Consider, you have an ErrorHandler servlet which would be called whenever there is any defined exception or error. Following would be the entry created in web.xml.
<!-- servlet definition --> <servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet mappings --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <!-- error-code related error pages --> <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 related error pages --> <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>
If you want to have a generic Error Handler for all the exceptions then you should define following error-page instead of defining separate error-page elements for every exception −
<error-page> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
Following are the points to be noted about above web.xml for Exception Handling −
-
The servlet ErrorHandler is defined in usual way as any other servlet and configured in web.xml.
-
If there is any error with status code either 404 (Not Found) or 403 (Forbidden ), then ErrorHandler servlet would be called.
-
If the web application throws either ServletException or IOException, then the web container invokes the /ErrorHandler servlet.
-
You can define different Error Handlers to handle different type of errors or exceptions. Above example is very much generic and hope it serve the purpose to explain you the basic concept.
Request Attributes − Errors/Exceptions
Following is the list of request attributes that an error-handling servlet can access to analyze the nature of error/exception.
Sr.No. | Attribute & Description |
---|---|
1 |
javax.servlet.error.status_code This attribute give status code which can be stored and analyzed after storing in a java.lang.Integer data type. |
2 |
javax.servlet.error.exception_type This attribute gives information about exception type which can be stored and analysed after storing in a java.lang.Class data type. |
3 |
javax.servlet.error.message This attribute gives information exact error message which can be stored and analyzed after storing in a java.lang.String data type. |
4 |
javax.servlet.error.request_uri This attribute gives information about URL calling the servlet and it can be stored and analysed after storing in a java.lang.String data type. |
5 |
javax.servlet.error.exception This attribute gives information about the exception raised, which can be stored and analysed. |
6 |
javax.servlet.error.servlet_name This attribute gives servlet name which can be stored and analyzed after storing in a java.lang.String data type. |
Error Handler Servlet Example
This example would give you basic understanding of Exception Handling in Servlet, but you can write more sophisticated filter applications using the same concept −
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Extend HttpServlet class public class ErrorHandler extends HttpServlet { // Method to handle GET method request. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Analyze the servlet exception 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"; } // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Error/Exception Information"; String docType = "<!doctype html public "-//w3c//dtd html 4.0 " + "transitional//en">n"; out.println(docType + "<html>n" + "<head><title>" + title + "</title></head>n" + "<body bgcolor = "#f0f0f0">n"); if (throwable == null && statusCode == null) { out.println("<h2>Error information is missing</h2>"); out.println("Please return to the <a href="" + response.encodeURL("http://localhost:8080/") + "">Home Page</a>."); } else if (statusCode != null) { out.println("The status code : " + statusCode); } else { out.println("<h2>Error information</h2>"); out.println("Servlet Name : " + servletName + "</br></br>"); out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>"); out.println("The request URI: " + requestUri + "<br><br>"); out.println("The exception message: " + throwable.getMessage( )); } out.println("</body>"); out.println("</html>"); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Compile ErrorHandler.java in usual way and put your class file in /webapps/ROOT/WEB-INF/classes.
Let us add the following configuration in web.xml to handle exceptions −
<servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet mappings --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/ErrorHandler</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
Now try to use a servlet which raise any exception or type a wrong URL, this would trigger Web Container to call ErrorHandler servlet and display an appropriate message as programmed. For example, if you type a wrong URL then it would display the following result −
The status code : 404
The above code may not work with some web browsers. So try with Mozilla and Safari and it should work.
import
java.io.*;
import
java.util.*;
import
javax.servlet.*;
import
javax.servlet.http.*;
public
class
ExceptionHandler
extends
HttpServlet {
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"
);
PrintWriter out = response.getWriter();
String title =
"Error/Exception Information"
;
String docType
=
"<!doctype html public "-//w3c//dtd html 4.0 "
+
"transitional//en">n"
;
out.println(docType +
"<html>n"
+
"<head><title>"
+ title
+
"</title></head>n"
+
"<body bgcolor = "#f0f0f0">n"
);
if
(throwable ==
null
&& statusCode ==
null
) {
out.println(
"<h1>Error information not found</h1>"
);
out.println(
"Let's go back to <a href=""
+ response.encodeURL(
+
"">Home Page</a>."
);
}
else
if
(statusCode !=
null
) {
out.println(
"The status code of an error is : "
+ statusCode);
}
else
{
out.println(
"<h2>Error information</h2>"
);
out.println(
"Servlet Name : "
+ servletName
+
"</br></br>"
);
out.println(
"Exception Type : "
+ throwable.getClass().getName()
+
"</br></br>"
);
out.println(
"The request URI: "
+ requestUri
+
"<br><br>"
);
out.println(
"The exception message: "
+ throwable.getMessage());
}
out.println(
"</body>"
);
out.println(
"</html>"
);
}
public
void
doPost(HttpServletRequest request,
HttpServletResponse response)
throws
ServletException, IOException
{
doGet(request, response);
}
}
When a servlet generates an error developers can handle those exceptions in various ways, let’s say a user tries a URL
that does not map to a servlet the user typically gets a 404
page. With the error listing in the deployment descriptor, we can handle those exceptions. In this tutorial, we will see how to tackle these exception handling in the Servlet.
1. Introduction
An exception is an event, which occurs during the execution of a program, which disrupts the normal flow of the program’s instructions. The process of converting the system error messages into user-friendly error messages is known as Exception Handling.
- Programmatically exception handling mechanism: The approach to use try and catch block in the Java code to handle exceptions is known as programmatically exception handling mechanism
- Declarative exception handling mechanism: The approach to use the
XML
tags in theweb.xml
file to handle the exception is known as declarative exception handling mechanism. This mechanism is useful if exception is common for more than one servlet program
1.1 Servlet-Error Handling
A customized content can be returned to a web-client when a servlet generates an error. Developers can do that by adding the <error-page />
elements in the web.xml
. The following table describes the elements developers can define within an error-page element.
Element | Required or Optional | Description |
---|---|---|
<error-code> |
Optional | A valid HTTP error code. For e.g. 500 etc. |
<exception-type> |
Optional | A fully-qualified class name of a Java exception type. For e.g. java.lang.RuntimeException etc. |
<location> |
Required | The location of the resource which is displayed to the user in case of an error. For e.g. /myErrorPage.jsp etc. |
1.1.1 Request Attributes Related to Error Information
If the destination i.e. <location>
is a servlet or a JSP page:
- The original request and response objects are passed to the destination
- The request path and the attributes are set as if a
requestDispatcher.forward
to the error resource had been performed - The request attributes are set to the following:
Request Attributes Type javax.servlet.error.status_code
java.lang.Integer
javax.servlet.error.exception_type
java.lang.Class
javax.servlet.error.message
java.lang.String
javax.servlet.error.exception
java.lang.Throwable
javax.servlet.error.request_uri
java.lang.String
javax.servlet.error.servlet_name
java.lang.String
1.1.2 Types of Error a Servlet/Filter can Throw
A servlet or filter may throw the following exceptions during the processing of a request:
- Unchecked Exceptions i.e.
java.lang.RuntimeException
, Error, and subclasses javax.servlet.ServletException
or subclassesjava.io.IOException
or subclasses
Note: All other exceptions should be wrapped in javax.servlet.ServletException
.
2. Java Servlet Exception Handling Example
Here is a step-by-step guide for implementing the Servlet framework in Java.
2.1 Tools Used
We are using Eclipse Kepler SR2, JDK 8 and Maven. Having said that, we have tested the code against JDK 1.7 and it works well.
2.2 Project Structure
Firstly, let’s review the final project structure, in case you are confused about where you should create the corresponding files or folder later!
Fig. 1: Application Project Structure
2.3 Project Creation
This section will demonstrate on how to create a Java-based Maven project with Eclipse. In Eclipse Ide, go to File -> New -> Maven Project
.
Fig. 2: Create Maven Project
In the New Maven Project window, it will ask you to select project location. By default, ‘Use default workspace location’ will be selected. Just click on next button to proceed.
Fig. 3: Project Details
Select the ‘Maven Web App’ Archetype from the list of options and click next.
Fig. 4: Archetype Selection
It will ask you to ‘Enter the group and the artifact id for the project’. We will input the details as shown in the below image. The version number will be by default: 0.0.1-SNAPSHOT
.
Fig. 5: Archetype Parameters
Click on Finish and the creation of a maven project is completed. If you observe, it has downloaded the maven dependencies and a pom.xml
file will be created. It will have the following code:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>JavaServletExceptionHandlingEx</groupId> <artifactId>JavaServletExceptionHandlingEx</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> </project>
We can start adding the dependencies that developers want like Servlets, Junit etc. Let’s start building the application!
3. Application Building
Below are the steps involved in developing this application.
3.1 Maven Dependencies
Here, we specify the dependencies for the Servlet API. The rest dependencies will be automatically resolved by the Maven framework and the updated file will have the following code:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>JavaServletExceptionHandlingEx</groupId> <artifactId>JavaServletExceptionHandlingEx</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>JavaServletExceptionHandlingEx Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> </build> </project>
3.2 Java Class Creation
Let’s create the required Java files. Right-click on src/main/java
folder, New -> Package
.
Fig. 6: Java Package Creation
A new pop window will open where we will enter the package name as: com.jcg.servlet
.
Fig. 7: Java Package Name (com.jcg.servlet)
Once the package is created in the application, we will need to create the 2
different controller classes. Right-click on the newly created package: New -> Class
.
Fig. 8: Java Class Creation
A new pop window will open and enter the file name as: MyExceptionServlet
. The servlet controller class will be created inside the package: com.jcg.servlet
.
Fig. 9: Java Class (MyExceptionServlet.java)
Repeat the step (i.e. Fig. and enter the filename as: ErrorHandler
. The error handler class to read the cookies will be created inside the package: com.jcg.servlet
.
Fig. 10: Java Class (ErrorHandler.java)
3.2.1 Implementation of Servlet that Generates an Error
This servlet is used to throw an error to test the configuration. Let’s see the simple code snippet that follows this implementation.
MyExceptionServlet.java
package com.jcg.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/myExceptionServlet") public class MyExceptionServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { throw new ServletException("HTTP GET Method Is Not Supported."); } }
3.2.2 Implementation of Servlet Exception Handling
Developers will map this servlet in the servlet descriptor to handle all the exceptions. They can get the information about the exception that occurred from the request attributes. Let’s see the simple code snippet that follows this implementation.
ErrorHandler.java
package com.jcg.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/error") public class ErrorHandler extends HttpServlet { private static final long serialVersionUID = 1L; /***** This Method Is Called By The Servlet Container To Process A 'GET' Request *****/ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { handleRequest(request, response); } public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { /***** Analyze The Servlet Exception *****/ Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name"); Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception"); if (servletName == null) { servletName = "Unknown"; } String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri"); if (requestUri == null) { requestUri = "Unknown"; } /***** Set Response Content Type *****/ response.setContentType("text/html"); /***** Print The Response *****/ PrintWriter out = response.getWriter(); String title = "Error/Exception Information"; String docType = "<!DOCTYPE html>n"; out.println(docType + "<html>n" + "<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>" + title + "</title></head>n" + "<body>"); if (throwable == null && statusCode == null) { out.println("<h3>Error Information Is Missing</h3>"); } else if (statusCode != 500) { out.write("<h3>Error Details</h3>"); out.write("<ul><li><strong>Status Code</strong>?= "+ statusCode + "</li>"); out.write("<li><strong>Requested URI</strong>?= "+ requestUri + "</li></ul>"); } else { out.println("<h3>Exception Details</h3>"); out.println("<ul><li><strong>Servlet Name</strong>?= " + servletName + "</li>"); out.println("<li><strong>Exception Name</strong>?= " + throwable.getClass( ).getName( ) + "</li>"); out.println("<li><strong>Requested URI</strong>?= " + requestUri + "</li>"); out.println("<li><strong>Exception Message</strong>?= " + throwable.getMessage( ) + "</li></ul>"); } out.println("<div> </div>Click <a id="homeUrl" href="index.jsp">home</a>"); out.println("</body>n</html>"); out.close(); } }
3.3 Servlet Exception Handling in the Servlet Descriptor
Let’s see the simple code snippet to configure the exception handling in the servlet.
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Error/Exception Information</display-name> <!-- Error Code Related Error Pages --> <error-page> <error-code>404</error-code> <location>/error</location> </error-page> <error-page> <error-code>403</error-code> <location>/error</location> </error-page> <!-- Exception Type Related Error Pages --> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/error</location> </error-page> <error-page> <exception-type>java.io.IOException</exception-type> <location>/error</location> </error-page> </web-app>
4. Run the Application
As we are ready for all the changes, let us compile the project and deploy the application on the Tomcat7 server. To deploy the application on Tomat7, right-click on the project and navigate to Run as -> Run on Server
.
Fig. 11: How to Deploy Application on Tomcat
Tomcat will deploy the application in its web-apps folder and shall start its execution to deploy the project so that we can go ahead and test it in the browser.
5. Project Demo
Open your favorite browser and hit the following URL. The output page will be displayed.
http://localhost:8085/JavaServletExceptionHandlingEx/myExceptionServlet
Server name (localhost) and port (8085) may vary as per your Tomcat configuration. Developers can debug the example and see what happens after every step. Enjoy!
Fig. 12: 500 – Servlet That Generates an Error
If we will try to access an invalid URL that will result in 404
response, we will get a response like below image.
Fig. 13: 404 – Page Not Found
That’s all for this post. Happy Learning!!
6. Conclusion
In this section, developers learned how to tackle the Servlet 3.0
Exception Handling. Developers can download the sample application as an Eclipse project in the Downloads section. I hope this article served you with whatever developers were looking for.
7. Download the Eclipse Project
This was an example of Exception Handling in Servlets.
When a servlet generates an error developers can handle those exceptions in various ways. For example, when user tries a URL that does not map to a servlet the user typically gets a 404 page. With the error listing in the deployment descriptor, we can handle those exceptions. In this tutorial, we will handle these exceptions in the Servlet.
An exception is an event, which occurs during the execution of a program, which disrupts the normal flow of the program’s instructions. The process of converting the system error messages into user-friendly error messages is known as Exception Handling. There are two main mechanisms of exception handling in Java Web Application:
- Programmatically exception handling mechanism: When using try and catch block in the Java code (Servlet or Filter class) to handle exceptions.
- Declarative exception handling mechanism: When using the XML tags in the web.xml deployment descriptor file for web application to handle the exception. This mechanism is useful if exception is common for more than one servlet program.
Declarative exception handling mechanism
A customized content can be returned to a user when a servlet generates an error. Developers can do that by adding the <error-page /> elements in the web.xml. The following table describes the elements developers can define within an error-page element.
Element |
Required or Optional |
Description |
<error-code> |
Optional |
A valid HTTP error code. For e.g. 500 etc |
<exception-type> |
Optional |
A fully-qualified class name of a Java exception type |
<location> |
Required |
The location of the resource which is displayed to the user in case of an error. For e.g. /error.html , /error.jsp , /error |
Request Attributes Related to Error Information
If the destination in the <location> is a servlet or a JSP page:
- The original request and response objects are passed to the destination
- The request path and the attributes are set as if a forward to the error resource had been performed
- The following request attributes are set:
- javax.servlet.error.status_code of type java.lang.Integer.
- javax.servlet.error.exception_type of type java.lang.Class.
- javax.servlet.error.message of type java.lang.String.
- javax.servlet.error.exception of type java.lang.Throwable.
- javax.servlet.error.request_uri of type java.lang.String.
- javax.servlet.error.servlet_name of type java.lang.String.
Types of Error a Servlet/Filter can Throw
A servlet or filter may throw the following exceptions during the processing of a request:
- Unchecked Exceptions i.e. lang.RuntimeException, Error, and subclasses
- servlet.ServletException or subclasses
- io.IOExceptionor subclasses
Note: All other exceptions should be wrapped in javax.servlet.ServletException.
Web.xml tags for declaring error handling
<web-app ...> .... <error-page> <exception-type>java.lang.ArithmeticException</exception-type> <location>/errorHandler</location> </error-page> .... </web-app>
Servlet Class for handling exception
@WebServlet(name = "errorHandlerServlet", urlPatterns = {"/errorHandler"}, loadOnStartup = 1) public class ErrorHandlerServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); Exception exception = (Exception) req.getAttribute( "javax.servlet.error.exception"); writer.printf("exception: %s%n", exception); Class exceptionClass = (Class) req.getAttribute( "javax.servlet.error.exception_type"); writer.printf("exception_type: %s%n", exceptionClass); Integer code = (Integer) req.getAttribute( "javax.servlet.error.status_code"); writer.printf("status_code: %s%n", code); String errorMessage = (String) req.getAttribute( "javax.servlet.error.message"); writer.printf("message: %s%n", errorMessage); String requestUri = (String) req.getAttribute( "javax.servlet.error.request_uri"); resp.getWriter().printf("request_uri: %s%n", requestUri); String servletName = (String) req.getAttribute( "javax.servlet.error.servlet_name"); writer.printf("servlet_name: %s%n", servletName); } }
JSP page for handling exception
<%@page contentType="text/html" pageEncoding="UTF-8" errorPage="true"%> <!doctype html> <html> <head> ... </head> <body> <ul> <li>Exception: ${requestScope['javax.servlet.error.exception']}</li> <li>Exception type: ${requestScope['javax.servlet.error.exception_type']}</li> <li>Exception message: ${requestScope['javax.servlet.error.message']}</li> <li>Request URI: ${requestScope['javax.servlet.error.request_uri']}</li> <li>Servlet name: ${requestScope['javax.servlet.error.servlet_name']}</li> <li>Status code: ${requestScope['javax.servlet.error.status_code']}</li> </ul> </body> </html>