1、Spring2.5以前,咱們都是經過實現Controller接口或其實現來定義咱們的處理器類。已經@Deprecated。
html
2、Spring2.5引入註解式處理器支持,經過@Controller 和 @RequestMapping註解定義咱們的處理器類。
java
而且提供了一組強大的註解:
web
須要經過處理器映射DefaultAnnotationHandlerMapping和處理器適配器
spring
AnnotationMethodHandlerAdapter
來開啓支持@Controller 和json
@RequestMapping註解的處理器。服務器
@Controller:
用於標識是處理器類;
cookie
@RequestMapping:
請求處處理器功能方法的映射規則;
session
@RequestParam:
請求參數處處理器功能處理方法的方法參數上的綁定;
架構
@ModelAttribute:
請求參數到命令對象的綁定;
mvc
@SessionAttributes:
用於聲明session級別存儲的屬性,放置在處理器類上,一般列出
模型屬性(如@ModelAttribute)
對應的名稱,
則這些屬性會透明的保存到session中;
@InitBinder:
自定義數據綁定註冊支持,用於將請求參數轉換到命令對象屬性的對應類型;
3、Spring3.0引入RESTful架構風格支持(經過@PathVariable註解和一些其餘特性支持),且又引入了
更多的註解支持:
@CookieValue:
cookie數據處處理器功能處理方法的方法參數上的綁定;
@RequestHeader:
請求頭(header)數據處處理器功能處理方法的方法參數上的綁定;
@RequestBody:
請求的body體的綁定(經過HttpMessageConverter進行類型轉換);
@ResponseBody:
處理器功能處理方法的返回值做爲響應體(經過HttpMessageConverter進行類型轉換);
@ResponseStatus:
定義處理器功能處理方法/異常處理器返回的狀態碼和緣由;
@ExceptionHandler:
註解式聲明異常處理器;
@PathVariable:
請求URI中的模板變量部分處處理器功能處理方法的方法參數上的綁定,
從而支持RESTful架構風格的URI;
4、Spring3.1使用新的HandlerMapping 和 HandlerAdapter來支持@Contoller和@RequestMapping
註解處理器。
新的@Contoller和@RequestMapping註解支持類:處理器映射RequestMappingHandlerMapping
和
處理器適配器RequestMappingHandlerAdapter組合來代替Spring2.5開始的處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter,
提供更多的擴展點。
接下來,咱們一塊兒開始學習基於註解的控制器吧。
②、④、⑥通常是可變的,所以咱們能夠這些信息進行請求處處理器的功能處理方法的映射,
所以請求的映射分爲以下幾種:
URL路徑映射:使用URL映射請求處處理器的功能處理方法;
請求方法映射限定:如限定功能處理方法只處理GET請求;
請求參數映射限定:如限定只處理包含「abc」請求參數的請求;
請求頭映射限定:如限定只處理「Accept=application/json」的請求。
接下來看看具體如何映射吧。
6.二、入門
(一、控制器實現
能夠經過在一個POJO類上放置@Controller或@RequestMapping,便可把一個POJO類變身爲處理器;
@RequestMapping(value = "/hello")
請求URL(/hello) 到 處理器的功能處理方法的映射;
模型數據和邏輯視圖名的返回。
如今的處理器無需實現/繼承任何接口/類,只須要在相應的類/方法上放置相應的註解說明下便可,
很是方便。
(二、Spring配置文件chapter6-servlet.xml
(2.一、HandlerMapping和HandlerAdapter的配置
若是您使用的是Spring3.1以前版本,開啓註解式處理器支持的配置爲:
DefaultAnnotationHandlerMapping
和AnnotationMethodHandlerAdapter。
若是您使用的Spring3.1開始的版本,建議使用RequestMappingHandlerMapping
和RequestMappingHandlerAdapter。
下一章咱們介紹DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
與RequestMappingHandlerMapping和RequestMappingHandlerAdapter 的區別。
(2.二、視圖解析器的配置
仍是使用以前的org.springframework.web.servlet.view.InternalResourceViewResolver。
(2.三、處理器的配置
只須要將處理器實現類註冊到spring配置文件便可,spring的DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping
能根據註解@Controller或@RequestMapping自動發現。
(2.四、視圖頁面(/WEB-INF/jsp/hello.jsp)
${message}:表示顯示由HelloWorldController處理器傳過來的模型數據。
(四、啓動服務器測試
地址欄輸入http://localhost:9080/springmvc-chapter6/hello,咱們將看到頁面顯示「Hello World!」,
表示成功了。
整個過程和咱們第二章中的Hello World 相似,只是處理器的實現不同。接下來咱們來看一下具體流程吧。
6.三、運行流程
和第二章惟一不一樣的兩處是:
一、HandlerMapping實現:使用DefaultAnnotationHandlerMapping(spring3.1以前)或RequestMappingHandlerMapping(spring3.1)
替換以前的BeanNameUrlHandlerMapping。
註解式處理器映射會掃描spring容器中的bean,發現bean實現類上擁有
@Controller或@RequestMapping註解的bean,
並將它們做爲處理器。
二、HandlerAdapter實現:使用AnnotationMeth
odHandlerAdapter(spring3.1以前)或RequestMappingHandlerAdapter(spring3.1)替換以前的SimpleControllerHandlerAdapter。
註解式處理器適配器會經過反射調用相應的功能處理方法(方法上擁有@RequestMapping註解
)。
好了到此咱們知道Spring如何發現處理器、如何調用處理的功能處理方法了,接下來咱們
詳細學習下如何定義處理器、如何進行請求到功能處理方法的定義。
推薦使用這種方式聲明處理器,它和咱們的@Service、@Repository很好的對應了咱們常見的三層開發架構的組件。
這種方式也是能夠工做的,但若是在類上使用@ RequestMapping註解通常是用於
窄化功能處理方法的映射的,詳見6.4.3。
①類上的@RequestMapping(value="/user") 表示處理器的通用請求前綴;
②處理器功能處理方法上的是對①處映射的窄化。
所以http://localhost:9080/springmvc-chapter6/hello2 沒法映射到HelloWorldController2的 helloWorld功能處理方法;而http://localhost:9080/springmvc-chapter6/user/hello2是能夠的。
窄化請求映射能夠認爲是方法級別的@RequestMapping繼承類級別的@RequestMapping。
窄化請求映射還有其餘方式,如在類級別指定URL,而方法級別指定請求方法類型或參數等等,
後續會詳細介紹。
到此,咱們知道如何定義處理器了,接下來咱們須要學習如何把請求映射到相應的功能處理方法
進行請求處理。
處理器定義好了,那接下來咱們應該定義功能處理方法,接收用戶請求處理並選擇視圖進行渲染。
首先咱們看一下圖6-1:
http請求信息包含六部分信息:
①請求方法,如GET或POST,表示提交的方式;
②URL,請求的地址信息;
③協議及版本;
④請求頭信息(包括Cookie信息);
⑤回車換行(CRLF);
⑥請求內容區(即請求的內容或數據),如表單提交時的參數數據、URL請求參數(?abc=123 ?後邊的)等。
想要了解HTTP/1.1協議,請訪問http://tools.ietf.org/html/rfc2616。
那此處咱們能夠看到有①、②、④、⑥通常是可變的,所以咱們能夠這些信息進行請求到
處理器的功能處理方法的映射,所以請求的映射分爲以下幾種:
URL路徑映射:使用URL映射請求處處理器的功能處理方法;
請求方法映射限定:如限定功能處理方法只處理GET請求;
請求參數映射限定:如限定只處理包含「abc」請求參數的請求;
請求頭映射限定:如限定只處理「Accept=application/json」的請求。
接下來看看具體如何映射吧。