1.      web.xml的配置

自定义的异常类

1 <error-page>
2           <exception-type>com.service.Exception.MyException</exception-type>
3           <location>/my_exception.jsp</location>
4 </error-page>

定义HTTP消息状态码

<error-page><error-code>404</error-code><location>/404.html</location>
</error-page>

2.      出错原因分析

1)  IE将出错页面响应状态码200,告诉浏览器是成功消息,显示该页面,如下:

1 <%
2     response.setStatus(200); // 200 = HttpServletResponse.SC_OK
3 %>

2)  如果是上面的错误相信Google很容易得到,但是对于JSP页面中抛出的异常(RuntimeException),还有可能是如下原因:

a.当通过request分发请求my.jsp页面,my.jsp页面中的某个方法会抛出MyException,代码如下:getRequestDispatcher(“/my.jsp”).forward(request, response);在这里,整个程序执行的流程为:分发dispather时,Tomcat容器会生成一个my.jsp的包装类,实际就是JspServletWrapper通过getServlet方法得到myServlet.java执行service方法,抛出异常,在这里自定义的异常MyException将会被HandleException方法处理,最后抛出JasperException,而不是我们自己定义的异常。如下代码

JspServletWrapper类中:

  1
  2
  3 servlet = getServlet();
  4
  5           try {
  6
  7             /*
  8
  9              * (3) Service request
 10
 11              */
 12
 13             if (servlet instanceof SingleThreadModel) {
 14
 15                // sync on the wrapper so that the freshness
 16
 17                // of the page is determined right before servicing
 18
 19                synchronized (this) {
 20
 21                    servlet.service(request, response);
 22
 23                 }
 24
 25             } else {
 26
 27 //这里调用my.jsp生成的Servlet.service,执行抛出自定义的异常,最后被catch转换成JasperException
 28
 29                 servlet.service(request, response);
 30
 31             }
 32
 33
 34
 35         } catch (UnavailableException ex) {
 36
 37             String includeRequestUri = (String)
 38
 39                 request.getAttribute("javax.servlet.include.request_uri");
 40
 41             if (includeRequestUri != null) {
 42
 43                 // This file was included. Throw an exception as
 44
 45                 // a response.sendError() will be ignored by the
 46
 47                 // servlet engine.
 48
 49                 throw ex;
 50
 51             } else {
 52
 53                 int unavailableSeconds = ex.getUnavailableSeconds();
 54
 55                 if (unavailableSeconds <= 0) {
 56
 57                     unavailableSeconds = 60;        // Arbitrary default
 58
 59                 }
 60
 61                 available = System.currentTimeMillis() +
 62
 63                     (unavailableSeconds * 1000L);
 64
 65                 response.sendError
 66
 67                     (HttpServletResponse.SC_SERVICE_UNAVAILABLE,
 68
 69                      ex.getMessage());
 70
 71             }
 72
 73         } catch (ServletException ex) {
 74
 75             if(options.getDevelopment()) {
 76
 77                 throw handleJspException(ex);
 78
 79             } else {
 80
 81                 throw ex;
 82
 83             }
 84
 85         } catch (IOException ex) {
 86
 87             if(options.getDevelopment()) {
 88
 89                 throw handleJspException(ex);
 90
 91             } else {
 92
 93                 throw ex;
 94
 95             }
 96
 97         } catch (IllegalStateException ex) {
 98
 99             if(options.getDevelopment()) {
100
101                 throw handleJspException(ex);
102
103             } else {
104
105                 throw ex;
106
107             }
108
109         } catch (Exception ex) {
110
111             if(options.getDevelopment()) {
112
113                 throw handleJspException(ex);
114
115             } else {
116
117                 throw new JasperException(ex);
118
119             }
120
121         }

所以当用Dispather分发页面时,如果页面中有异常抛出,最终将被转换成JasperException,如果通过Web.xml去handle,必须拦截JasperException才能够正确跳转。

b.当通过重定向跳转到my.jsp页面,代码如下,response.sendRedirect(“/my.jsp”)或者直接在浏览器地址栏上输入URL,实际上是JspServlet执行my_jsp.java的service方法,代码片段如下:

 1 try {
 2
 3             boolean precompile = preCompile(request);
 4
 5             serviceJspFile(request, response, jspUri, null, precompile);
 6
 7 //这里对于RuntimeException直接抛出
 8
 9         } catch (RuntimeException e) {
10
11             throw e;
12
13         } catch (ServletException e) {
14
15             throw e;
16
17         } catch (IOException e) {
18
19             throw e;
20
21         } catch (Throwable e) {
22
23             throw new ServletException(e);
24
25         }

