關於springMVC中component-scan的問題以及springmvc.xml整理


關於springMVC中component-scan的問題以及springmvc.xml整理

一、component-scan問題和解決辦法

   最近在學習使用springMVC+mybatis開發程序的時候,遇到了一些問題,這些問題有的很容易就解決了,可是有一個問題廢了我一上午的時間,那就是spring中的組件掃描技術, <context:component-scan base-package="***.***.***"></context:component-scan>這個技術可以讓我們少些很多javabean,還是很方便的,可是我在使用了這樣的技術之后就一直報java.lang.illegalargumentexception這樣的錯誤,很是苦惱,哪里有參數不合法了,接下來我注釋掉了這個component-scan條目,然后使用了普通的javabean來進行暴露,沒想到竟然成功了,因此我可以斷定問題一定出在這個組件掃描component-scan上,看了很多的資料,都是講的component-scan的相關內容,可是很少會提及component-scan與java.lang.illegalargumentexception的錯誤,最終,我總算找到了原因所在,那就是我是用的是spring3.2的大版本,jdk使用的是1.8大版本,這樣問題就出來了,版本不匹配,在執行jre的時候就不能相互兼容了,一定要注意在使用組件掃描的時候必須使用jdk和spring的版本相對應的jar,不然的話就會出現不合法的參數錯誤,真正正確的搭配版本應該是這樣的:jdk1.7+spring-context-support-3.2.0.RELEASE.jar或者jdk1.8+spring 4.*來搭配,在這里我使用了前者來解決!解決方法是首先卸載了電腦上的jdk環境,這點可以通過控制面板的“程序和功能”來完成,剩下的就是下載搭配的jdk版本,然后安裝,安裝之后一般還要重啟一下電腦,當然也可以不啟動,之后再打開程序,將新的環境jre導入程序中,這樣就可以了。因為我的這一點疏忽,讓我吃盡了苦頭,費了好長時間,在這里我不得不說采用xml的方法進行數據即代碼配置,好處是非常大的,但是錯誤就是難以找到哪個地方出問題了,一旦出現了一個這種相關度非常低的錯誤,往往是非常費時間的,不利於測試和排錯,因此在這里做一整理和總結。

二、注解和非注解的方式總結

2.1、非注解的方式
    2.1.1、  方法一

1         <!-- 第一種配置handler的方法,通過beanname來配置,處理器映射器需要配置為beanname 2  特別注意這里處理器適配器不能為HttpRequestHandlerAdapter,只能為SimpleControllerHandlerAdapter-->
3          <bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />
4 
5           <!-- 處理器映射器 將bean的name作為url進行查找 ,需要在配置Handler時指定beanname(就是url) 所有的映射器都實現 HandlerMapping接口。-->
6          <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
7 
8           <!-- 處理器適配器 所有處理器適配器都實現 HandlerAdapter接口 -->
9         <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

   2.1.2、 方法二  

    這里注意,我們在上面定義了handler1,並且映射方式是beanname,而這里我們不加改變的,只是利用了其中的一部分信息,id,在這里使用  SimpleUrlHandlerMapping和SimpleControllerHandlerAdapter同樣完成了訪問對應上面handler的功能的網址的功能,並且同一個handler還可以映射成不同的網址!  值得注意的是,我們使用這兩種映射器和SimpleControllerHandlerAdapter適配器只能實現具有public class ItemsController1 implements Controller {。。。}這樣生成的handler 。而對於public class ItemsController2 implements HttpRequestHandler {。。。}則無能為力。這種情況需要使用org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter另外,對於handler來說使用什么映射器和是用什么適配器之間並沒有什么強定義的關系,但是適配器一定要和handler的定義保持一致,映射器只與映射器的定義方法有關!!!!

 1      <!-- 配置Handler2 -->
 2      <bean id="itemsController2" class="cn.itcast.ssm.controller.ItemsController2" />
 3                 <!--簡單url映射 -->
 4     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 5         <property name="mappings">
 6             <props>
 7                 <!-- 對itemsController1進行url映射,url是/queryItems1.action -->
 8                 <prop key="/queryItems1.action">itemsController1</prop>
 9                 <prop key="/queryItems2.action">itemsController1</prop>
