在咱們SpringMVC中也可使用攔截器對用戶的請求進行攔截,用戶能夠自定義攔截器來實現特定的功能。自定義攔截器必需要實現HandlerInterceptor接口java
package com.spring.mvc.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * @author:SimpleWu * @to:攔截器執行流程:preHandle - 目標方法 - postHandle -渲染視圖 - afterCompletion */ public class MyInterceptor implements HandlerInterceptor{ /** * 渲染視圖以後被調用 * 釋放資源 */ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("[MyInterceptor] afterCompletion"); } /** * 該方法是在目標方法以後,渲染視圖以前被調用 * 能夠對請求域中的參數或視圖作出修改 */ @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("[MyInterceptor] postHandle"); } /** * 該方法在目標方法前調用 * 1)若是返回值爲true則繼續調用後續的攔截器和目標方法 * 2)若是返回值爲false則不會調用後續的攔截器和目標方法 * 能夠考慮作權限,日誌。 */ @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("[MyInterceptor] preHandle : 目標方法以前被調用。"); return true; } }
而後咱們須要在SpringMVC中配置攔截器。web
<mvc:interceptors> <!-- 配置自定義攔截器 --> <bean id="myInterceptor" class="com.spring.mvc.interceptor.MyInterceptor"/> <mvc:interceptor> <!-- 配置攔截器的做用路徑 --> <mvc:mapping path="/user/*"/> <!-- 配置攔截器不做用的路徑 <mvc:exclude-mapping path=""/> --> <bean class="com.spring.mvc.interceptor.UserInterceptor"/> </mvc:interceptor> </mvc:interceptors>
若是咱們配置了做用的路徑那麼咱們如今只有user/*後面的請求它纔會被咱們的攔截器給攔截。spring
在咱們攔截器中執行順序:首先調用preHandler方法而後進入請求的業務方法以後出來的時候會先調用postHandler這個方法(業務方法前,視圖渲染後),最後視圖渲染以後調用攔截器的afterCompletion方法。mvc
若是咱們有多個攔截器那麼他會按照配置順序執行preHandler,按逆方向執行postHandler與agterCompletion方法。app
假如咱們有兩個攔截器,在第一個攔截器的preHandler中返回false那麼全部的方法都不會執行,若是咱們在第二個攔截器返回false第一個攔截器還會多執行一個afterCompletion方法。jsp
SpringMVC異常處理ide
在SpringMVC中異常的處理與Struts2有點相似。post
SpringMVC經過HandlerExceptionResolver處理程序異常,包括Handler映射,數據綁定以及目標方法執行時所發生的異常。網站
SpringMVC中默認是沒有加裝載HandlerExceptionResolver,咱們須要在SpringMVC.xml中配置spa
<mvc:annotation-driven />
咱們能夠在Controller類中定義一個局部(方法所在類)的異常處理的方法
/** * 在這個方法中能夠加入Exception類型的參數,該參數即對於發生的異常對象 * 入參中不能傳入map,若但願吧異常信息傳到頁面上須要使用ModelAndView做爲返回值 */ @ExceptionHandler({NullPointerException.class}) public String handlerNullPointerException(Exception ex){ System.out.println("異常 : " + ex); return "error"; }
這個方法他會針對這個類中的NullPointerException異常將他捕獲,而後執行這個方法。若是咱們但願在頁面上顯示異常信息的話咱們只須要返回ModelAndView便可。
除了這種局部異常咱們還能夠配置全局異常處理類,這個類須要使用註解@ControllerAdvice修飾。
package com.spring.mvc.exceptionprocess; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; /** * @author SimpleWu * @ControllerAdvice:若是在當前Handler找不到當前方法出現的異常則未來這個註解標記的類中查找處理異常。 * 意爲定義一個全局異常 */ @ControllerAdvice public class UserException { @ExceptionHandler({NullPointerException.class}) public ModelAndView handlerNullPointerException(Exception ex){ System.out.println("[異常] : " + ex); ModelAndView mav = new ModelAndView("error"); mav.addObject("exception",ex); return mav; } }
固然在開發咱們可能在上面的類中有兩個方法例如一個是RuntimeException和NullPointerException那麼他會調用那個捕獲方法呢?
它不會應爲RuntimeException能夠匹配就匹配這個他會根據最靠近這個異常的類型去匹配。
定製異常頁面
在網站中若是咱們發生頁面不存在咱們可以看到頁面顯示:
在這裏咱們能夠自定義異常顯示。咱們能夠定義一個異常類使用@ResponseStatus註解修飾
package com.spring.mvc.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; /** * @author SimpleWu * 當捕獲當這個異常後更改錯誤提示 */ @ResponseStatus(value=HttpStatus.FORBIDDEN,reason="用戶密碼爲空") public class UserPassIsNullException extends RuntimeException{ private static final long serialVersionUID = 1L; }
在這裏咱們定義了一個異常,若是在請求的方法中拋出咱們的異常,頁面就會顯示咱們定製的狀態碼與提示信息。
SimpleMappingExceptionResolver:
若是但願對異常進行統一處理咱們能夠裝配這個bean,將它的異常類名映射爲視圖名,發生異常時使用對應視圖報告異常
<!-- 配置SimpleMappingExceptionResolverl來映射異常 至關於捕獲一個全局異常 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 自定義異常屬性名字 --> <property name="exceptionAttribute" value="ex"/> <property name="exceptionMappings"> <props> <!-- 捕獲到java.lang.ArithmeticException異常跳轉error.jsp頁面 --> <prop key="java.lang.ArithmeticException">error</prop> </props> </property> </bean>
若是咱們捕獲到這個算數異常那麼咱們就會返回error視圖。本該在jsp中咱們的頁面上顯示異常默認使用exception如今名字換成了ex