第一種情況,什么也不設置,無參數傳遞
注解為 @Controller @RequestMapping
可以看到傳遞的為SpringMVC的BindingAwareModelMap類型,SpringMVC中的隱含模型就是這個類型,其作用域等價於 request 域,當添加Model、ModelMap參數時,SpringMVC實際傳入的就是這個隱含模型;向這個隱含模型種設置值后,在返回的頁面中就能通過request域取值。
第二種情況,加個參數試試 => .../testmap?test1=2342
結果類型還是一樣,且參數不會被傳入,當然使用request肯定能取出來。
第三種情況,給Map參數添加@RequestParam注解
1、Get請求 => http://localhost:8080/ssm/v2/testmap?test1=234234
成功傳入了參數,注意這個Map類型為LinkedHashMap,而不是隱含模型了
再添加個Model參數看看,隱含模型中依然沒有值
所以添加@RequestParam注解后,SpringMVC會將 Get 請求中封裝進對應的參數中,如果參數是Map就封裝稱LinkedHashMap而不再傳入隱含模型
2、Post請求, 再測試測試Post請求
與Get的結果一致:參數無@RequestParam注解時,Map接收隱含模型;添加@RequestParam注解時,Map接收LinkedHashMap;隱含模型中無值。
第四種情況,給Map參數添加@RequestBody注解,且請求方式為Post
出乎意料的也成功傳入了,與@RequestParam注解結果類似,也是LinkedHashMap
復雜點的Json數據也能解析接收成功
總結
SpringMVC處理請求用Map類型接收參數時,如果參數無注解,則會傳入BindingAwareModelMap類型,等價於Model、ModelMap參數;
參數添加@RequestParam注解時,會將參數包裝稱LinkedHashMap對象,參數的key為Map的key,參數值為Map的key,支持Get、Post方法(應該支持Put、Delete,沒有測,倆方法與Post類似);
添加@RequestBody注解時,接收Json類型數據,也會包裝成LinkedHashMap對象,該注解不支持Get請求,Get請求沒有請求體不能傳Json。