一 声明式异常处理
 
在web.xml中对声明对各种异常的处理方法。
通过 <error-page>元素来声明。 此元素的结构如下:
 
                 +------<error-code> or <exception-type>
                 |
<error-page> ----+
                 |
                 +------<location>
 
 
1 HTTP错误代码的处理
     4**代码表示客户端错误:请求有语法错误或者请求无法实现。
     5**代码表示服务器端错误:服务器未能实现合法的请求。
 
例:为404错误指定相应的错误处理页面
    在web.xml中
 
  1. <error-page>
  2. <error-code>404</error-code>
  3. <location>/FileNotFound.html</location>
  4. </error-page>
    编写FileNotFound.html
  
同时 也可以编写一个专门处理HTTP错误代码的HttpErrorHandlerServlet类来进行响应
  1. package servlet;
  2. import java.io.PrintWriter;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class HttpErrorHandlerServlet extends HttpServlet
  8. {
  9. protected void service(HttpServletRequest req, HttpServletResponse resp)
  10. throws ServletException, java.io.IOException
  11. {
  12. resp.setContentType("text/html;charset=GB2312");
  13. PrintWriter out = resp.getWriter();
  14. Integer status_code=(Integer)req.getAttribute("javax.servlet.error.status_code");
  15. out.println("<html><head><title>错误页面</title></head>");
  16. out.println("<body>");
  17. //如果你的JDK版本低于1.5,那么你应该按照如下方式调用
  18. //int status=status_code.intValue();
  19. //switch(status){...}
  20. switch(status_code)
  21. {
  22. case 401:
  23. break;
  24. case 404:
  25. out.println("<h2>HTTP状态代码:"+status_code+"</h2>");
  26. out.println("你所访问页面并不存在,或者已经被移动到其它位置。");
  27. out.println("

    如有其它问题,请<a href=mailto:admin@sunxin.org>联系管理员</a>。");

  28. break;
  29. default:
  30. break;
  31. }
  32. out.println("</body></html>");
  33. out.close();
  34. }
  35. }
 
重写HttpServlet类的service()方法。调用请求对象getAttribute()方法得到javax.servlet.error.status_code属性的值,当发生HTTP错误的时候,
Servlet容器会自动将HTTP的错误代码作为javax.servlet.error.status_code
属性的值,保存在请求的对象中。
部署好这个servlet。location修改为servlet的location
 
2  Java异常的处理
 
例:一个Servlet从文件中读取配置信息,如果文件不存在的,就会抛出java.io.FileNotFoundException异常。
 
====第一步:FileExceptionServlet.java
  1. package org.sunxin.ch06.servlet;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.util.Properties;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class FileExceptionServlet extends HttpServlet
  10. {
  11. public void doGet(HttpServletRequest req, HttpServletResponse resp)
  12. throws ServletException,IOException
  13. {
  14. FileInputStream fis=new FileInputStream("config.inc");
  15. Properties pps=new Properties();
  16. pps.load(fis);
  17. //读取属性的代码,省略。
  18. fis.close();
  19. }
  20. }
如果找不到config.inc文件,FileExceptionServlet就会抛出java.io.FileNotFoundException异常
 
========第二步:异常处理Servlet类。ExceptionHandlerServlet.java
 
  1. package servlet;
  2. import java.io.PrintWriter;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class ExceptionHandlerServlet2 extends HttpServlet
  8. {
  9. protected void service(HttpServletRequest req, HttpServletResponse resp)
  10. throws ServletException, java.io.IOException
  11. {
  12. resp.setContentType("text/html;charset=GB2312");
  13. PrintWriter out = resp.getWriter();
  14. out.println("<html><head><title>错误页面</title></head>");
  15. out.println("<body>");
  16. String uri=(String)req.getAttribute("javax.servlet.error.request_uri");
  17. Object excep=req.getAttribute("javax.servlet.error.exception");
  18. out.println(uri+" 运行错误。");
  19. out.println("<p>错误原因:"+excep);
  20. out.println("</body></html>");
  21. out.close();
  22. }
  23. }
========第三步:web.xml文件中声明Servlet
  1. <error-page>
  2. <exception-type>java.io.FileNotFoundException</exception-type>
  3. <location>/ExcepHandler</location>
  4. </error-page>
 
<exception-type>子元素指定了Java异常类的名字
<locaiton>子元素指定了对异常处理的Servlet类
 
 
二 程序式异常处理
程序式异常处理就是在Web程序中利用try-catch语句进行捕获异常,并对捕获异常进行响应的处理。
 
1  在try-catch语句中处理异常
  1. catch(SQLException se)
  2. {
  3. getServletContext().log("ServletContext.log(): 数据库操作失败!"+
  4. se.toString());
  5. log("GenericServlet.log(): 数据库操作失败!"+se.toString());
  6. resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
  7. "数据库操作出现问题,请联系管理员。");
  8. }
 
[1]  捕捉到异常时,分别用ServletContext接口的log()方法和GenericServlet抽象类的log()方法记录数据库操作失败的原因。
区别:
如果调用GenericServlet类的log()方法 它会在日志消息的前面加上Servlet的名字
而调用ServletContext接口的log()方法 则只记录消息本身
这两个log()方法会把日志信息写入到日志文件中。 在tomcat6 产生的日志文件名以及文件存放的位置是
%CATALINA_HOME%\logs\localhost.当前日期.log。
[2]  调用响应对象的sendError()方法发送HTTP错误代码,Servlet容器会发送一个包含了这些信息的错误页面到浏览器
 
2  使用RequestDispatcher来处理异常
 
