關於springMVC中component-scan的問題以及springmvc.xml整理
css
1、component-scan問題和解決辦法java
最近在學習使用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的方法進行數據即代碼配置,好處是很是大的,可是錯誤就是難以找到哪一個地方出問題了,一旦出現了一個這種相關度很是低的錯誤,每每是很是費時間的,不利於測試和排錯,所以在這裏作一整理和總結。web
2、註解和非註解的方式總結spring
2.一、非註解的方式
2.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.二、 方法二 編程
這裏注意,咱們在上面定義了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的定義保持一致,映射器只與映射器的定義方法有關!!!!
json
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 }
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 }
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 }
須要注意的是使用<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。
session
總結,不管使用哪一種方法都要使用處理器映射器、處理器適配器這兩個基本的方式來對handler(controller)進行控制,處理器映射器解決的是找到URL對應的處理方法,而處理器適配器解決的是到底要怎麼去處理咱們的事務,這個handler的輸入輸出究竟是什麼樣子的,需不須要繼承一個父類等問題。所以這兩個東西和handler是關聯很是大的,在實際開發中咱們都使用註解開發,除了形式上的簡單以外,容易配置,而且在原理上來講,非註解的開發方法只能在一個類中寫一個方法,作一件事情,這樣就會創建很是多的文件,而使用註解的開發方法方便靈活,便於控制,而且一個handler中能夠包含不少個方法來暴露給不一樣的URL來訪問,這點很是方便。
3、視圖解析器
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");的緣由。
4、日期類型的轉換(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 }
Converter<String,Date>是一個模板,在這裏咱們將String類型轉換成Date類型來存儲到數據庫中。
5、解析靜態資源
1 <!-- 靜態資源解析包括 :js、css、img、..使得網頁能夠訪問這些地址-->
2 <mvc:resources location="/js/" mapping="/js/**"/>
3 <mvc:resources location="/img/" mapping="/img/**"/>
6、校驗器
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>
7、全局異常處理器
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 }
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 }
8、文件上傳
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>
9、攔截器
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 }
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 }
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 }
10、小記
SpringMVC博大精深,是Spring的一個模塊,是一種web框架,將MVC應用於B/S模式中,將每個步驟進行了詳細而完全的解耦合,雖然步驟複雜了一些,真正須要咱們實現的地方仍是能夠承受的,最重要的就是xml的配置文件了,好比說關於DispatcherServlet運行的配置文件(通常命名爲springmvc.xml)就包含了這個思想內涵的不少地方,一樣這一框架也有強大的安全性和可擴展性,諸如面向切面編程(AOP)等思想都是有着強大生命力的,再加上和mybatis結合,適合一些大中型的企業級項目,學會SpringMVC有着很大的現實意義和使用價值。