10                 <prop key="/queryItems3.action">itemsController2</prop>
11             </props>
12         </property>
13     </bean>
14     <!-- 非注解的適配器 ,適用於public class ItemsController2 implements HttpRequestHandler {。。}方法-->
15     <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
 1 package cn.itcast.ssm.controller;  2 
 3 import java.util.ArrayList;  4 import java.util.List;  5 
 6 import javax.servlet.http.HttpServletRequest;  7 import javax.servlet.http.HttpServletResponse;  8 
 9 import org.springframework.web.servlet.ModelAndView; 10 import org.springframework.web.servlet.mvc.Controller; 11 
12 import cn.itcast.ssm.po.Items; 13 
14 public class ItemsController1 implements Controller { 15 
16  @Override 17     public ModelAndView handleRequest(HttpServletRequest request, 18             HttpServletResponse response) throws Exception { 19         
20         //調用service查找 數據庫,查詢商品列表,這里使用靜態數據模擬
21         List<Items> itemsList = new ArrayList<Items>(); 22         //向list中填充靜態數據
23         
24         Items items_1 = new Items(); 25         items_1.setName("聯想筆記本"); 26  items_1.setPrice(6000f); 27         items_1.setDetail("ThinkPad T430 聯想筆記本電腦!"); 28         
29         Items items_2 = new Items(); 30         items_2.setName("蘋果手機"); 31  items_2.setPrice(5000f); 32         items_2.setDetail("iphone6蘋果手機!"); 33         
34  itemsList.add(items_1); 35  itemsList.add(items_2); 36 
37         //返回ModelAndView
38         ModelAndView modelAndView =  new ModelAndView(); 39         //相當 於request的setAttribut,在jsp頁面中通過itemsList取數據
40         modelAndView.addObject("itemsList", itemsList); 41         
42         //指定視圖
43         modelAndView.setViewName("items/itemsList"); 44 
45         return modelAndView; 46  } 47 }
ItemsController1代碼
 1 package cn.itcast.ssm.controller;  2 
 3 import java.io.IOException;  4 import java.util.ArrayList;  5 import java.util.List;  6 
 7 import javax.servlet.ServletException;  8 import javax.servlet.http.HttpServletRequest;  9 import javax.servlet.http.HttpServletResponse; 10 
11 import org.springframework.web.HttpRequestHandler; 12 import org.springframework.web.servlet.ModelAndView; 13 
14 import cn.itcast.ssm.po.Items; 15 
16 public class ItemsController2 implements HttpRequestHandler { 17 
18  @Override 19     public void handleRequest(HttpServletRequest request, 20             HttpServletResponse response) throws ServletException, IOException { 21         
22         //調用service查找 數據庫,查詢商品列表,這里使用靜態數據模擬
23         List<Items> itemsList = new ArrayList<Items>(); 24         //向list中填充靜態數據
25         
26         Items items_1 = new Items(); 27         items_1.setName("聯想筆記本"); 28  items_1.setPrice(6000f); 29         items_1.setDetail("ThinkPad T430 聯想筆記本電腦!"); 30         
31         Items items_2 = new Items(); 32         items_2.setName("蘋果手機"); 33  items_2.setPrice(5000f); 34         items_2.setDetail("iphone6蘋果手機!"); 35         
36  itemsList.add(items_1); 37  itemsList.add(items_2); 38         //設置模型數據
39         request.setAttribute("itemsList", itemsList); 40         //設置轉發的視圖
41         request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response); 42         
43         //使用此方法可以通過修改response,設置響應的數據格式,比如響應json數據
44          /*
45  response.setCharacterEncoding("utf-8"); 46  response.setContentType("application/json;charset=utf-8"); 47  response.getWriter().write("json串");*/
48  } 49 }
ItemsController2代碼

 2.2、注解的方式

