从零开始学习Servlet(5):异常处理

Servlet异常处理

当Web应用程序抛出异常时,Web服务器会在web.xml中的元素中搜索与这个异常类型相匹配的配置,在元素中搜索与HTTP状态码匹配的配置。需要在web.xml中的中指定相应的Servlet来处理这些异常或HTTP状态码。用来处理这些异常的Servlet和其他Servlet定义方式一样,在web.xml中配置。

<!-- 定义servlet -->
 <servlet>
    <servlet-name>ExceptionHanderServlet</servlet-name>
    <servlet-class>ExceptionHandlerServlet</servlet-class>
  </servlet>

<!-- servlet 映射 -->
  <servlet-mapping>
    <servlet-name>ExceptionHandlerServlet</servlet-name>
    <url-pattern>/ExceptionHandlerSErvlet</url-pattern>
  </servlet-mapping>

  <!-- 指定ExceptionHandlerServlet来处理404状态码 -->
  <error-page>
    <error-code>404</error-code>
    <location>/ExceptionHandlerServlet</location>
  </error-page>

   <!-- 指定ExceptionHandlerServlet来处理ServletException -->
  <error-page>
    <exception-type>
        javax.servle.ServletException
    </exception-type>
    <location>/ExceptionHandlerServlet</location>
  </error-page>

  <!-- 指定ExceptionHandlerServlet来处理IOException -->
  <error-page>
    <exception-type>java.io.IOException</exception-type>
    <location>/ExceptionHandlerServlet</location>
  </error-page>

  <!-- 对所有异常统一处理  -->
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/ExceptionHandlerServlet</location>
  </error-page>

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 数据类型后可被分析。

实例

@WebServlet("/ErrorHandlerServlet")
public class ErrorHandlerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private String EXCEPTION = "javax.servlet.error.exception";
    private String STATUS_CODE = "javax.servlet.error.status_code";
    private String SERVLET_NAME = "javax.servlet.error.servlet_name";
    private String REQUEST_URI = "javax.servlet.error.request_uri";

    public ErrorHandlerServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Throwable exception = (Throwable) request.getAttribute(EXCEPTION);
        Integer statusCode = (Integer) request.getAttribute(STATUS_CODE);
        String servletName = (String) request.getAttribute(SERVLET_NAME);
        if (servletName == null) {
            servletName = "Unknown";
        }
        String requestUri = (String) request.getAttribute(REQUEST_URI);
        if (requestUri == null) {
            requestUri = "Unknown";
        }

        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter writer = response.getWriter();
        String title = "Exception Handler";
        String outStr = "<!DOCTYPE html>\n" + "<html>\n" + "<head><title>" + title + "</title></head>\n"
                + "<body bgcolor=\"#f0f0f0\">\n" + "<h1>处理异常demo"
                + ((exception == null && statusCode == null) ? ("<h2>错误信息丢失</h2>")
                        : ((statusCode != null) ? "错误代码-- : " + statusCode
                                : ("<h2>错误信息</h2>\n" + "Servlet Name : " + servletName + "<br><br>" + "Request Uri : "
                                        + requestUri + "<br><br>" + "异常信息  : " + exception.getMessage() + "<br><br>"))
                                        + "</body>" + "</html>");
        writer.println(outStr);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

启动服务器,执行servlet,然后输入错误的地址,即可看到对404错误的处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值