一 声明式异常处理
 
在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. Mark Sweep GC

    目录 标记清除算法 标记阶段 深度优先于广度优先 清除阶段 分配 First-fit.Best-fit.Worst-fit三种分配策略 合并 优点 实现简单 与保守式GC算法兼容 缺点 碎片化 分配速 ...

  2. MySQL Field排序法

    检索 id = 2 or id = 5 or id = 9 or id = 56 or id = 38.然后按照 2 , 5, 9, 56, 38 这个顺序排列,这是题目要求   以下为解决方案: 1 ...

  3. XML解析——SAX解析以及更方便的解析工具(JDOM、DOM4J)

    XML主要用于数据交换,HTML则用于显示. 相对于DOM的树形解析,SAX采用的是顺序解析,这种解析方法可以快速地读取XML数据的方式. SAX主要事件: No. 方法 类型 描述 1 public ...

  4. Git学习总结(5)——搭建Git简易高效服务器

    1. mysysgit+gitblit安装流程 1.1资源  需先下载好的资源(公司用的1.6,1.7+请自行匹配对应的mysysgit+gitblit):  jdk1.6  Git-1.8.4-pr ...

  5. ORACLE-016:ora-01720 授权选项对于&#39;xxxx&#39;不存在

    报错的情形例如以下. A用户:视图V_A B用户:视图V_B,而且用到了V_A C用户:须要用V_B, 授权过程, A用户下: grant select on V_A to B B用户下: grant ...

  6. CocoaPods制作

    欢迎相同喜欢动效的工程师/UI设计师/产品添加我们 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:648070256 引言: 折腾了三四天,各种文章翻遍了,遇到 ...

  7. smarty课程---最最最简单的smarty例子

    smarty课程---最最最简单的smarty例子 一.总结 一句话总结:其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个 ...

  8. 用内置的库turtle来画一朵花,python3

    题目:用内置的库turtle来画一朵花 看了群主最后成像的图片,应该是循环了36次画方框,每次有10度的偏移. 当然不能提前看答案,自己试着写代码. 之前有用过海龟画图来画过五角星.奥运五环.围棋盘等 ...

  9. ZJU 2425 Inversion

    Inversion Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ID:  ...

  10. 洛谷 P1255 数楼梯

    P1255 数楼梯 题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个数字,楼梯数. 输出格式: 走的方式几种. 输入 ...