SpringMVC由淺入深實(shí)用教程-SpringMVC核心技術(shù)(上篇)

請求重定向和轉(zhuǎn)發(fā)
當(dāng)處理器對請求處理完畢后,向其它資源進(jìn)行跳轉(zhuǎn)時(shí),有兩種跳轉(zhuǎn)方式: 請求轉(zhuǎn)發(fā)與重定向。而根據(jù)所要跳轉(zhuǎn)的資源類型,又可分為兩類:跳轉(zhuǎn)到頁面與跳轉(zhuǎn)到其它處理器。
注意,對于請求轉(zhuǎn)發(fā)的頁面,可以是WEB-INF 中頁面;而重定向的頁面, 是不能為WEB-INF 中頁的。因?yàn)橹囟ㄏ蛳喈?dāng)于用戶再次發(fā)出一次請求,而用戶是不能直接訪問WEB-INF 中資源的。

SpringMVC 框架把原來 Servlet 中的請求轉(zhuǎn)發(fā)和重定向操作進(jìn)行了封裝?,F(xiàn)在可以使用簡單的方式實(shí)現(xiàn)轉(zhuǎn)發(fā)和重定向。
forward:表示轉(zhuǎn)發(fā),實(shí)現(xiàn)request.getRequestDispatcher("xx.jsp").forward()
redirect:表示重定向,實(shí)現(xiàn) response.sendRedirect("xxx.jsp")
請求轉(zhuǎn)發(fā)
處理器方法返回 ModelAndView?時(shí),需在setViewName()指定的視圖前添加forward:,且此時(shí)的視圖不再與視圖解析器一同工作,這樣可以在配置了解析器時(shí)指定不同位置的視圖。視圖頁面必須寫出相對于項(xiàng)目根的路徑。forward?操作不需要視圖解析器。
處理器方法返回String,在視圖路徑前面加入forward: 視圖完整路徑。

?請求重定向
在處理器方法返回的視圖字符串的前面添加redirect:,則可實(shí)現(xiàn)重定向跳轉(zhuǎn)。
處理器方法定義:

異常處理
SpringMVC 框架處理異常的常用方式:使用@ExceptionHandler 注解處理異常。
@ExceptionHandler?注解
使用注解@ExceptionHandler?可以將一個方法指定為異常處理方法。該注解只有一個可選屬性value,為一個 Class<?>數(shù)組,用于指定該注解的方法所要處理的異常類,即所要匹配的異常。
而被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名隨意,方法參數(shù)可以是Exception?及其子類對象、HttpServletRequest、HttpServletResponse 等。系統(tǒng)會自動為這些方法參數(shù)賦值。
對于異常處理注解的用法,也可以直接將異常處理方法注解于 Controller 之中。
(1)?自定義異常類
定義三個異常類:NameException、AgeException、MyUserException。其中 MyUserException 是另外兩個異常的父類。



(2)?修改 Controller?拋出異常

(3)?定義異常響應(yīng)頁面
?定義三個異常響應(yīng)頁面。

不過,一般不這樣使用。而是將異常處理方法專門定義在一個類中,作為全局的異常處理類。
需要使用注解@ControllerAdvice,字面理解就是“控制器增強(qiáng)”,是給控制器對象增強(qiáng)功能的。使用@ControllerAdvice 修飾的類中可以使用@ExceptionHandler。
當(dāng)使用@RequestMapping 注解修飾的方法拋出異常時(shí),會執(zhí)行@ControllerAdvice 修飾的類中的異常處理方法。
@ControllerAdvice 是使用@Component 注解修飾的,可以<context:component-scan>掃描到@ControllerAdvice 所在的類路徑(包名), 創(chuàng)建對象。
(4)?定義全局異常處理類

(5)?定義 Spring?配置文件

攔截器
SpringMVC 中的Interceptor 攔截器是非常重要和相當(dāng)有用的,它的主要作用是攔截指定的用戶請求,并進(jìn)行相應(yīng)的預(yù)處理與后處理。其攔截的時(shí)間點(diǎn)在“處理器映射器根據(jù)用戶提交的請求映射出了所要執(zhí)行的處理器類,并且也找到了要執(zhí)行該處理器類的處理器適配器,在處理器適配器執(zhí)行處理器之前”。當(dāng)然,在處理器映射器映射出所要執(zhí)行的處理器類時(shí),已經(jīng)將攔截器與處理器組合為了一個處理器執(zhí)行鏈,并返回給了中央調(diào)度器。
一個攔截器的執(zhí)行
項(xiàng)目:interceptor。自定義攔截器

自定義攔截器,需要實(shí)現(xiàn)HandlerInterceptor 接口。而該接口中含有三個方法:
preHandle(request,response, Object?handler):
該方法在處理器方法執(zhí)行之前執(zhí)行。其返回值為 boolean,若為 true,則緊接著會執(zhí)行處理器方法,且會將 afterCompletion()方法放入到一個專門的方法棧中等待執(zhí)行。
postHandle(request,response, Object?handler,modelAndView):
該方法在處理器方法執(zhí)行之后執(zhí)行。處理器方法若最終未被執(zhí)行,則該方法不會執(zhí)行。由于該方法是在處理器方法執(zhí)行完后執(zhí)行,且該方法參數(shù)中包含ModelAndView,所以該方法可以修改處理器方法的處理結(jié)果數(shù)據(jù),且可以修改跳轉(zhuǎn)方向。
afterCompletion(request,response, Object handler, Exception?ex):
當(dāng) preHandle()方法返回 true 時(shí),會將該方法放到專門的方法棧中,等到對請求進(jìn)行響應(yīng)的所有工作完成之后才執(zhí)行該方法。即該方法是在中央調(diào)度器渲染(數(shù)據(jù)填充)了響應(yīng)頁面之后執(zhí)行 ?的,此時(shí)對 ModelAndView 再操作也對響應(yīng)無濟(jì)于事。
afterCompletion 最后執(zhí)行的方法,清除資源,例如在 Controller 方法中加入數(shù)據(jù)

攔截器方法:

攔截器中方法與處理器方法的執(zhí)行順序如下圖:

換一種表現(xiàn)方式,也可以這樣理解:

(1)?注冊攔截器

<mvc:mapping/>用于指定當(dāng)前所注冊的攔截器可以攔截的請求路徑,而/**表示攔截所有請求。
(2)?修改 index?頁面

(3)?修改處理器

(4)?修改 show?頁面

(5)?控制臺輸出結(jié)果

最后奉上視頻教程??,視頻觀看效果更佳!!走過路過別忘素質(zhì)三連哦~~