产生异常的Servlet
  1. try
  2. {
  3. int a=5;
  4. int b=0;
  5. int c=a/b;
  6. }
  7. catch(ArithmeticException ae)
  8. {
  9. req.setAttribute("javax.servlet.error.exception",ae);
  10. req.setAttribute("javax.servlet.error.request_uri",req.getRequestURI());
  11. RequestDispatcher rd=req.getRequestDispatcher("ExcepHandler2");
  12. rd.forward(req,resp);
  13. }

处理异常的Servlet

  1. package servlet;
  2. import java.io.PrintWriter;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class ExceptionHandlerServlet2 extends HttpServlet
  8. {
  9. protected void service(HttpServletRequest req, HttpServletResponse resp)
  10. throws ServletException, java.io.IOException
  11. {
  12. resp.setContentType("text/html;charset=GB2312");
  13. PrintWriter out = resp.getWriter();
  14. out.println("<html><head><title>错误页面</title></head>");
  15. out.println("<body>");
  16. String uri=(String)req.getAttribute("javax.servlet.error.request_uri");
  17. Object excep=req.getAttribute("javax.servlet.error.exception");
  18. out.println(uri+" 运行错误。");
  19. out.println("<p>错误原因:"+excep);
  20. out.println("</body></html>");
  21. out.close();
  22. }
  23. }

说明:

[1]  将异常对象和抛出异常的servlet的位置作为HttpServletRequest对象的属性保存到请求对象中。

[2]  通过请求对象的getRequestDispatcher()方法得到RequestDispatcher对象 调用RequestDispatcher对象的forward()方法将请求转发给 ExcepHandler2

[3]  ExcepHandler2可以从请求对象中取出javax.servlet.error.exception和javax.servlet.error.request_uri属性

Servlet的异常处理机制的更多相关文章

  1. JSP的执行过程及其异常处理机制

    1.JSP的执行过程     虽然JSP感觉上很像一般的HTML网页,但事实上它是以Servlet的形式被运行的.因为JSP文件在第一次运行的时候会先解释成Servlet源文件,然后编译成Servle ...

  2. SpringMVC异常处理机制

    SpringMVC异常处理机制 springMVC会将所有在doDispatch方法中的异常捕获,然后处理.无法处理的异常会抛出给容器处理. 在doDispatch()中调用processDispat ...

  3. Atititjs javascript异常处理机制与java异常的转换.js exception process

    Atititjs javascript异常处理机制与java异常的转换.js exception process 1. javascript异常处理机制 Throw str Not throw err ...

  4. Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae

    Atitit.js javascript异常处理机制与java异常的转换.js exception processVoae 1. 1. javascript异常处理机制 1 2. 2. Web前后台异 ...

  5. 分享知识-快乐自己:Spring中的(三种)异常处理机制

    案例目录结构: Web.xml 配置: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application ...

  6. Atititjs javascript异常处理机制java异常转换.js exception process

    Atititjs javascript异常处理机制java异常的转换.js exception process 1. javascript异常处理机制 Throw str Not throw erro ...

  7. Spring MVC—拦截器,文件上传,中文乱码处理,Rest风格,异常处理机制

    拦截器 文件上传 -中文乱码解决 rest风格 异常处理机制 拦截器 Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerI ...

  8. Java异常处理机制 try-catch-finally 剖析

    Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...

  9. JAVA 异常处理机制

    主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...

随机推荐

  1. python单元测试-unittest

    python内部自带了一个单元测试的模块,pyUnit也就是我们说的:unittest 1.介绍下unittest的基本使用方法: 1)import unittest 2)定义一个继承自unittes ...

  2. 【Linux端口大全】

    2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发生器 20端口 ...

  3. yum配置中driver-class-name: com.mysql.jdbc.Driver报错

    错误: 原因: 解决方法:把方框中的<scope>runtime</scope>删掉

  4. comm---两个文件之间的比较

    comm命令可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.以及差集操作. 交集:打印出两个文件所共有的行. 求差:打印出指定文件所包含的且不相同的行. 差集:打印出包含 ...

  5. 紫书 习题 10-17 UVa 11105 (筛法)

    类似于素数筛的思想去做,不然暴力会超时而且还要判重 #include<cstdio> #include<cstring> #include<vector> #def ...

  6. Jsp学习总结(1)——JSP九大内置对象和四种属性范围解读

    一.四种属性范围 1.1.在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效 request:在一次服务请求范围内,服务器跳转后依然有效 session:-在一次会话范围内 ...

  7. centos下安装redis/mysql等基础环境

    1.修改语言 阿里云的ECS默认语言是:en_US.UTF-8,需要改成zh_CN.UTF-8 修改方法:vim /etc/locale.conf,然后重启. 查看方法:echo $LANG 2.安装 ...

  8. Qt Quick 之 PathView 具体解释

    PathView ,顾名思义,沿着特定的路径显示 Model 内的数据. Model 能够是 QML 内建的 ListModel . XmlListModel ,也能够是在 C++ 中实现的 QAbs ...

  9. 百度地图ios环境配置

    1 前言 由于工作需要,要开始捣腾百度地图了,今天上午初始牛刀,各种碰壁,无奈之下,中午睡了一觉,养精蓄锐,以备下午大战三百回合,所幸下午中午把百度地图Demo捣腾出来了,在此与大家分享,环境搭建教程 ...

  10. JavaWeb-04(BOM&amp;DOM)

    JavaWeb-04 JavaWeb-BOM&DOM BOM 一.知识回想 * BOM 概述 * BOM 的各个对象 * window对象 innerHeight,innerWidth doc ...