Servlet异常处理小结

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

1、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 异常处理要注意的点:

(1)Servlet ErrorHandler与其他的Servlet 的定义方式一样,且在 web.xml 中进行配置。

(2)如果有错误状态代码出现,不管为404(Not Found未找到)或 403(Forbidden禁止),则会调用ErrorHandler的Servlet。

(3)如果Web应用程序抛出ServletException或IOException,那么Web容器会调用ErrorHandler的Servlet。

(4)您可以定义不同的错误处理程序来处理不同类型的错误或异常。上面的实例是非常通用的,希望您能通过实例理解基本的概念。

2、请求属性

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

属性
描述
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 调用 Servlet 的信息,信息可被存储,并在存储为java.lang.String 数据类型后可被分析。
javax.servlet.error.exception该属性给出异常产生的信息,信息可被存储,并在存储为java.lang.Throwable数据类型后可被分析。
javax.servlet.error.servlet_name该属性给出 Servlet 的名称,名称可被存储,并在存储为java.lang.String数据类型后可被分析。

3、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\">\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 class="tutheader">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);
  }
}

让我们在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>

现在,尝试使用一个会产生异常的Servlet,或者输入一个错误的URL,这将触发Web容器调用ErrorHandler的 Servlet,并显示适当的消息。例如,如果您输入了一个错误的URL,那么它将显示下面的结果:The status code : 404

参考资料:

本文标题:Servlet异常处理小结

本文链接:http://yedward.net/?id=266

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章