servlet_13 Servlet异常处理

来源:互联网 发布:苏57战斗机知乎 编辑:程序博客网 时间:2024/06/13 02:57

Servlet异常处理:

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

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>/ErrorHandle</location>    </error-page>

关于web.xml异常处理注意点:

1.Servlet ErrorHandle与其他的Servlet的定义方式一样,且在web.xml中配置

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

3.如果web应用程序抛出ServletException/IOException,则会调用ErrorHandle Servlet


请求属性-错误/异常:

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

1.javax.servlet.error.status_code
该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析

2.javax.servlet.error.exception_type
该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。

3.javax.servlet.error.exception
该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。

4.avax.servlet.error.message
该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。

5.javax.servlet.error.request_uri
该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。

6.javax.servlet.error.servlet_name
该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。


Servlet错误处理程序实例:

package MyServlet;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.io.IOException;/** * Created by 1192126986 on 2017/1/18. */@WebServlet(name = "ErrorHandle")//拓展HttpServlet类public class ErrorHandle extends HttpServlet {    //POST请求处理方法    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request,response);    }    //GET请求处理方法    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //请求属性表-错误/异常        //属性javax.servlet.error.exception:给出异常产生的信息,被存储在java.lang.Throwable数据类型可分析        Throwable throwable=(Throwable) request.getAttribute("javax.servlet.error.exception");        //属性javax.servlet.error.status_code:给出状态码,存储在java.lang.Integer数据类型后可分析        Integer status=(Integer) request.getAttribute("javax.servlet.error.status_code");        //属性javax.servlet.error.servlet_name:给出Servlet的名称,存储在java.lang.String数据类型后可分析        String servletName=(String)request.getAttribute("javax.servlet.error.servlet_name");        if(servletName==null){            servletName="Unknowed";        }        //属性javax.servlet.error.request_uri:给出有关URL调用Servlet的信息        String uri=(String)request.getAttribute("javax.servlet.error.request_uri");        if(uri==null){            uri="Unknowwed";        }        response.setContentType("text/html;charset=UTF-8");        PrintWriter out=response.getWriter();        String title = "菜鸟教程 Error/Exception 信息";        String docType = "<!DOCTYPE html>\n";        out.println(docType +                "<html>\n" +                "<head><title>" + title + "</title></head>\n" +                "<body bgcolor=\"#f0f0f0\">\n");        out.println("<h1>异常信息实例演示</h1>");        //标签<a>定义超链接,用于从一张页面链接到另一张页面 最重要的属性:href 值:url 描述:规定链接指向的页面的url        if(status==null && throwable==null){            out.println("<h2>错误信息丢失</h2>");            out.println("请返回 <a href=\"" +                    response.encodeURL("http://localhost:8080/") +                    "\">主页</a>。");        }else if(status!=null){            out.println("错误代码:"+status);        }else{            out.println("<h2>错误信息</h2>");            out.println("Servlet name"+servletName);            out.println("异常类型:"+throwable.getClass().getName());            out.println("异常信息:"+throwable.getMessage());            out.println("请求URI"+uri);        }        out.println("</body>");        out.println("</html>");    }}

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1"><!-- servlet定义 -->    <servlet>        <servlet-name>ErrorHandle</servlet-name>        <servlet-class>MyServlet.ErrorHandle</servlet-class>    </servlet><!-- servlet映射 -->    <servlet-mapping>        <servlet-name>ErrorHandle</servlet-name>        <url-pattern>/ErrorHandle</url-pattern>    </servlet-mapping><!-- error-code 状态代码相关的错误页面 -->    <error-page>        <error-code>404</error-code>        <location>/ErrorHandle</location>    </error-page><!-- exception type 异常类型相关的错误页面-->    <!-- 对所有的异常类型进行错误处理 -->    <error-page>        <exception-type>java.lang.Throwable</exception-type>        <location>/ErrorHandle</location>    </error-page></web-app>



1 0
原创粉丝点击