有时我写了一篇有关Java异常处理的文章,但是当涉及到Web应用程序时,我们需要的不仅仅是Java中的异常处理。

Servlet异常

如果您注意到,doGet()和doPost()方法将抛出ServletExceptionIOException ,那么让我们看看从应用程序中抛出这些异常时会发生什么。 我将编写一个简单的Servlet,它将抛出ServletException。

MyExceptionServlet.java

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.");}}

现在,当我们使用GET方法通过浏览器调用此servlet时,将得到如下图所示的响应。

由于浏览器仅了解HTML,因此当我们的应用程序引发异常时,servlet容器将处理该异常并生成HTML响应。 此逻辑特定于Servlet容器,我正在使用tomcat并获取此错误页面,但是如果您将使用其他服务器(如JBoss或Glassfish),则可能会收到不同的错误HTML响应。

此响应的问题在于它对用户没有任何价值。 它还向用户显示我们的应用程序类和服务器详细信息,这对用户没有意义,并且从安全角度来看也不是一件好事。

Servlet错误

我确定当您尝试访问不存在的URL时,您肯定已经看到404错误。 让我们看看我们的servlet容器如何响应404错误。 如果我们发送无效URL的请求,则会得到响应HTML,如下图所示。

同样,它是服务器代表我们生成的通用HTML,对用户几乎没有价值。

Servlet异常和错误处理

Servlet API支持可在部署描述符中配置的自定义Exception和Error Handler servlet,这些servlet的全部目的是处理应用程序引发的Exception或Error并发送对用户有用HTML响应。 我们可以提供指向应用程序主页的链接或一些详细信息,以使用户知道出了什么问题。

因此,首先我们需要创建一个自定义的Exception and Error Handler servlet。 我们可以为应用程序提供多个异常和错误处理程序servlet,但为简单起见,我将创建一个servlet,并将其用于异常和错误。

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 exceptionThrowable 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 typeresponse.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>");}
}

让我们看看如何在部署描述符中配置它,然后我们将了解它的实现及其工作方式。

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" 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元素为应用程序指定异常处理程序servlet非常容易。 每个错误页面元素应具有错误代码异常类型元素。 我们在location元素中定义异常处理程序servlet。

基于上面的配置,如果应用程序抛出404错误或ServletException,它将由AppExceptionHandler servlet处理。

当出现此类异常和错误情况时,servlet容器将调用Exception Handler servlet的相应HTTP方法,并传递请求和响应对象。 请注意,我已经提供了doGet()和doPost()方法的实现,以便它可以处理GET和POST请求并使用通用方法来处理它们。

在servlet容器调用servlet来处理异常之前,它会在请求中设置一些属性以获取有关异常的有用信息,其中一些是javax.servlet.error.exceptionjavax.servlet.error.status_codejavax.servlet。 error.servlet_namejavax.servlet.error.request_uri

作为例外,状态代码始终为500,与“内部服务器错误”相对应,对于其他类型的错误,我们将获得不同的错误代码,例如404、403等。

使用状态代码,我们的实现将不同类型HTML响应呈现给用户。 它还提供了到应用程序主页的超链接。

现在,当我们点击抛出ServletException的servlet时,我们将得到如下图所示的响应。

如果我们尝试访问一个无效的URL,这将导致404响应,我们将得到如下图所示的响应。

它看起来不是很好,并且可以帮助用户轻松地了解发生了什么并为他们提供前往正确位置的方法。 它还避免将应用程序敏感信息发送给用户。 我们应该始终为我们的Web应用程序配备适当的异常处理程序。

如果要在单个异常处理程序中处理运行时异常和所有其他异常,则可以将异常类型提供为Throwable。

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

如果有多个错误页面条目,那么假设一个用于Throwable,一个用于IOException,并且应用程序抛出FileNotFoundException,则它将由IOException的错误处理程序处理。

