@RequestParam,你必定見過;@PathVariable,你確定也知道;@QueryParam,你怎麼會不曉得?!還有你熟悉的他(@CookieValue)!她(@ModelAndView)!它(@ModelAttribute)!沒錯,僅註解這塊,spring mvc就爲你打開了五彩斑斕的世界。來來來,不要興(mi)奮(hu),坐下來,咱們好好聊聊這麼些個註解兄弟們~~~(wait, 都沒有聽過? 好,來,你坐前排,就你!)html
@RequestMapping是用來映射請求的,好比get請求,post請求,或者REST風格與非REST風格的。 該註解能夠用在類上或者方法上,若是用於類上,表示該類中全部方法的父路徑。java
舉例(這裏用到的測試類如SpringMVCTest以及一些頁面在第一篇《學習SpringMVC——從HelloWorld開始》中已經介紹):web
SpringMVCTest.java中加入測試方法:spring
@RequestMapping("/testRequestMapping") public String testRequestMapping(){ System.out.println("testRequestMapping"); return SUCCESS; }
注意這裏在方法級別上添加了註解@RequestMapping(「/testRequestMapping」), 表示能夠經過「/testRequestMapping」相對路徑來定位到這個方法,同時咱們在SpringMVCTest類上也放了一個類級別的RequestMapping的註解:tomcat
@RequestMapping("/springmvc") @Controller public class SpringMVCTest {
注意這裏還添加了一個@Controller的註解,該註解在SpringMVC 中,負責處理由DispatcherServlet 分發的請求,它把用戶請求的數據通過業務處理層處理以後封裝成一個Model ,而後再把該Model 返回給對應的View 進行展現。至此有了一個「springmvc/testRequestMapping」這樣的路徑,咱們就可以定位到testRequestMapping這個方法上,而後執行方法內的方法體。cookie
再補充一點,RequestMapping能夠實現模糊匹配路徑,好比:mvc
?:匹配一個字符app
*:匹配任意字符框架
**:匹配多層路徑jsp
/springmvc/**/lastTest 就能夠匹配/springmvc/firstTest/secondTest/lastTest這樣的路徑
1. @PathVariable
該註解用來映射請求URL中綁定的佔位符。經過@PathVariable能夠將URL中佔位符的參數綁定到controller處理方法的入參中,沒聽懂?看例子:
@RequestMapping("/testPathVariable/{id}") public String testPathVariable(@PathVariable(value="id") Integer id){ System.out.println("testPathVariable:" + id); return SUCCESS; }
在index.jsp中咱們添加一條鏈接,用來觸發一個請求:
<a href="springmvc/testPathVariable/1">testPathVariable</a><br/><br/>
咱們能夠看到這裏有一個超連接,點擊後會進入到springmvc/testPathVariable/1對應的controller處理的方法中,那咱們如今就是想獲取到這個請求參數中的「1」,因此在testPathVariable方法上加入「/testPathVariable/id」,關於id」,關於{id}的具體對應在該方法的參數中,經過@PathVariable(value="id")來聲明要接收的請求參數,並經過Integer id來綁定和接收。經過該種方式,咱們就能夠獲得前臺頁面請求的參數「1」。
2. @RequestParam
該註解也是用來獲取請求參數的。那麼該註解和@PathVariable有何不一樣呢? 仍是看例子:
在SpringMVCTest中添加方法
@RequestMapping(value="/testRequestParam") public String testRequestParam(@RequestParam(value="username") String username, @RequestParam(value="age", required=false, defaultValue="0") int age){ System.out.println("testRequestParam" + " username:" + username + " age:" +age); return SUCCESS; }
在index.jsp添加超連接標籤
<a href="springmvc/testRequestParam?username=jackie&age=12">testRequestParam</a><br/><br/>
點擊頁面上的超連接,就會匹配controller中testRequestParam方法上的RequestMapping的路徑。注意在該方法中,咱們經過@RequestParam這個註解聲明瞭兩個變量,用來獲取請求中query所帶的參數值,一個是username後的值,另外一個是age後面的值。
看到這裏,你大概已經明白了@PathVariable和@RequestParam之間的一些區別了吧,對於像「springmvc/testPathVariable/1」這樣的請求,咱們經過@PathVariable來綁定請求的參數;而對於相似「springmvc/testRequestParam?username=jackie&age=12」這樣的請求參數是以鍵值對出現的,咱們經過@RequestParam來獲取到如username或age後的具體請求值。
與RequestParam有殊途同歸用法的還有QueryParam,因其不是spring mvc框架內的註解,這裏再也不詳述。
對於不一樣的請求類型和請求方式,spring mvc都有一套針對的解決方案,下面咱們來看看當下比較流行的REST風格的請求是啥樣的——利用REST風格實現增刪改查。
在SpringMVCTest類中自下而上的實現了查(get)增(post)刪(delete)和改(put)的接口
@RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT) public String testRestPut(@PathVariable(value="id") Integer id){ System.out.println("test put:" + id); return SUCCESS; } @RequestMapping(value="/testRest/{id}", method=RequestMethod.DELETE) public String testRestDelete(@PathVariable(value="id") Integer id){ System.out.println("test delete:" + id); return SUCCESS; } @RequestMapping(value="/testRest", method=RequestMethod.POST) public String testRest(){ System.out.println("test post"); return SUCCESS; } @RequestMapping(value="/testRest/{id}", method=RequestMethod.GET) public String testRest(@PathVariable(value="id") Integer id){ System.out.println("test get:" + id); return SUCCESS; }
那麼前臺界面如何實現呢,相對應的順序爲
<form action="springmvc/testRest/1" method="post"> <input type="hidden" name="_method" value= "PUT"/> <input type="submit" value="testRestPut"/> </form><br/><br/> <form action="springmvc/testRest/1" method="post"> <input type="hidden" name="_method" value="DELETE"/> <input type="submit" value="TestRest DELETE"/> </form><br><br> <form action="springmvc/testRest" method="post"> <input type="submit" value="testRestPost"> </form><br/><br/> <a href="springmvc/testRest/1">testRest</a><br/><br/>
除此以外,咱們還須要在配置文件web.xml中添加支持將post轉化爲delete和put請求的聲明
<!-- 配置HiddenHttpMethodFilter:能夠把POST請求轉爲DELETE或POST請求 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
如你所見,這裏的改和刪都是經過post的方式發送出去的,由於這裏不支持put和delete來直接實現刪改,而是經過藉助post方式,並悄悄的帶上一塊令牌hidden類型的input標籤來告訴後臺我在前臺發送的其實是刪和改的請求。
那麼這個過程時如何實現的呢,爲何加上
<input type="hidden" name="_method" value="DELETE"/>
這塊令牌,人家後臺就要買你的帳呢。那咱們就來看看後來是如何買帳的吧。
歸根到底仍是得益於添加在web.xml中的HiddenHttpMethodFilter這個類,在該類中有一個方法doFilterInternal, 經過調試咱們能夠發現其中端倪,啓動tomcat(不能是tomcat8),點擊delete操做對應的input標籤,進入調試界面,咱們能夠看到:
小坑:這裏注意啓動不能是tomcat8,而只能是比8小的版本,如7或6等,下圖展現了用tomcat的報錯信息和用7的成功響應:
總結下,如何發送put和delete的請求:
最後再來講下@CookieValue這個註解。
3. @CookieValue
該註解也是差很少的套路,也是一種映射,映射的是一個Cookie值。
在咱們發送一個請求時,咱們能夠看到請求中攜帶了一些cookie值
好比這裏的JSESSIONID或者Path等。如今咱們就寫個方法用於獲取Cookie值。
在SpringMVCTest中添加
@RequestMapping(value="/testCookieValue") public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){ System.out.println("testCookieValue: " + cookieValue); return SUCCESS; }
index.jsp界面上添加連接
<a href="springmvc/testCookieValue">testCookieValue</a><br/><br/>
這樣咱們就能夠獲得相似「testCookieValue: 1410F05C9ADD84E8659C2AC79E8CC666」這樣的結果。
至此,咱們介紹了
到這就完美謝幕了——憋說話,讚我