@RequestParam,你一定見過;@PathVariable,你肯定也知道;@QueryParam,你怎么會不曉得?!還有你熟悉的他(@CookieValue)!她(@ModelAndView)!它(@ModelAttribute)!沒錯,僅注解這塊,spring mvc就為你打開了五彩斑斕的世界。來來來,不要興(mi)奮(hu),坐下來,我們好好聊聊這么些個注解兄弟們~~~(wait, 都沒有聽過? 好,來,你坐前排,就你!) 一、spring mvc如何匹配請求路徑——“請求路徑哪家強,RequestMapping名遠揚”@RequestMapping是用來映射請求的,比如get請求,post請求,或者REST風格與非REST風格的。 該注解可以用在類上或者方法上,如果用于類上,表示該類中所有方法的父路徑。 舉例(這里用到的測試類如SpringMVCTest以及一些頁面在第一篇《學習SpringMVC——從HelloWorld開始》中已經(jīng)介紹): SpringMVCTest.java中加入測試方法: @RequestMapping('/testRequestMapping') public String testRequestMapping(){ System.out.println('testRequestMapping'); return SUCCESS; } 注意這里在方法級別上添加了注解@RequestMapping(“/testRequestMapping”), 表示可以通過“/testRequestMapping”相對路徑來定位到這個方法,同時我們在SpringMVCTest類上也放了一個類級別的RequestMapping的注解: @RequestMapping('/springmvc') @Controller public class SpringMVCTest { 注意這里還添加了一個@Controller的注解,該注解在SpringMVC 中,負責處理由DispatcherServlet 分發(fā)的請求,它把用戶請求的數(shù)據(jù)經(jīng)過業(yè)務處理層處理之后封裝成一個Model ,然后再把該Model 返回給對應的View 進行展示。至此有了一個“springmvc/testRequestMapping”這樣的路徑,我們就能夠定位到testRequestMapping這個方法上,然后執(zhí)行方法內(nèi)的方法體。 再補充一點,RequestMapping可以實現(xiàn)模糊匹配路徑,比如: ?:匹配一個字符 *:匹配任意字符 **:匹配多層路徑 /springmvc/**/lastTest 就可以匹配/springmvc/firstTest/secondTest/lastTest這樣的路徑 二、spring mvc如何獲取請求的參數(shù)——“八仙過海,各顯神通”1. @PathVariable 該注解用來映射請求URL中綁定的占位符。通過@PathVariable可以將URL中占位符的參數(shù)綁定到controller處理方法的入?yún)⒅校瑳]聽懂?看例子: @RequestMapping('/testPathVariable/{id}') public String testPathVariable(@PathVariable(value='id') Integer id){ System.out.println('testPathVariable:' id); return SUCCESS; } 在index.jsp中我們添加一條連接,用來觸發(fā)一個請求: <a href='springmvc/testPathVariable/1'>testPathVariable</a><br/><br/> 我們可以看到這里有一個超鏈接,點擊后會進入到springmvc/testPathVariable/1對應的controller處理的方法中,那我們現(xiàn)在就是想獲取到這個請求參數(shù)中的“1”,所以在testPathVariable方法上加入“/testPathVariable/id”,關于id”,關于{id}的具體對應在該方法的參數(shù)中,通過@PathVariable(value='id')來聲明要接收的請求參數(shù),并通過Integer id來綁定和接收。通過該種方式,我們就可以得到前臺頁面請求的參數(shù)“1”。 2. @RequestParam 該注解也是用來獲取請求參數(shù)的。那么該注解和@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所帶的參數(shù)值,一個是username后的值,另一個是age后面的值。 看到這里,你大概已經(jīng)明白了@PathVariable和@RequestParam之間的一些區(qū)別了吧,對于像“springmvc/testPathVariable/1”這樣的請求,我們通過@PathVariable來綁定請求的參數(shù);而對于類似“springmvc/testRequestParam?username=jackie&age=12”這樣的請求參數(shù)是以鍵值對出現(xiàn)的,我們通過@RequestParam來獲取到如username或age后的具體請求值。 與RequestParam有異曲同工用法的還有QueryParam,因其不是spring mvc框架內(nèi)的注解,這里不再詳述。 對于不同的請求類型和請求方式,spring mvc都有一套針對的解決方案,下面我們來看看當下比較流行的REST風格的請求是啥樣的——利用REST風格實現(xiàn)增刪改查。 在SpringMVCTest類中自下而上的實現(xiàn)了查(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; } 那么前臺界面如何實現(xiàn)呢,相對應的順序為 <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轉(zhuǎn)化為delete和put請求的聲明 <!-- 配置HiddenHttpMethodFilter:可以把POST請求轉(zhuǎn)為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的方式發(fā)送出去的,因為這里不支持put和delete來直接實現(xiàn)刪改,而是通過借助post方式,并悄悄的帶上一塊令牌hidden類型的input標簽來告訴后臺我在前臺發(fā)送的實際上是刪和改的請求。 那么這個過程時如何實現(xiàn)的呢,為什么加上 <input type='hidden' name='_method' value='DELETE'/> 這塊令牌,人家后臺就要買你的賬呢。那我們就來看看后來是如何買賬的吧。 歸根到底還是得益于添加在web.xml中的HiddenHttpMethodFilter這個類,在該類中有一個方法doFilterInternal, 通過調(diào)試我們可以發(fā)現(xiàn)其中端倪,啟動tomcat(不能是tomcat8),點擊delete操作對應的input標簽,進入調(diào)試界面,我們可以看到:
小坑:這里注意啟動不能是tomcat8,而只能是比8小的版本,如7或6等,下圖展示了用tomcat的報錯信息和用7的成功響應: 總結下,如何發(fā)送put和delete的請求:
最后再來說下@CookieValue這個注解。 3. @CookieValue 該注解也是差不多的套路,也是一種映射,映射的是一個Cookie值。 在我們發(fā)送一個請求時,我們可以看到請求中攜帶了一些cookie值 比如這里的JSESSIONID或者Path等?,F(xiàn)在我們就寫個方法用于獲取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”這樣的結果。 至此,我們介紹了
到這就完美謝幕了——憋說話,贊我
如果你在學習Java的過程中遇見什么問題或者想獲取一些學習資源的話歡迎加入團長的Java學習交流QQ群:495273252 Java團長 微信號:javatuanzhang 每日分享Java技術干貨 |
|
來自: Levy_X > 《JAVAWEB學習資料》