1       <!-- 注解的方式 -->
2     <mvc:annotation-driven></mvc:annotation-driven>
3       <!-- 一定要注意在使用組件掃描的時候必須使用jdk和spring的版本相對應的jar,不然的話就會出現不合法的參數錯誤,
比如說我本來使用的jdk1.8+spring-context-support-3.2.0.RELEASE.jar就是一個錯誤的搭配,特別的坑,
廢了我一個上午的時間去調試最佳的搭配是使用jdk1.7+spring-context-support-3.2.0.RELEASE.jar或者jdk1.8+spring 4.*來搭配,
在這里我采用了前者來解決!
--> 4 <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
 1 package cn.itcast.ssm.controller;  2 
 3 import java.util.ArrayList;  4 import java.util.List;  5 
 6 import org.springframework.stereotype.Controller;  7 import org.springframework.web.bind.annotation.RequestMapping;  8 import org.springframework.web.servlet.ModelAndView;  9 
10 import cn.itcast.ssm.po.Items; 11 
12 //使用Controller標識 它是一個控制器
13 @Controller 14 public class ItemsController3 { 15     
16     //商品查詢列表 17     //@RequestMapping實現 對queryItems方法和url進行映射,一個方法對應一個url 18     //一般建議將url和方法寫成一樣
19     @RequestMapping("/queryItems") 20     public ModelAndView queryItems()throws Exception{ 21         
22         //調用service查找 數據庫,查詢商品列表,這里使用靜態數據模擬
23         List<Items> itemsList = new ArrayList<Items>(); 24         //向list中填充靜態數據
25         
26         Items items_1 = new Items(); 27         items_1.setName("聯想筆記本"); 28  items_1.setPrice(6000f); 29         items_1.setDetail("ThinkPad T430 聯想筆記本電腦!"); 30         
31         Items items_2 = new Items(); 32         items_2.setName("蘋果手機"); 33  items_2.setPrice(5000f); 34         items_2.setDetail("iphone6蘋果手機!"); 35         
36  itemsList.add(items_1); 37  itemsList.add(items_2); 38         
39         //返回ModelAndView
40         ModelAndView modelAndView =  new ModelAndView(); 41         //相當 於request的setAttribut,在jsp頁面中通過itemsList取數據
42         modelAndView.addObject("itemsList", itemsList); 43         
44         //指定視圖 45         //下邊的路徑,如果在視圖解析器中配置jsp路徑的前綴和jsp路徑的后綴,修改為 46         //modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp"); 47         //上邊的路徑配置可以不在程序中指定jsp路徑的前綴和jsp路徑的后綴
48         modelAndView.setViewName("items/itemsList"); 49         return modelAndView; 50  } 51 }
ItemsController3代碼

    需要注意的是使用<mvc:annotation-driven></mvc:annotation-driven>可以代替

1  <!--注解映射器 -->
2     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
3 <!--注解適配器 -->
4     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

   並且mvc:annotation-driven默認加載很多的參數綁定方法,比如json轉換解析器就默認加載了,如果使用mvc:annotation-driven就不用配置上邊的RequestMappingHandlerMapping和RequestMappingHandlerAdapter,實際開發時使用mvc:annotation-driven。

    總結,無論使用哪種方法都要使用處理器映射器、處理器適配器這兩個基本的方式來對handler(controller)進行控制,處理器映射器解決的是找到URL對應的處理方法,而處理器適配器解決的是到底要怎么去處理我們的事務,這個handler的輸入輸出到底是什么樣子的,需不需要繼承一個父類等問題。因此這兩個東西和handler是關聯非常大的,在實際開發中我們都使用注解開發,除了形式上的簡單之外,容易配置,並且在原理上來說,非注解的開發方法只能在一個類中寫一個方法,做一件事情,這樣就會建立非常多的文件,而使用注解的開發方法方便靈活,便於控制,並且一個handler中可以包含很多個方法來暴露給不同的URL來訪問,這點非常方便。

三、視圖解析器

1    <!-- 視圖解析器 解析jsp解析,默認使用jstl標簽,classpath下的得有jstl的包-->
2     <bean 3         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
4                <!-- 配置jsp路徑的前綴 -->
5         <property name="prefix" value="/WEB-INF/jsp/"/>
6               <!-- 配置jsp路徑的后綴 -->
7         <property name="suffix" value=".jsp"/>
8     </bean>

    這也就解釋了,我們在程序里可以有恃無恐的這樣寫modelAndView.setViewName("items/itemsList");的原因。

