一 声明式异常处理
 
在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. CSS3新的UI方案

    文本新增样式 一.opacity:指定了一个元素的透明度 0~1 二.新增颜色模式rgba:很好的解决了背景透明,字体颜色不透明的需求. 三.文字阴影:text-shadow用来为文字添加阴影,而且可 ...

  2. python关于sorted里面key,reverse以及lamdba,operator这几个鸟人

     关于sorted:   help里给的解释 >>> help(sorted) Help on built-in function sorted in module __builti ...

  3. 51nod 更难的矩阵取数问题 + 滚动数组优化

    这里要求要走到终点再走回来,可以转化为两个人走. 那么我们可以先粗暴的设f[x1][y1][x2][y2]为第一个人走到(x1, y1), 第二个人走到(x2, y2)的最大价值. 那么这样空间会很大 ...

  4. 实例讲解Nginx下的rewrite规则 来源:Linux社区

    一.正则表达式匹配,其中:* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配二.文件及目录匹配,其中:* -f和!-f用来判断是否存在文件* ...

  5. EditPlus 使用技巧以及快捷键

    一边阅读,一边动手吧! 为了达到更好的效果,请你先下载我打包的这个 EditPlus压缩包文件(压缩包文件为绿色的EditPlus2.31英文版,含自动完成文件,高亮语法文件和剪切板代码片断文件,这些 ...

  6. 9.Nexus私服安装配置

    第一步:下载nexus-webapp-1.9.2.4.war包,然后复制到tomcat下的webapps文件夹中 第二步:启动tomcat 第三步:訪问http://localhost:8080/ne ...

  7. 手动脱FSG壳实战

    作者:Fly2015 对于FSG壳.之前没有接触过是第一次接触.这次拿来脱壳的程序仍然是吾爱破解论坛破解培训的作业3的程序.对于这个壳折腾了一会儿,后来还是被搞定了. 1.查壳 首先对该程序(吾爱破解 ...

  8. 用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

    用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana ...

  9. button-xml 中android:clickable="false" 属性

    今天在做项目的时候,遇到了一个问题,就是需要把一个常按监听事件,加到一个linearlayout中,但是,这个linearlayout中有其他的button.textview等控件,这样就导致当我们常 ...

  10. Fragment-两种使用方式

    这篇我们就用实例来看看我们在代码中如何使用Fragment 一:静态添加Fragment 新建一个项目,添加两个Fragment的布局文件fragment_title,fragment_content ...