一 声明式异常处理
 
在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. input[type=date]

    ::-webkit-datetime-edit – 控制编辑区域的 ::-webkit-datetime-edit-fields-wrapper – 控制年月日这个区域的 ::-webkit-date ...

  2. wangEditor - 轻量级web富文本编辑器(可带图片上传)

    业务需求: 通过后台编辑文章和图片,上传到前端界面,展示新闻消息模块.这个时候,需要一款简洁的编辑器,百度编辑器是最常用的一种,但是功能太过于复杂,而wangEditor - 轻量级web富文本编辑器 ...

  3. Android的SQLite的增删查改

    原创作品,允许转载,转载时请务必声明作者信息和本声明.http://www.cnblogs.com/zhu520/p/8343675.html 本人小白,那个大神看到有问题可指出,谢谢.... 一:s ...

  4. Linq案例

    1.牛刀小试 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  5. amaze ui和bootstrap有哪些差别?

    amaze ui和bootstrap有哪些差别? 问题 我最近在学amaze ui,感觉如果单从功能性来看和bootstrap最大差别也就是扁平化,不过妹子ui号称对国产本土化支持更好,这个具体表现在 ...

  6. 11.Axis客户端接收不同参数类型

    转自:http://www.guance.com/708.html axis只支持简单类型的返回值.在这里逐一介绍axis的各种返回值接受. 1. axis接受基本类型,如int, string等 引 ...

  7. HTML5入门:HTML5的文档声明和基本代码

    HTML5的文档声明: HTML5的文档声明,不同于HTML4.0和XHTML,它精简了许多代码,只保留<!DOCTYPE html>开头,必须位于HTML5文档的第一行,它可以用来告诉浏 ...

  8. pip的认识

    一.pip与python的关系:pip并不是一种语言,而是一个Python包管理工具,主要是用于安装 PyPI 上的软件包.安装好pip之后,使用pip install 命令即可方便的安装python ...

  9. 认知 Git 和 GitHub

    今天被一个大牛的大哥问了个问题,问住了.原问题是“你是到github吗?git呢?” 我堂而皇之的说,“他们不是同一个吗?” 结果大牛大哥狠狠地回了我一句“百度去”..好吧我乖乖去百度了. 这是我百度 ...

  10. 一款开源Office软件---Lotus Symphony在Linux系统下的应用

    点击下载观看试用录像   Linux系统下的办公软件有OpenOffice.永中Office.红旗Red Office.金山Wps Office及StarOffice等,今天我为大家介绍IBM推进军O ...