您还可以将JSP页面用作异常处理程序,仅提供jsp文件的位置而不是servlet映射。

这就是Web应用程序中异常处理的全部,希望您喜欢它。

  • 下载ServletExceptionHandling项目
参考:我们的JCG合作伙伴 Pankaj Kumar在Developer Recipes博客上的Servlet异常和错误处理示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/servlet-exception-and-error-handling-example-tutorial.html

Servlet异常和错误处理示例教程相关推荐

  1. servlet 异常处理_Servlet异常和错误处理示例教程

    servlet 异常处理 有时候我写了一篇有关Java异常处理的文章,但是当涉及到Web应用程序时,我们需要的不仅仅是Java中的异常处理. Servlet异常 如果您注意到,doGet()和doPo ...

  2. jsf入门实例_JSF错误消息示例教程

    jsf入门实例 In this section, we will see how to use the default JSF validators to shoot out the built in ...

  3. ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...

  4. Hibernate Tomcat JNDI DataSource示例教程

    Hibernate Tomcat JNDI DataSource示例教程 欢迎来到Hibernate Tomcat JNDI DataSource示例教程.我们已经看到如何在独立的Java应用程序中使 ...

  5. Hibernate Tomcat JNDI数据源示例教程

    Welcome to the Hibernate Tomcat JNDI DataSource example tutorial. We have already seen how to use Hi ...

  6. log4j 配置文件示例_Log4j2示例教程–配置,级别,附加程序

    log4j 配置文件示例 Welcome to the Apache Log4j2 Example Tutorial. If you ask an expert developer about the ...

  7. primefaces教程_Primefaces AjaxBehavior和AjaxExceptionHandler组件示例教程

    primefaces教程 Different tutorials were provided here have introduced various Primefaces components an ...

  8. python错误-python异常与错误区别

    错误和异常概念 错误: 1.语法错误:代码不符合解释器或者编译器语法 2.逻辑错误:不完整或者不合法输入或者计算出现问题 异常:执行过程中出现万体导致程序无法执行 1.程序遇到逻辑或者算法问题 2.运 ...

  9. java 观察者模式示例_Java中的观察者设计模式-示例教程

    java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...

最新文章

  1. 基于机器视觉的智能人机交互技术
  2. matlab系统的根轨迹,实验五 利用MATLAB绘制系统根轨迹
  3. 【腾讯Bugly干货分享】经典随机Crash之二:Android消息机制
  4. 谈谈MySQL的异常处理
  5. VS2017报错头文件unistd.h
  6. 盘点阿里程序员常用的 15 款开发者工具
  7. CSS3 nth 伪类选择器
  8. nodejs+redis
  9. ElasticSearch下载安装启动详细图解
  10. 数据倾斜原理及解决方案
  11. 改变kingcms默认拼音路径格式/修改kingcms拼音路径
  12. 【转】selenium之 定位以及切换frame
  13. 爬虫实例4 爬取网络小说
  14. 51单片机学习1-8
  15. 【金三银四】MySQL优化面试题(2021最新版)
  16. Tableau自定义调色板
  17. Python 列表与元组
  18. 2019牛客暑期多校训练营(第八场)B.Beauty Values
  19. luci网页shell_Luci框架-LUA的一个web框架使用
  20. 李白打酒*C语言简易版(递归)

热门文章

  1. JAVA代码实现按列表中元素的时间字段排序
  2. python setup.py 指定文件到指定路径_linux下python安装到指定目录
  3. pythondocx模板_使用python-docx-template修改word文档
  4. java.util.concurrent.locks.Condition文档说明
  5. 动态创建标记+css_dom+js动态效果
  6. Quartz定时任务的基本搭建
  7. 快慢指针:141. 环形链表(判断是否存在环路)
  8. selenium编写脚本_Selenium脚本编写技巧和窍门
  9. drools dmn_Drools DMN最新开源引擎性能改进
  10. java事件处理过程分布写_Java 9中的进程处理