zoukankan      html  css  js  c++  java
  • Servlet 异常处理

    当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置。您必须在 web.xml 中使用 error-page 元素来指定对特定异常 或 HTTP 状态码 作出相应的 Servlet 调用。

    web.xml 配置

    假设,有一个 ErrorHandler 的 Servelt 在任何已定义的异常或错误出现时被调用。以下将是在 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 异常处理要注意的点:

    • Servelt ErrorHandler 与其他的 Servelt 的定义方式一样,且在 web.xml 中进行配置。
    • 如果有错误状态代码出现,不管为 404(Not Found 未找到)或 403(Forbidden 禁止),则会调用 ErrorHandler 的 Servlet。
    • 如果 Web 应用程序抛出 ServletException 或 IOException,那么 Web 容器会调用 ErrorHandler 的 Servlet。
    • 您可以定义不同的错误处理程序来处理不同类型的错误或异常。上面的实例是非常通用的,希望您能通过实例理解基本的概念。

    请求属性 - 错误/异常

    以下是错误处理的 Servlet 可以访问的请求属性列表,用来分析错误/异常的性质。

    Servlet 错误处理程序实例

    以下是 Servlet 实例,将应对任何您所定义的错误或异常发生时的错误处理程序。

    本实例让您对 Servlet 中的异常处理有基本的了解,您可以使用相同的概念编写更复杂的异常处理应用程序:

    // 导入必需的 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
      {
          // 分析 Servlet 异常       
          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">
    ";
          out.println(docType +
            "<html>
    " +
            "<head><title>" + title + "</title></head>
    " +
            "<body bgcolor="#f0f0f0">
    ");
    
          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>");
      }
      // 处理 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 文件中添加如下配置来处理异常:

    <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>

     

    有时候配置error-page不起作用:

    例如:

    <error-page> 
        <exception-type>Java.lang.Exception</exception-type> 
        <location>/err/error.jsp</location> 
    </error-page> 

    制造空指针异常,启动tomcat服务器发现并不能跳转到error.jsp,而是跳转到IE的错误提示页面 

    解决方案: 
    1.在IE【工具】->【Internet选项】->【高级】中勾掉【显示友好http错误提示】; 
    2.确保error.jsp的大小>1024字节。 

    3. 设置指定错误页页状态为正常,来告诉IE这不是一个服务器错误, 从而不显示IE的自定义错误页  

    response.setStatus(200); 
  • 相关阅读:
    分布式任务调度 xxl-job
    【线上】 select * from xxoo where 1=1应用挂掉
    【死磕ES】七、基础检索
    【死磕ES】四、基本操作
    【死磕ES】三、基本概念
    【死磕ES】二、搭建环境
    Mac共享文件夹
    微信小程序下拉刷新,上拉加载
    微信小程序textarea输入框出现[object Object]
    微信小程序official-account的使用
  • 原文地址:https://www.cnblogs.com/caoyc/p/5563652.html
Copyright © 2011-2022 走看看