四、日期類型的轉換(FormattingConversionServiceFactoryBean)

    在某些情況下,我們需要對UI上輸入的日期格式進行相應的轉換,變成我們數據庫中對應的格式並存儲,然后再顯示,這是很常見的,因此我們需要使用mvc:annotation-driven工具進行一定的配置。

 1     <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
 2         <!-- 自定義參數綁定 -->
 3     <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
 4         <!-- 轉換器 -->
 5         <property name="converters">
 6             <list>
 7                 <!-- 日期類型轉換 -->
 8                 <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
 9             </list>
10         </property>
11     </bean>
 1 package cn.itcast.ssm.controller.converter;  2 
 3 import java.text.ParseException;  4 import java.text.SimpleDateFormat;  5 import java.util.Date;  6 
 7 import org.springframework.core.convert.converter.Converter;  8 public class CustomDateConverter implements Converter<String,Date>{  9 
10  @Override 11     public Date convert(String source) { 12         
13         //實現 將日期串轉成日期類型(格式是yyyy-MM-dd HH:mm:ss)
14         
15         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 16         
17         try { 18             //轉成直接返回
19             return simpleDateFormat.parse(source); 20         } catch (ParseException e) { 21             // TODO Auto-generated catch block
22  e.printStackTrace(); 23  } 24         //如果參數綁定失敗返回null
25         return null; 26  } 27 }
CustomDateConverter 代碼

    Converter<String,Date>是一個模板,在這里我們將String類型轉換成Date類型來存儲到數據庫中。

五、解析靜態資源

1      <!-- 靜態資源解析包括 :js、css、img、..使得網頁可以訪問這些地址-->
2      <mvc:resources location="/js/" mapping="/js/**"/>
3      <mvc:resources location="/img/" mapping="/img/**"/>

六、校驗器

 1     <mvc:annotation-driven validator="validator"></mvc:annotation-driven>
 2 
 3     <!-- 校驗器 -->
 4     <bean id="validator"
 5  class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
 6               <!-- hibernate校驗器-->
 7         <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
 8                <!-- 指定校驗使用的資源文件,在文件中配置校驗錯誤信息,如果不指定則默認使用classpath下的ValidationMessages.properties -->
 9         <property name="validationMessageSource" ref="messageSource" />
10     </bean>
11                <!-- 校驗錯誤信息配置文件 -->
12     <bean id="messageSource"
13  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
14                     <!-- 資源文件名-->
15         <property name="basenames">   
16             <list>    
17             <value>classpath:CustomValidationMessages</value>
18             </list>   
19         </property>
20                  <!-- 資源文件編碼格式 -->
21         <property name="fileEncodings" value="utf-8" />
22                 <!-- 對資源文件內容緩存時間,單位秒 -->
23         <property name="cacheSeconds" value="120" />
24     </bean>

七、全局異常處理器