3.      解决办法

最后解决办法,是在web.xml中配置对应的Handle自定义的Exception,还需要加如下代码,如下:

 1 try{
 2
 3 getRequestDispatcher(“/my.jsp”).forward(request, response);
 4
 5 }catch(Exception e){
 6
 7 if(e.getCause() instanceof  MyException){
 8
 9                 response.sendRedirect(“/error.jsp”);
10
11 }
12
13 }

如果改为response.sendRedirect(“/my.jsp”),直接在web.xml拦截即可。

转载于:https://www.cnblogs.com/wangbt/archive/2012/05/16/2505433.html

Web.xml配置Error Page不能够转发的问题分析及解决相关推荐

  1. web.xml配置的详细说明

    web.xml配置的详细说明 (转载)[TOMCAT]用web.xml控制Web应用的行为 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML ...

  2. 在tomcat下部署两个或多个项目时 log4j和web.xml配置webAppRootKey 的问题(转)

    在tomcat下部署两个或多个项目时 web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为"webapp.root",如下: <!-- 应用路径 ...

  3. 160329(二)、web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  4. 基于注解的Spring MVC(所需jar包,web.xml配置,Spring文件配置,@Controller,@RequestMapping,@RequestParam,model填参,EL取值)

    1.添加jar 2.web.xml配置: <?xml version="1.0" encoding="UTF-8"?> <web-app ve ...

  5. 基于XML配置的Spring MVC(所需jar包,web.xml配置,处理器配置,视图解析器配置)

    1.添加jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ver ...

  6. Spring MVC的web.xml配置详解(转)

    出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name)  2.在 ...

  7. Java web之web.xml配置详解

    什么是web.xml web.xml是web项目的配置文件,一般的web工程都会用到web.xml来配置,方便大型开发.web.xml主要用来配置Filter,Listener,Servlet等.但是 ...

  8. JavaWeb web.xml配置详解

    参考: XML 教程 Java web之web.xml配置详解 Javaweb三大组件是:Servlet,Filter,Listener. 1.Servlet Servlet作为中转处理的容器,连接了 ...

  9. web.xml配置详解

    往者不谏 来者可追 写作是最好的社交 新随笔 订阅 web.xml配置详解 Web.xml常用元素<web-app><display-name></display-nam ...

最新文章

  1. 竞赛专题(四)特征工程-竞赛中的必杀技
  2. linux cuda 异常退出,cudaErrorCudartUnloading问题排查及建议方案
  3. 【Android 高性能音频】hello-oboe 示例解析 ( Oboe 源代码依赖 | CMakeList.txt 构建脚本分析 | Oboe 源代码构建脚本分析 )
  4. 人人皆可大数据!SACC教你玩转阿里ODPS
  5. 运营资源很少的时候,怎么运营自己的产品(完结)
  6. linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解
  7. TEGer看过来,他二哥带你去看大世界!
  8. linux要求关闭httpd服务,Apache2.4.4的安装及实现service和chkconfig系统控制httpd开启关闭...
  9. diff算法_传统Diff算法为什么时间复杂度要O(n ^3)
  10. Java(五)异常处理,异常参数,自定义异常,嵌套异常
  11. python thread 共享数据
  12. windows消息宏(转)
  13. 源代码HTML5五子棋小游戏web开发
  14. 智慧旅游信步而来 互联网安防助力景区智能化
  15. 2016(第三届)智能家居世界大会
  16. sysctl 系统配置
  17. python词云分析 jieba+wordcloud 按词频生成词云
  18. Oracle(11g)数据库教程之三:SQL Developer 及 SQL *Plus操作数据库
  19. 2020家用千兆路由器哪款好_什么路由器比较好(2020年最好千兆路由器)
  20. 石油石化生产企业该如何防止电网晃电发生和发生晃电时保证敏感负荷的设备正常运行

热门文章

  1. mysql 定时脚本_MySQL定时执行脚本(计划任务)命令实例
  2. boot jndi数据源 spring_spring boot多数据源配置(mysql,redis,mongodb)实战
  3. java自动转换_java类型转换详解(自动转换和强制转换)
  4. Java Socket编程 文件传输(客户端从服务器下载一个文件)
  5. 弘成科技 java单例模式
  6. linux 环境下安装和配置mysql数据库以及远程登录
  7. Velocity浅析及与Jsp、Freemarker对比
  8. Lucene学习总结之二:Lucene的总体架构
  9. c语言中stdbool.h的使用
  10. python学习笔记(七)函数