java的異常處理類是一個很好的學習模板,通過web容器、springmvc的異常處理,可以幫助我們很好的回顧交互邏輯,理清楚springmvc控制層(controller)與頁面(client)的邏輯交互關係。
一、容器是怎麼處理異常的?
(1)、在web.xml中配置error-page,在eclipse的下面有提示信息,根據配置可以處理異常,在異常發生時跳轉到我們設置的異常頁面
配置信息如下:
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/pages/errors/notfoundexception.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/WEB-INF/pages/errors/nullpointerexception.jsp</location>
</error-page>
(2)、在對應的jsp文件擡頭信息設置 isErrorPage=”true”
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true" %>
(3)、在jsp頁面可以通過四大域中的pageContext域的ErrorData屬性獲取綁定的異常信息,以下爲el表達式獲取信息:
<h2>請求資源路徑:${pageContext.errorData.requestURI}</h2>
<h2>異常Servlet:${pageContext.errorData.servletName }</h2>
<h2>狀態碼:${pageContext.errorData.statusCode }</h2>
二、springmvc是怎麼處理異常的?
1、使用@ExceptionHandler註解配置處理
(1)開啓註解驅動:
<mvc:annotation-driven></mvc:annotation-driven>
(2)在出現異常的controller類中編寫異常處理的方法,在方法中配置@ExceptionHandler註解
@ExceptionHandler({Exception.class})//註冊註解,指定傳入的異常類型參數
public String dealExcepiton(HttpServletRequest request,Exception e){
request.setAttribute("e", e);//設置request對象,方便傳送給到客戶端
return "/errors/exceptionhandler";//跳轉到異常處理頁面
}
(3)在方法返回的客戶端,通過上面方法中設定的request屬性獲取異常信息,從而顯示在客戶頁面:
<h2>系統出現了非預期的異常,請聯繫系統管理員確認處理...</h2>
<%
Exception e = (Exception)request.getAttribute("e");
out.println(e.getMessage());
out.println(e.getClass());
out.println(e.getCause());
%>
注意: 如果存在多個@ExceptionHandler註解的方法,則進入離異常類型最近的方法,先進入小異常的處理。
總結:這種捕獲異常的方式可以針對本類中每個方法可能出現的異常進行單獨捕獲 ,但是對於我們的代碼有侵入性
2、自定義異常處理類實現HandlerExceptionResolver接口
(1)、自定義類來處理異常實現HandlerExceptionresolver接口
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception e) {
ModelAndView modelAndView = new ModelAndView();
return modelAndView;
}
}
(2)、配置該類到spring容器,通過註解方式,並實現異常邏輯:
@Controller
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("e", e);
modelAndView.setViewName("/errors/notfoundexception");//文件路徑已**視圖解析器**通過InternalResourceViewResolver的配置前綴,後綴
return modelAndView;
}
}
(3)在上面跳轉的jsp頁面中,可以在request中獲取異常信息:
<%
Exception e = (Exception)request.getAttribute("e");
out.println(e.getMessage());
out.println(e.getClass());
%>
也可以使用pageContext的errorData獲取異常信息:
<h2>請求地址: ${pageContext.errorData.requestURI} </h2>
<h2> 狀態碼 : ${pageContext.errorData.statusCode} </h2>
<h2>異常 : ${pageContext.errorData.throwable} </h2>
<h2>servlet名稱 :${pageContext.errorData.servletName} </h2>