亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

學(xué)習(xí)SpringMVC——如何獲取請(qǐng)求參數(shù)詳解

 更新時(shí)間:2016年12月12日 10:44:17   作者:JackieZheng  
本篇文章主要介紹了SpringMVC——如何獲取請(qǐng)求參數(shù)詳解,詳細(xì)的介紹了每種參數(shù)注解的用法。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

@RequestParam,你一定見過;@PathVariable,你肯定也知道;@QueryParam,你怎么會(huì)不曉得?!還有你熟悉的他(@CookieValue)!她(@ModelAndView)!它(@ModelAttribute)!沒錯(cuò),僅注解這塊,spring mvc就為你打開了五彩斑斕的世界。來(lái)來(lái)來(lái),不要興(mi)奮(hu),坐下來(lái),我們好好聊聊這么些個(gè)注解兄弟們~~~(wait, 都沒有聽過? 好,來(lái),你坐前排,就你!)

 一、spring mvc如何匹配請(qǐng)求路徑——“請(qǐng)求路徑哪家強(qiáng),RequestMapping名遠(yuǎn)揚(yáng)”

@RequestMapping是用來(lái)映射請(qǐng)求的,比如get請(qǐng)求,post請(qǐng)求,或者REST風(fēng)格與非REST風(fēng)格的。 該注解可以用在類上或者方法上,如果用于類上,表示該類中所有方法的父路徑。

舉例(這里用到的測(cè)試類如SpringMVCTest以及一些頁(yè)面在第一篇《學(xué)習(xí)SpringMVC——從HelloWorld開始》中已經(jīng)介紹):

SpringMVCTest.java中加入測(cè)試方法:

@RequestMapping("/testRequestMapping")

public String testRequestMapping(){

  System.out.println("testRequestMapping");

  return SUCCESS;

} 

注意這里在方法級(jí)別上添加了注解@RequestMapping(“/testRequestMapping”),  表示可以通過“/testRequestMapping”相對(duì)路徑來(lái)定位到這個(gè)方法,同時(shí)我們?cè)赟pringMVCTest類上也放了一個(gè)類級(jí)別的RequestMapping的注解:

@RequestMapping("/springmvc")

@Controller

