目錄
lerInterceptor 攔截器
1、攔截器的作用
2、攔截器的創(chuàng)建
3、攔截器的三個抽象方法
4、攔截器的配置
5、多個攔截器的執(zhí)行順序
SpringMVC的異常處理器
1、異常處理器概述
2、基于配置文件的異常處理
3、基于注解的異常處理
lerInterceptor 攔截器
1、攔截器的作用
攔截器的作用時機(jī)
SpringMVC的攔截器作用于?
控制器方法執(zhí)行的前后
。有不同的攔截方法,作用于控制器方法執(zhí)行之前、之后、以及視圖渲染之后三個階段
攔截器與過濾器的區(qū)別
過濾器是原生Serlvet的組件,作用于Servlet執(zhí)行之前
攔截器是SpringMVC的模塊,作用于控制器方法執(zhí)行前、后、渲染視圖后。
2、攔截器的創(chuàng)建
SpringMVC中的攔截器需要實現(xiàn)HandlerInterceptor接口
示例
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("控制器方法準(zhǔn)備執(zhí)行...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("控制器方法執(zhí)行完畢...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("視圖渲染完畢...");
}
}
3、攔截器的三個抽象方法
HandlerInterceptor接口有三個抽象方法:
- preHandle:
控制器方法執(zhí)行之前
執(zhí)行preHandle(),其boolean類型的返回值表示是否攔截或放行
返回true為放行,即調(diào)用控制器方法
;返回false表示攔截,即不調(diào)用控制器方法
- postHandle:
控制器方法執(zhí)行之后
執(zhí)行postHandle()- afterComplation:處理完視圖和模型數(shù)據(jù),
渲染視圖完畢之后
執(zhí)行afterComplation()
源碼分析,為什么preHandle能實現(xiàn)攔截控制器方法
//DispatherServlet
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
//如果applyPreHandle方法返回的是false,就直接return,不再執(zhí)行下面的內(nèi)容
return;
}
//執(zhí)行控制器方法
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//渲染視圖
...
//applyPreHandle方法
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
for (int i = 0; i < this.interceptorList.size(); i++) {
HandlerInterceptor interceptor = this.interceptorList.get(i);
if (!interceptor.preHandle(request, response, this.handler)) {
triggerAfterCompletion(request, response, null);
//如果當(dāng)前攔截器的preHandle方法返回false,applyPreHandle方法也返回false
return false;
}
this.interceptorIndex = i;
}
return true;
}
注意
SpringMVC配置文件中的
view-controller視圖控制器標(biāo)簽,也會被攔截器攔截
。
4、攔截器的配置
SpringMVC的攔截器必須在SpringMVC的配置文件中進(jìn)行配置。
攔截器有三種配置方式,一般使用第三種,可以配置攔截范圍。
方式一?在interceptors中配置
自定義攔截器的bean標(biāo)簽
<!--配置攔截器-->
<mvc:interceptors>
<bean class="com.csai.interceptors.FirstInterceptor"/>
</mvc:interceptors>
這種方式
無法指定攔截范圍
,是對DispatcherServlet所處理的所有的請求進(jìn)行攔截
方式二?在interceptors中引用
自定義攔截器的bean id
<bean id="firstInterceptor" class="com.csai.interceptors.FirstInterceptor"/>
<!--配置攔截器-->
<mvc:interceptors>
<ref bean="firstInterceptor"/>
</mvc:interceptors>
和上面一樣,這種方式
無法指定攔截范圍
,是對DispatcherServlet所處理的所有的請求進(jìn)行攔截
配置自定義攔截器的bean時,可以使用配置文件,也可以使用@Component注解+組件掃描的方式
方式三?使用<mvc:interceptor>標(biāo)簽進(jìn)行配置
<bean id="firstInterceptor" class="com.csai.interceptors.FirstInterceptor"/>
<!--配置攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/testInterceptor"/>
<ref bean="firstInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
可以配置三個屬性:
- mapping:
攔截請求的請求地址
,可以使用Ant風(fēng)格的路徑- exclude-mapping:
不會被攔截的請求地址
,即攔截白名單- bean/ref:指定攔截器的bean
例如這里是攔截所有請求,不攔截testInterceptor頁面,對應(yīng)的攔截器是firstInterceptor
5、多個攔截器的執(zhí)行順序
如果匹配到的多個攔截器的preHandle()方法都返回true
此時多個攔截器的執(zhí)行順序和攔截器在SpringMVC的配置文件的配置順序有關(guān):
preHandle()
會按照配置的順序執(zhí)行,即先配置的先執(zhí)行
postHandle()和afterComplation()
會按照配置的反序執(zhí)行,即先配置的后執(zhí)行
,因為是嵌套的關(guān)系。示例,請求訪問,匹配到一個控制器方法,兩個攔截器:
配置順序:
<!--配置攔截器-->
<mvc:interceptors>
<ref bean="Interceptor A"/>
<ref bean="Interceptor B"/>
</mvc:interceptors>
執(zhí)行順序:
preHandle A --> true
preHandle B --> true
--- 控制器方法執(zhí)行 ---
--- 控制器方法執(zhí)行完畢 ---
postHandle B
postHandle A
--- 視圖渲染完畢 ---
afterComplation B
afterComplation A
如果匹配到多個攔截器,有的攔截器的preHandle()方法返回了false
先看結(jié)果:對于同一個控制器方法,只要存在攔截器的preHandle()方法返回了false,控制器方法就不會執(zhí)行。
- 在它之前配置的攔截器,和它自己的preHandle()都會執(zhí)行
- 所有的postHandle()都不執(zhí)行,因為控制器方法沒有執(zhí)行
- 在它之前配置的攔截器,afterComplation()會執(zhí)行
- 在它之后配置的攔截器,所有方法都不會執(zhí)行。
示例 請求訪問,匹配到一個控制器方法,兩個攔截器,其中一個返回false:
配置順序:
<!--配置攔截器-->
<mvc:interceptors>
<ref bean="Interceptor A"/>
<ref bean="Interceptor B"/>
</mvc:interceptors>
Interceptor B 的preHandle()返回false
執(zhí)行順序:
preHandle A --> true
preHandle B --> false
--- 控制器方法不執(zhí)行 ---
afterComplation A
SpringMVC的異常處理器
1、異常處理器概述
異常處理器的作用
用于處理SpringMVC 控制器方法執(zhí)行過程中 產(chǎn)生的異常。
SpringMVC提供了一個處理 控制器方法執(zhí)行過程中所出現(xiàn)的異常的接口:
HandlerExceptionResolver
HandlerExceptionResolver接口的實現(xiàn)類:
- DefaultHandlerExceptionResolver,是SpringMVC默認(rèn)使用的異常處理器
- SimpleMappingExceptionResolver,用于自定義 異常處理器
自定義異常處理器的使用場景
大致有兩個作用:
- 對系統(tǒng)異常提供自定義處理。比如出現(xiàn)某個異常時,跳轉(zhuǎn)到服務(wù)器繁忙的頁面,用戶就不會看到500這類的頁面了
- 提供對自定義異常的處理方案
2、基于配置文件的異常處理
SpringMVC提供了自定義的異常處理器SimpleMappingExceptionResolver
示例 實現(xiàn)錯誤頁面跳轉(zhuǎn)
<!--配置異常處理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--如果出現(xiàn)ArithmeticException數(shù)學(xué)異常,就跳轉(zhuǎn)到error視圖-->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
</bean>
properties的鍵表示處理器方法執(zhí)行過程中出現(xiàn)的異常
properties的值表示若出現(xiàn)指定異常時,設(shè)置一個新的視圖名稱,跳轉(zhuǎn)到指定頁面
測試
error頁面
<h3>服務(wù)器繁忙!</h3>控制器方法
@RequestMapping("/testInterceptor")
public String testInterceptor(){
//創(chuàng)造一個數(shù)學(xué)異常
Integer i = 3/0;
return "success";
}
發(fā)生異常后,就會被自定義的異常處理器捕獲,跳轉(zhuǎn)到錯誤頁面
示例 實現(xiàn)異常信息的捕獲
配置文件
<!--配置異常處理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--如果出現(xiàn)ArithmeticException數(shù)學(xué)異常,就跳轉(zhuǎn)到error視圖-->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
<property name="exceptionAttribute" value="exception"/>
</bean>
配置exceptionAttribute屬性,設(shè)置一個value
異常信息就會存入request域中,鍵名為設(shè)置的value,值為異常信息。
前端頁面展示錯誤信息
<h3>服務(wù)器繁忙!</h3>
<p th:text="${exception}"></p>
3、基于注解的異常處理
使用注解,實現(xiàn)獲取異常信息和跳轉(zhuǎn)錯誤頁面
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = {ArithmeticException.class})
public String testException(Exception exception, Model model){
model.addAttribute("exception", exception);
return "error";
}
}
原理:如果遇到了@ExceptionHandler 注解 標(biāo)識的這些異常,就調(diào)用 此 @ExceptionHandler 注解對應(yīng)的控制器方法。文章來源:http://www.zghlxwxcb.cn/news/detail-432480.html
使用注解,在配置文件中就不需要配置任何關(guān)于異常處理器的內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-432480.html
到了這里,關(guān)于SpringMVC的攔截器和異常處理器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!