1     <!-- 全局異常處理器,只要實現HandlerExceptionResolver接口就是全局異常處理器-->
2     <bean class="cn.itcast.ssm.exception.CustomExceptionResolver"></bean>
 1 package cn.itcast.ssm.exception;  2 public class CustomException extends Exception {  3     
 4     //異常信息
 5     public String message;  6     
 7     public CustomException(String message){  8         super(message);  9         this.message = message; 10  } 11 
12     public String getMessage() { 13         return message; 14  } 15 
16     public void setMessage(String message) { 17         this.message = message; 18  } 19 }
CustomException
 1 package cn.itcast.ssm.exception;  2 
 3 import javax.servlet.http.HttpServletRequest;  4 import javax.servlet.http.HttpServletResponse;  5 
 6 import org.springframework.web.servlet.HandlerExceptionResolver;  7 import org.springframework.web.servlet.ModelAndView;  8 
 9 public class CustomExceptionResolver implements HandlerExceptionResolver { 10 
11  @Override 12     public ModelAndView resolveException(HttpServletRequest request, 13  HttpServletResponse response, Object handler, Exception ex) { 14         //handler就是處理器適配器要執行Handler對象(只有method) 15         
16 // 解析出異常類型 17 // 如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示 18 // String message = null; 19 // if(ex instanceof CustomException){ 20 // message = ((CustomException)ex).getMessage(); 21 // }else{
22 //// 如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”) 23 // message="未知錯誤"; 24 // } 25         
26         //上邊代碼變為
27         CustomException customException = null; 28         if(ex instanceof CustomException){ 29             customException = (CustomException)ex; 30         }else{ 31             customException = new CustomException("未知錯誤"); 32  } 33         
34         //錯誤信息
35         String message = customException.getMessage(); 36         
37         
38         ModelAndView modelAndView = new ModelAndView(); 39         
40         //將錯誤信息傳到頁面
41         modelAndView.addObject("message", message); 42         
43         //指向錯誤頁面
44         modelAndView.setViewName("error"); 45 
46         
47         return modelAndView; 48  } 49 
50 }
CustomExceptionResolver

八、文件上傳

1    <!-- 文件上傳 -->
2     <bean id="multipartResolver"
3  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
4         <!-- 設置上傳文件的最大尺寸為5MB -->
5         <property name="maxUploadSize">
6             <value>5242880</value>
7         </property>
8     </bean>

九、攔截器

 1     <!--攔截器 -->
 2 <mvc:interceptors>
 3     <!--多個攔截器,順序執行 -->
 4     <!-- 登陸認證攔截器 -->
 5     <mvc:interceptor>
 6         <mvc:mapping path="/**"/>
 7         <bean class="cn.itcast.ssm.interceptor.LoginInterceptor"></bean>
 8     </mvc:interceptor>
 9     <mvc:interceptor>