public class SpringMVCTest { 

注意這里還添加了一個(gè)@Controller的注解,該注解在SpringMVC 中,負(fù)責(zé)處理由DispatcherServlet 分發(fā)的請(qǐng)求,它把用戶請(qǐng)求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理之后封裝成一個(gè)Model ,然后再把該Model 返回給對(duì)應(yīng)的View 進(jìn)行展示。至此有了一個(gè)“springmvc/testRequestMapping”這樣的路徑,我們就能夠定位到testRequestMapping這個(gè)方法上,然后執(zhí)行方法內(nèi)的方法體。

再補(bǔ)充一點(diǎn),RequestMapping可以實(shí)現(xiàn)模糊匹配路徑,比如:

?:匹配一個(gè)字符

*:匹配任意字符

**:匹配多層路徑

/springmvc/**/lastTest 就可以匹配/springmvc/firstTest/secondTest/lastTest這樣的路徑

二、spring mvc如何獲取請(qǐng)求的參數(shù)——“八仙過海,各顯神通”

1. @PathVariable

該注解用來(lái)映射請(qǐng)求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中我們添加一條連接,用來(lái)觸發(fā)一個(gè)請(qǐng)求:

<a href="springmvc/testPathVariable/1">testPathVariable</a><br/><br/> 

我們可以看到這里有一個(gè)超鏈接,點(diǎn)擊后會(huì)進(jìn)入到springmvc/testPathVariable/1對(duì)應(yīng)的controller處理的方法中,那我們現(xiàn)在就是想獲取到這個(gè)請(qǐng)求參數(shù)中的“1”,所以在testPathVariable方法上加入“/testPathVariable/id”,關(guān)于 id”,關(guān)于{id}的具體對(duì)應(yīng)在該方法的參數(shù)中,通過@PathVariable(value="id")來(lái)聲明要接收的請(qǐng)求參數(shù),并通過Integer id來(lái)綁定和接收。通過該種方式,我們就可以得到前臺(tái)頁(yè)面請(qǐng)求的參數(shù)“1”。

2. @RequestParam

該注解也是用來(lái)獲取請(qǐng)求參數(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添加超鏈接標(biāo)簽

<a href="springmvc/testRequestParam?username=jackie&age=12">testRequestParam</a><br/><br/> 

點(diǎn)擊頁(yè)面上的超鏈接,就會(huì)匹配controller中testRequestParam方法上的RequestMapping的路徑。注意在該方法中,我們通過@RequestParam這個(gè)注解聲明了兩個(gè)變量,用來(lái)獲取請(qǐng)求中query所帶的參數(shù)值,一個(gè)是username后的值,另一個(gè)是age后面的值。

看到這里,你大概已經(jīng)明白了@PathVariable和@RequestParam之間的一些區(qū)別了吧,對(duì)于像“springmvc/testPathVariable/1”這樣的請(qǐng)求,我們通過@PathVariable來(lái)綁定請(qǐng)求的參數(shù);而對(duì)于類似“springmvc/testRequestParam?username=jackie&age=12”這樣的請(qǐng)求參數(shù)是以鍵值對(duì)出現(xiàn)的,我們通過@RequestParam來(lái)獲取到如username或age后的具體請(qǐng)求值。

與RequestParam有異曲同工用法的還有QueryParam,因其不是spring mvc框架內(nèi)的注解,這里不再詳述。

對(duì)于不同的請(qǐng)求類型和請(qǐng)求方式,spring mvc都有一套針對(duì)的解決方案,下面我們來(lái)看看當(dāng)下比較流行的REST風(fēng)格的請(qǐng)求是啥樣的——利用REST風(fēng)格實(shí)現(xiàn)增刪改查。

在SpringMVCTest類中自下而上的實(shí)現(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;

} 

那么前臺(tái)界面如何實(shí)現(xiàn)呢,相對(duì)應(yīng)的順序?yàn)?/p>

<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請(qǐng)求的聲明

<!-- 配置HiddenHttpMethodFilter:可以把POST請(qǐng)求轉(zhuǎn)為DELETE或POST請(qǐng)求 -->

<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ā)送出去的,因?yàn)檫@里不支持put和delete來(lái)直接實(shí)現(xiàn)刪改,而是通過借助post方式,并悄悄的帶上一塊令牌hidden類型的input標(biāo)簽來(lái)告訴后臺(tái)我在前臺(tái)發(fā)送的實(shí)際上是刪和改的請(qǐng)求。

那么這個(gè)過程時(shí)如何實(shí)現(xiàn)的呢,為什么加上

<input type="hidden" name="_method" value="DELETE"/> 

這塊令牌,人家后臺(tái)就要買你的賬呢。那我們就來(lái)看看后來(lái)是如何買賬的吧。

歸根到底還是得益于添加在web.xml中的HiddenHttpMethodFilter這個(gè)類,在該類中有一個(gè)方法doFilterInternal, 通過調(diào)試我們可以發(fā)現(xiàn)其中端倪,啟動(dòng)tomcat(不能是tomcat8),點(diǎn)擊delete操作對(duì)應(yīng)的input標(biāo)簽,進(jìn)入調(diào)試界面,我們可以看到:

  • 通過request.getParameter(this.methodParam)在request域中得到this.methodParam(_method)的值,對(duì)應(yīng)于刪除delete的操作,在頁(yè)面上,delete中聲明了一個(gè)hidden的input,其中name就是“_method”,value就是DELETE,所以這里得到的paramValue的值為“DELETE”
  • 繼續(xù)執(zhí)行,可以看到通過request.getMethod的取值是否與“POST”相等,顯然,這里是相等,因?yàn)槲覀冊(cè)谇芭_(tái)頁(yè)面中對(duì)于delete的操作請(qǐng)求中method聲明為post方式
  • 再往后就是將獲取到的請(qǐng)求方法封裝HttpServletRequest中,完成后續(xù)的處理。這里我們應(yīng)該明白了為什么前臺(tái)要加上那樣一個(gè)hidden的input了。

