SpringMVC的攔截器
SpringMVC攔截器-攔截器的作用
Spring MVC 的攔截器類似于 Servlet 開發中的過濾器 Filter,用于對處理器進行預處理和后處理。
將攔截器按一定的順序聯結成一條鏈,這條鏈稱為攔截器鏈(InterceptorChain)。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。攔截器也是AOP思想的具體實現。
自定義攔截器很簡單,只有如下三步:
①創建攔截器類實現HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(" afterCompletion");}
}
public class MyInterceptor2 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle2");return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle2");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(" afterCompletion2");}
}
②配置攔截器
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.controller.MyInterceptor1"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.controller.MyInterceptor2"/></mvc:interceptor></mvc:interceptors>
③測試攔截器的攔截效果
@RequestMapping(value = {"/qq2"})public ModelAndView method2(ModelAndView modelAndView){modelAndView.addObject("name","ccc");modelAndView.setViewName("success");return modelAndView;}
結論:
當攔截器的preHandle方法返回true則會執行目標資源,如果返回false則不執行目標資源
多個攔截器情況下,配置在前的先執行,配置在后的后執行
攔截器中的方法執行順序是:preHandler-------目標資源----postHandle---- afterCompletion
SpringMVC異常處理機制
異常處理的思路
系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,后者主要通過規范代碼開發、測試等手段減少運行時異常的發生。
系統的Dao、Service、Controller出現都通過throws Exception向上拋出,最后由SpringMVC前端控制器交由異常處理器進行異常處理,
異常處理兩種方式
① 使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="defaultErrorView" value="error"/><property name="exceptionMappings"><map><entry key="java.lang.NumberFormatException" value="error"/></map></property></bean>
@RequestMapping(value = {"/qq2"})public ModelAndView method2(ModelAndView modelAndView) throws Exception{String s="abc";System.out.println(Integer.parseInt(s));modelAndView.addObject("name","ccc");modelAndView.setViewName("success");return modelAndView;}
② 實現Spring的異常處理接口HandlerExceptionResolver 自定義自己的異常處理器
自定義異常處理步驟
①創建異常處理器類實現HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver {public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("error");return modelAndView;}
}
②配置異常處理器
<bean class="com.controller.MyExceptionResolver"/>
③編寫異常頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>error</h1>
</body>
</html>
④測試異常跳轉