Spring MVC學習總結(2)——Spring MVC經常使用註解說明

    使用Spring MVC的註解及其用法和其它相關知識來實現控制器功能。
02     以前在使用Struts2實現MVC的註解時,是藉助struts2-convention這個插件,現在咱們使用Spring自帶的spring-webmvc組件來實現一樣的功能,並且比之之前更簡單。另外,還省掉了整合兩個框架帶來的不穩定因素。
03     對於Spring MVC框架,我主要講一下它的經常使用註解,再結合一些示例進行說明,方便你們可以快速理解。
04     1、Spring MVC經常使用註解說明
05     @Controller
06     在類上面定義,代表該類爲控制器,返回字符串與redirect:xxx
07     @RequestMapping
08     在類或方法上面使用此註解,設置URL訪問地址。它有兩個屬性,value指定訪問路徑,method指定指定請求方式,請求方式在RequestMethod這個類中,所有以常量形式定義,它默認使用GET請求。
09     @RequestParam
10     指定Request請求參數,在方法參數中定義,至關於傳統的request.getParameter()。
11     @PathVariable
12     獲取URL訪問路徑變量,這是Spring MVC 3.0框架才加入的特性,基於RESTful風格的URL訪問路徑。
13     @ModelAttribute
14 全局式的方法,在一組URL訪問路徑中,每次都會執行,方法返回結果保存在module會話中。
15     @Service
16     在類上面定義,指定被註解的類是業務邏輯組件,若是不指定具體的Bean ID,則採用默認命名方式,即類名的首字母小寫。以前在SSH2中,大象曾對Dao組件使用@Repository,本例只有業務層,因此就只用@Service註解。
17     @Autowired
18     IoC自動注入功能,替換之前的set寫法,在SSH2中就已經開始使用了。
19     @Qualifier
20     對同一接口類有不一樣實現指定具體的實現類。
21     @ResponseBody
22     一樣定義在方法上,Ajax調用聲明,指定方法返回結果爲Ajax回調函數結果。這是Spring MVC3.0框架中增長的一個新特性。
23     @InitBinder
24     初始化數據綁定與類型轉換,將傳入的參數轉換爲自定義類型,或者對參數進行自定義處理。
25     2、示例
26       
27     @RequestMapping在類名上面定義,至關於指定的URL是此控制器內的全部其它訪問路徑的父路徑。若是在某個方法上面定義@RequestMapping註解,則相對於父路徑來講,是其子路徑。若是不定義value值,那麼按父路徑訪問就會被默認執行。但請注意,默認的訪問方式只能有一個。
28     對於UserController的list方法REST訪問URL爲http://localhost:8080/ssm3/user,並且它同時接收GET和POST兩種請求。另外,Spring MVC 3.0有一個很靈活的特性,能夠自定義方法參數。看看list方法,我設定了兩個參數,一個Model,一個User對象。Model是用來渲染數據,生成頁面用的。至關於request.setAttribute,你能夠這樣理解,但不能就這樣認爲,Model以及另外一個ModelMap,都是做爲視圖模型傳遞參數的,它們的做用域爲request。除此以外,你還能夠定義HttpServletRequest、HttpServletResponse等等各類各樣的參數。
29 若是一個類還要定義其它資源訪問怎麼辦呢?請看下面的RoleController
30       
31     在RoleController上定義了全局路徑/role,這樣一來,對於和角色相關的資源都會以/role開頭,好比建立角色/role/new;編輯角色/role/edit/{id}等等。
32     上圖edit方法中的{id}寫法,就是RESTful URL風格,與@PathVariable搭配來一塊兒實現該功能。它表示所請求的URL中,能夠將變量值做爲參數進行動態的傳遞。例如:http://localhost:8080/ssm3/role/edit/1,另外,除了能夠用數字,還能夠用字符串,還能夠多定義幾個變量:/role/edit/{id}/{type}等等。
33     每一個方法的返回值,其實都對應着一個結果頁面,這一點和struts2-convention這個插件很相像。本例使用FreeMarker模板引擎做爲展現層,頁面的後綴爲.html,頁面中除了標準的HTML以外,其他的數據填充,條件判斷之類,都要用到FreeMarker指令。
34     對於save方法返回值寫法表示的是重定向,至關於執行http://localhost:8080/ssm3/role,而這個URL對應的其實就是RoleController這個類裏面list方法。若是要帶上參數之類的,必定要符合所定義的REST資源路徑才能夠。
35       
36
37     @ResponseBody用來標識Ajax方法調用,在上面這個方法中,用到了@RequestParam註解,它的做用就和request.getParameter("name")同樣。Spring MVC框架支持好幾種返回格式,例如:String/JSON/XML等等。不過以這種格式的字符串值形式返回是最簡便的一種方式,並且利用JavaScript解析也十分方便。頁面調用的時候請用jQuery的$.ajax()這種原生方式來定義,這種寫法不會出問題,也很靈活,並且其它幾種方式最終也是調用它來完成請求。
38       
39     對於擁有相同的一組訪問規則的URL,若是都須要得到相同的數據,則使用@ModelAttribute註解。以RoleController爲例,上面這個註解與方法的含義,至關因而在它裏面全部的訪問路徑方法中都調用這個寫法:module.addAttribute(「allRoles」,roleService.getRoles())。也即,不論是訪問create仍是edit,都會執行preperList,都會得到allRoles這個List。
40       
41     註冊自定義類型編輯器,在Spring MVC中,對於時間類型,框架不會自動幫你轉換綁定,須要你本身來定義屬性編輯器。除此以外,還能夠對某些特殊字符進行轉義符處理,均可以放在@InitBinder註解的方法中進行。若是全部的Controller都須要註冊相同的屬性編輯器,則能夠實現WebBindingInitializer接口,定義一個全局的屬性編輯器。
42     3、在web容器中部署
43     想要讓Spring MVC框架幫助咱們完成工做,就須要在Web容器中配置好它。
44       
45     DispatcherServlet是Spring MVC的核心,是處理一切請求轉發的核心控制器。大象曾在本系列的第二篇文章中就詳細描述了Spring MVC的流程結構,若是沒什麼印象的話請再去看看。
46     Spring MVC有一個默認規則,Web容器啓動以後,會自動查找/WEB-INF/<servlet-name>.xml這個Spring類型的配置文件。若是想自定義配置文件路徑,就按上面的寫法,指定contextConfiglocation這個屬性,大象採用maven構建項目,因此servlet-context.xml這個配置文件放在resource目錄下。
47     4、MVC配置
48     Spring MVC 3.0對使用和配置做了較大的改進,除了提供註解來簡化控制器的開發以外,在配置文件上面也進行了簡化。
49       
50     基於Spring MVC註解的配置就是上面這兩行,還有一種更簡化的配置寫法是隻寫這一句:<mvc:annotation-driven />就能夠了,Spring啓動的時候會自動註冊上面這兩個bean。爲何大象要在這裏顯示的註冊兩個bean呢?由於,咱們在真正使用的時候,通常來講,使用默認的方式知足不了咱們的系統或業務要求。好比攔截器,好比數據驗證,好比返回消息格式轉換等等一些自定義設置。他們都須要配置在這兩個bean裏面。由於本例是用來做爲入門教程,因此這些東西都沒有加進來。
51     DefaultAnnotationHandlerMapping這個類是將全部標註了@RequestMapping註解的Controller類,都放到了一個HandlerMapping對象中,當有請求時,就在這個對象中進行查找是否有與之匹配的路徑,AnnotationMethodHandlerAdapter是管理全部@RequestMapping註解的方法。
詳解:

@RestController :首先咱們使用的是Spring 4的新註解 @RestController註解. html

此註解避免了每一個方法都要加上@ResponseBody註解。也就是說@RestController 本身戴上了 @ResponseBody註解,看以看做是web

 @Controller 和 @ResponseBody的結合體。ajax

@RequestBody : 若是方法參數被 @RequestBody註解,Spring將綁定HTTP請求體到那個參數上。若是那樣作,Spring將根據請求中的ACCEPT或者 Content-Type header(私下)使用 HTTP Message converters 來將http請求體轉化爲domain對象。spring

@ResponseBody : 若是方法加上了@ResponseBody註解,Spring返回值到響應體。若是這樣作的話,Spring將根據請求中的 Content-Type header(私下)使用 HTTP Message converters 來將domain對象轉換爲響應體。mvc

ResponseEntity 是一個真實數據.它表明了整個 HTTP 響應(response). 它的好處是你能夠控制任何對象放到它內部。app

你能夠指定狀態碼、頭信息和響應體。它包含你想要構建HTTP Response 的信息。框架

@PathVariable 此註解意味着一個方法參數應該綁定到一個url模板變量[在'{}'裏的一個]dom

通常來講你,要實現REST API in Spring 4 須要瞭解@RestController , @RequestBody, ResponseEntity 和 @PathVariable 這些註解 .另外, spring 也提供了一些支持類幫助你實現一些可定製化的東西。maven

MediaType : 帶着 @RequestMapping 註解,經過特殊的控制器方法你能夠額外指定,MediaType來生產或者消耗。編輯器

相關文章
相關標籤/搜索