小坑:這里注意啟動(dòng)不能是tomcat8,而只能是比8小的版本,如7或6等,下圖展示了用tomcat的報(bào)錯(cuò)信息和用7的成功響應(yīng):

總結(jié)下,如何發(fā)送put和delete的請(qǐng)求:

1.在web.xml中配置HiddenHttpMethodFilter

2.發(fā)送post請(qǐng)求

3.請(qǐng)求中是個(gè)隱藏域,name為”_mothod”,value為put或delete

 最后再來(lái)說下@CookieValue這個(gè)注解。

3. @CookieValue

該注解也是差不多的套路,也是一種映射,映射的是一個(gè)Cookie值。

在我們發(fā)送一個(gè)請(qǐng)求時(shí),我們可以看到請(qǐng)求中攜帶了一些cookie值

比如這里的JSESSIONID或者Path等?,F(xiàn)在我們就寫個(gè)方法用于獲取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”這樣的結(jié)果。

至此,我們介紹了

1.@RequestMapping的用法

2.獲取請(qǐng)求參數(shù)的@PathVariable、@RequestParam的用法

3.介紹如何實(shí)現(xiàn)REST風(fēng)格的請(qǐng)求,并分析了post如何轉(zhuǎn)化為delete和put請(qǐng)求

4.介紹了@CookieValue的用法

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC?處理后端日期格式的示例詳解

    SpringMVC?處理后端日期格式的示例詳解

    在WebMvcConfiguration中擴(kuò)展SpringMVC的消息轉(zhuǎn)換器,統(tǒng)一對(duì)日期類型進(jìn)行格式處理,本文給大家介紹SpringMVC處理后端日期格式,感興趣的朋友一起看看吧
    2023-11-11
  • 冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序法:關(guān)鍵字較小的記錄好比氣泡逐趟上浮,關(guān)鍵字較大的記錄好比石塊下沉,每趟有一塊最大的石塊沉底。算法本質(zhì):(最大值是關(guān)鍵點(diǎn),肯定放到最后了,如此循環(huán))每次都從第一位向后滾動(dòng)比較,使最大值沉底,最小值上升一次,最后一位向前推進(jìn)
    2016-02-02
  • 解決Spring AOP 同類調(diào)用失效問題

    解決Spring AOP 同類調(diào)用失效問題

    這篇文章主要介紹了解決Spring AOP 同類調(diào)用失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算

    Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算

    這篇文章主要介紹了Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算,需要的朋友可以參考下
    2014-07-07
  • Springboot2整合knife4j過程解析

    Springboot2整合knife4j過程解析

    這篇文章主要介紹了Springboot2整合knife4j過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java中transient關(guān)鍵字分析

    java中transient關(guān)鍵字分析

    這篇文章主要介紹了java中transient關(guān)鍵字分析,transient與類對(duì)象的序列化息息相關(guān),序列化保存的是 類對(duì)象 狀態(tài),被transient關(guān)鍵字修飾的成員變量,在類的實(shí)例化對(duì)象的序列化處理過程中會(huì)被忽略,變量不會(huì)貫穿對(duì)象的序列化和反序列化,需要的朋友可以參考下
    2023-09-09
  • Java實(shí)現(xiàn)窗體程序顯示日歷

    Java實(shí)現(xiàn)窗體程序顯示日歷

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)窗體程序顯示日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)

    Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)

    這篇文章主要介紹了Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例),分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java設(shè)計(jì)模式之備忘錄模式

    Java設(shè)計(jì)模式之備忘錄模式

    這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式,備忘錄模式(Memento Pattern),屬于行為型設(shè)計(jì)模式,目的是用于保存一個(gè)對(duì)象在某一時(shí)刻的狀態(tài),以便于在將來(lái)某個(gè)時(shí)刻根據(jù)此狀態(tài)恢復(fù)該對(duì)象,需要的朋友可以參考下
    2023-12-12
  • Java多線程實(shí)現(xiàn)方塊賽跑小游戲

    Java多線程實(shí)現(xiàn)方塊賽跑小游戲

    這篇文章主要為大家詳細(xì)介紹了Java多線程實(shí)現(xiàn)方塊賽跑小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評(píng)論