Учебное пособие по исключению сервлета и обработке ошибок
Сегодня мы рассмотрим исключения сервлетов и обработку ошибок. Некоторое время назад я написал пост об обработке исключений в Java, но когда дело доходит до веб-приложения, нам нужно нечто большее, чем обычная обработка исключений в Java.
Исключение сервлета
Если вы заметили, что методы doGet() и doPost() генерируют javax.servlet.ServletException
и IOException
, давайте посмотрим, что происходит, когда мы генерируем эти исключения из нашего приложения. Я напишу простой сервлет, который вызовет исключение ServletException.
package com.journaldev.servlet.exception;
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;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
throw new ServletException("GET method is not supported.");
}
}
Ошибка сервлета
Исключение сервлета и обработка ошибок
Servlet API обеспечивает поддержку пользовательских сервлетов Exception и Error Handler, которые мы можем настроить в дескрипторе развертывания. Вся цель этих сервлетов состоит в том, чтобы обработать исключение или ошибку, вызванную приложением, и отправить полезный HTML-ответ пользователю. Мы можем предоставить ссылку на домашнюю страницу приложения или некоторые подробности, чтобы пользователь знал, что пошло не так. Итак, прежде всего нам нужно создать собственный сервлет обработчика исключений и ошибок. У нас может быть несколько сервлетов для обработки исключений и ошибок для приложения, но для простоты я создам один сервлет и буду использовать его как для исключений, так и для ошибок. AppExceptionHandler.java
package com.journaldev.servlet.exception;
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("/AppExceptionHandler")
public class AppExceptionHandler extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processError(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processError(request, response);
}
private void processError(HttpServletRequest request,
HttpServletResponse response) throws 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();
out.write("<html><head><title>Exception/Error Details</title></head><body>");
if(statusCode != 500){
out.write("<h3>Error Details</h3>");
out.write("<strong>Status Code</strong>:"+statusCode+"<br>");
out.write("<strong>Requested URI</strong>:"+requestUri);
}else{
out.write("<h3>Exception Details</h3>");
out.write("<ul><li>Servlet Name:"+servletName+"</li>");
out.write("<li>Exception Name:"+throwable.getClass().getName()+"</li>");
out.write("<li>Requested URI:"+requestUri+"</li>");
out.write("<li>Exception Message:"+throwable.getMessage()+"</li>");
out.write("</ul>");
}
out.write("<br><br>");
out.write("<a href=\"index.html\">Home Page</a>");
out.write("</body></html>");
}
}
Давайте посмотрим, как мы можем настроить его в дескрипторе развертывания, а затем поймем его реализацию и то, как он работает.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>ServletExceptionHandling</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/AppExceptionHandler</location>
</error-page>
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/AppExceptionHandler</location>
</error-page>
</web-app>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/AppExceptionHandler</location>
</error-page>
Если есть несколько записей страницы ошибок, скажем, одна для Throwable и одна для IOException, и приложение выдает исключение FileNotFoundException, тогда оно будет обработано обработчиком ошибок IOException. Вы также можете использовать страницу JSP в качестве обработчика исключений, просто укажите местоположение файла jsp, а не отображение сервлета. Это все, что касается обработки исключений сервлетов в веб-приложении, надеюсь, вам понравилось.
Скачать пример проекта обработки исключений сервлета
Ознакомьтесь с другими статьями из этой серии:
- Веб-приложение Java
- Учебное пособие по сервлетам Java
- Управление сеансами в Java
- Фильтр сервлетов
- Прослушиватели сервлетов
- Файлы cookie в сервлетах
- Пример загрузки и скачивания файла сервлета