三、@RequestMapping注解
1、@RequestMapping注解的功能
@RequestMapping注解的作用就是將請求和處理請求的控制器方法關聯 起來,建立映射關系。
SpringMVC 接收到指定的請求,就會來找到在映射關系中對應的控制器方法來處理這個請求。
注意:在使用@RequestMapping注解的時候,要保證在所有的控制器中所能匹配到的請求地址是唯一的;
2、@RequestMapping注解的位置
@RequestMapping標識一個類:設置映射請求的請求路徑的初始信息
@RequestMapping標識一個方法:設置映射請求請求路徑的具體信息
注意:如果類和方法上都有路徑信息,那么要先訪問初始信息在訪問具體信息,HTML路徑要兩個都寫(一般用於不同模塊同名請求路徑的處理)
3、@RequestMapping注解的value屬性
@RequestMapping注解的value屬性通過請求的請求地址匹配請求映射
@RequestMapping注解的value屬性是一個字符串類型的數組,表示該請求映射能夠匹配多個請求地址 所對應的請求
@RequestMapping注解的value屬性必須設置,至少通過請求地址匹配請求映射
4、@RequestMapping注解的method屬性
@RequestMapping注解的method屬性通過請求的請求方式(get或post)匹配請求映射
@RequestMapping注解的method屬性是一個RequestMethod類型的數組,表示該請求映射能夠匹配 多種請求方式的請求 若當前請求的請求地址滿足請求映射的value屬性,但是請求方式不滿足method屬性,則瀏覽器報錯 405:Request method 'POST' not supported,設置多個參數不必同時滿足!
注意:
1、對於處理指定請求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解
處理get請求的映射-->@GetMapping
處理post請求的映射-->@PostMapping
處理put請求的映射-->@PutMapping
處理delete請求的映射-->@DeleteMapping
可以直接使用以上注解代替method參數!
2、常用的請求方式有get,post,put,delete
但是目前瀏覽器只支持get和post,若在form表單提交時,為method設置了其他請求方式的字符 串(put或delete),則按照默認的請求方式get處理
若要發送put和delete請求,則需要通過spring提供的過濾器HiddenHttpMethodFilter,在 RESTful部分會講到,設置多個參數不必同時滿足!
5、@RequestMapping注解的params屬性(了解)
@RequestMapping注解的params屬性通過請求的請求參數匹配請求映射
@RequestMapping注解的params屬性是一個字符串類型的數組,可以通過四種表達式設置請求參數 和請求映射的匹配關系
"param":要求請求映射所匹配的請求必須攜帶param請求參數
"!param":要求請求映射所匹配的請求必須不能攜帶param請求參數
"param=value":要求請求映射所匹配的請求必須攜帶param請求參數且param=value
"param!=value":要求請求映射所匹配的請求必須攜帶param請求參數但是param!=value
注: 若當前請求滿足@RequestMapping注解的value和method屬性,但是不滿足params屬性,
此時 頁面回報錯400:Parameter conditions "username, password!=123456" not met for actual request parameters: username={admin}, password={123456},設置多個參數必須同時滿足!
6、@RequestMapping注解的headers屬性(了解)
@RequestMapping注解的headers屬性通過請求的請求頭信息匹配請求映射
@RequestMapping注解的headers屬性是一個字符串類型的數組,可以通過四種表達式設置請求頭信 息和請求映射的匹配關系
"header":要求請求映射所匹配的請求必須攜帶header請求頭信息
"!header":要求請求映射所匹配的請求必須不能攜帶header請求頭信息
"header=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header=value
"header!=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header!=value
若當前請求滿足@RequestMapping注解的value和method屬性,但是不滿足headers屬性,此時頁面 顯示404錯誤,即資源未找到,設置多個參數必須同時滿足!
7、SpringMVC支持ant風格的路徑(模糊匹配)
?:表示任意的單個字符(/ ? 不寫都不可以)
*:表示任意的0個或多個字符
**:表示任意的一層或多層目錄
注意:在使用**時,只能使用/**/xxx的方式
8、SpringMVC支持路徑中的占位符(重點)
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
SpringMVC路徑中的占位符常用於RESTful風格中,當請求路徑中將某些數據通過路徑的方式傳輸到服務器中,就可以在相應的@RequestMapping注解
的value屬性中通過占位符{xxx}表示傳輸的數據,在通過@PathVariable注解,將占位符所表示的數據賦值給控制器方法的形參
四、SpringMVC獲取請求參數
1、通過ServletAPI獲取
將HttpServletRequest作為控制器方法的形參,此時HttpServletRequest類型的參數表示封裝了當前請 求的請求報文的對象
2、通過控制器方法的形參獲取請求參數
在控制器方法的形參位置,設置和請求參數同名的形參,當瀏覽器發送請求,匹配到請求映射時,在 DispatcherServlet中就會將請求參數賦值給相應的形參
注:
若請求所傳輸的請求參數中有多個同名的請求參數,此時可以在控制器方法的形參中設置字符串、數組或者字符串類型的形參接收此請求參數
若使用字符串數組類型的形參,此參數的數組中包含了每一個數據
若使用字符串類型的形參,此參數的值為每個數據中間使用逗號拼接的結果
3、@RequestParam
@RequestParam是將請求參數和控制器方法的形參創建映射關系
@RequestParam注解一共有三個屬性:
value:指定為形參賦值的請求參數的參數名
required:設置是否必須傳輸此請求參數,默認值為true
若設置為true時,則當前請求必須傳輸value所指定的請求參數,
若沒有傳輸該請求參數,且沒有設置 defaultValue屬性,則頁面報錯400:Required String parameter 'xxx' is not present;
若設置為 false,則當前請求不是必須傳輸value所指定的請求參數,若沒有傳輸,則注解所標識的形參的值為 null
defaultValue:不管required屬性值為true或false,當value所指定的請求參數沒有傳輸或傳輸的值 為""時,則使用默認值為形參賦值
4、@RequestHeader
@RequestHeader是將請求頭信息和控制器方法的形參創建映射關系
@RequestHeader注解一共有三個屬性:value、required、defaultValue,用法同@RequestParam
5、@CookieValue
@CookieValue是將cookie數據和控制器方法的形參創建映射關系
@CookieValue注解一共有三個屬性:value、required、defaultValue,用法同@RequestParam
6、通過POJO獲取請求參數
可以在控制器方法的形參位置設置一個實體類類型的形參,此時若瀏覽器傳輸的請求參數的參數名和實 體類中的屬性名一致,那么請求參數就會為此屬性賦值
7、解決獲取請求參數的亂碼問題
解決獲取請求參數的亂碼問題,可以使用SpringMVC提供的編碼過濾器CharacterEncodingFilter,但是 必須在web.xml中進行注冊
注: SpringMVC中處理編碼的過濾器一定要配置到其他過濾器之前,否則無效