10         <!-- /**表示所有url包括子url路徑 -->
11         <mvc:mapping path="/**"/>
12         <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
13     </mvc:interceptor>
14     <mvc:interceptor>
15         <mvc:mapping path="/**"/>
16         <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
17     </mvc:interceptor>
18 </mvc:interceptors>
 1 package cn.itcast.ssm.interceptor;  2 
 3 import javax.servlet.http.HttpServletRequest;  4 import javax.servlet.http.HttpServletResponse;  5 
 6 import org.springframework.web.servlet.HandlerInterceptor;  7 import org.springframework.web.servlet.ModelAndView;  8 
 9 public class HandlerInterceptor1 implements HandlerInterceptor { 10     
11     //進入 Handler方法之前執行 12     //用於身份認證、身份授權 13     //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
14  @Override 15     public boolean preHandle(HttpServletRequest request, 16             HttpServletResponse response, Object handler) throws Exception { 17         
18         System.out.println("HandlerInterceptor1...preHandle"); 19         
20         //return false表示攔截,不向下執行 21         //return true表示放行
22         return true; 23  } 24 
25     //進入Handler方法之后,返回modelAndView之前執行 26     //應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這里傳到視圖,也可以在這里統一指定視圖
27  @Override 28     public void postHandle(HttpServletRequest request, 29  HttpServletResponse response, Object handler, 30             ModelAndView modelAndView) throws Exception { 31         
32         System.out.println("HandlerInterceptor1...postHandle"); 33         
34  } 35 
36     //執行Handler完成執行此方法 37     //應用場景:統一異常處理,統一日志處理
38  @Override 39     public void afterCompletion(HttpServletRequest request, 40  HttpServletResponse response, Object handler, Exception ex) 41             throws Exception { 42         
43         System.out.println("HandlerInterceptor1...afterCompletion"); 44  } 45 
46 }
HandlerInterceptor1
 1 package cn.itcast.ssm.interceptor;  2 
 3 import javax.servlet.http.HttpServletRequest;  4 import javax.servlet.http.HttpServletResponse;  5 
 6 import org.springframework.web.servlet.HandlerInterceptor;  7 import org.springframework.web.servlet.ModelAndView;  8 
 9 public class HandlerInterceptor2 implements HandlerInterceptor { 10 
11     
12     //進入 Handler方法之前執行 13     //用於身份認證、身份授權 14     //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
15  @Override 16     public boolean preHandle(HttpServletRequest request, 17             HttpServletResponse response, Object handler) throws Exception { 18         
19         System.out.println("HandlerInterceptor2...preHandle"); 20         
21         //return false表示攔截,不向下執行 22         //return true表示放行
23         return true; 24  } 25 
26     //進入Handler方法之后,返回modelAndView之前執行 27     //應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這里傳到視圖,也可以在這里統一指定視圖
28  @Override 29     public void postHandle(HttpServletRequest request, 30  HttpServletResponse response, Object handler, 31             ModelAndView modelAndView) throws Exception { 32         
33         System.out.println("HandlerInterceptor2...postHandle"); 34         
35  } 36 
37     //執行Handler完成執行此方法 38     //應用場景:統一異常處理,統一日志處理
39  @Override 40     public void afterCompletion(HttpServletRequest request, 41  HttpServletResponse response, Object handler, Exception ex) 42             throws Exception { 43         
44         System.out.println("HandlerInterceptor2...afterCompletion"); 45  } 46 
47 }
HandlerInterceptor2
 1 package cn.itcast.ssm.interceptor;  2 
 3 import javax.servlet.http.HttpServletRequest;  4 import javax.servlet.http.HttpServletResponse;  5 import javax.servlet.http.HttpSession;  6 
 7 import org.springframework.web.servlet.HandlerInterceptor;  8 import org.springframework.web.servlet.ModelAndView;  9 
10 public class LoginInterceptor implements HandlerInterceptor { 11 
12     
13     //進入 Handler方法之前執行 14     //用於身份認證、身份授權 15     //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
16  @Override 17     public boolean preHandle(HttpServletRequest request, 18             HttpServletResponse response, Object handler) throws Exception { 19         
20         //獲取請求的url
21         String url = request.getRequestURI(); 22         //判斷url是否是公開 地址(實際使用時將公開 地址配置配置文件中) 23         //這里公開地址是登陸提交的地址
24         if(url.indexOf("login.action")>=0){ 25             //如果進行登陸提交,放行
26             return true; 27  } 28         
29         //判斷session
30         HttpSession session  = request.getSession(); 31         //從session中取出用戶身份信息
32         String username = (String) session.getAttribute("username"); 33         
34         if(username != null){ 35             //身份存在,放行
36             return true; 37  } 38         
39         //執行這里表示用戶身份需要認證,跳轉登陸頁面
40         request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); 41         
42         //return false表示攔截,不向下執行 43         //return true表示放行
44         return false; 45  } 46 
47     //進入Handler方法之后,返回modelAndView之前執行 48     //應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這里傳到視圖,也可以在這里統一指定視圖
49  @Override 50     public void postHandle(HttpServletRequest request, 51  HttpServletResponse response, Object handler, 52             ModelAndView modelAndView) throws Exception { 53         
54         System.out.println("HandlerInterceptor1...postHandle"); 55         
56  } 57 
58     //執行Handler完成執行此方法 59     //應用場景:統一異常處理,統一日志處理
60  @Override 61     public void afterCompletion(HttpServletRequest request, 62  HttpServletResponse response, Object handler, Exception ex) 63             throws Exception { 64         
65         System.out.println("HandlerInterceptor1...afterCompletion"); 66  } 67 
68 }
LoginInterceptor

十、小記
   SpringMVC博大精深,是Spring的一個模塊,是一種web框架,將MVC應用於B/S模式中,將每一個步驟進行了詳細而徹底的解耦合,雖然步驟復雜了一些,真正需要我們實現的地方還是可以承受的,最重要的就是xml的配置文件了,比如說關於DispatcherServlet運行的配置文件(一般命名為springmvc.xml)就包含了這個思想內涵的很多地方,同樣這一框架也有強大的安全性和可擴展性,諸如面向切面編程(AOP)等思想都是有着強大生命力的,再加上和mybatis結合,適合一些大中型的企業級項目,學會SpringMVC有着很大的現實意義和使用價值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM