Web.xml配置Error Page不能够转发的问题分析及解决
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消息狀態(tài)碼
<error-page><error-code>404</error-code><location>/404.html</location> </error-page>2.??????出錯(cuò)原因分析
1)??IE將出錯(cuò)頁面響應(yīng)狀態(tài)碼200,告訴瀏覽器是成功消息,顯示該頁面,如下:
1 <% 2 response.setStatus(200); // 200 = HttpServletResponse.SC_OK 3 %>2)??如果是上面的錯(cuò)誤相信Google很容易得到,但是對(duì)于JSP頁面中拋出的異常(RuntimeException),還有可能是如下原因:
a.當(dāng)通過request分發(fā)請(qǐng)求my.jsp頁面,my.jsp頁面中的某個(gè)方法會(huì)拋出MyException,代碼如下:getRequestDispatcher(“/my.jsp”).forward(request, response);在這里,整個(gè)程序執(zhí)行的流程為:分發(fā)dispather時(shí),Tomcat容器會(huì)生成一個(gè)my.jsp的包裝類,實(shí)際就是JspServletWrapper通過getServlet方法得到myServlet.java執(zhí)行service方法,拋出異常,在這里自定義的異常MyException將會(huì)被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 //這里調(diào)用my.jsp生成的Servlet.service,執(zhí)行拋出自定義的異常,最后被catch轉(zhuǎn)換成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 }所以當(dāng)用Dispather分發(fā)頁面時(shí),如果頁面中有異常拋出,最終將被轉(zhuǎn)換成JasperException,如果通過Web.xml去handle,必須攔截JasperException才能夠正確跳轉(zhuǎn)。
b.當(dāng)通過重定向跳轉(zhuǎn)到my.jsp頁面,代碼如下,response.sendRedirect(“/my.jsp”)或者直接在瀏覽器地址欄上輸入U(xiǎn)RL,實(shí)際上是JspServlet執(zhí)行my_jsp.java的service方法,代碼片段如下:
1 try { 2 3 boolean precompile = preCompile(request); 4 5 serviceJspFile(request, response, jspUri, null, precompile); 6 7 //這里對(duì)于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中配置對(duì)應(yīng)的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攔截即可。
轉(zhuǎn)載于:https://www.cnblogs.com/wangbt/archive/2012/05/16/2505433.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Web.xml配置Error Page不能够转发的问题分析及解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jackson 实体转json
- 下一篇: Goodnotes