servlet_13 Servlet异常处理

本文介绍如何在Servlet中配置异常处理程序,通过web.xml文件定义错误页面和异常类型映射,实现针对不同异常和HTTP状态码的统一错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值