SpringBoot系列: Spring MVC視圖方法的補充

SpringMVC 視圖方法的參數, 已經在這個文章中寫得很是清楚了, 連接爲 https://www.cnblogs.com/morethink/p/8028664.htmlhtml

這篇文章作一些補充. 被@RequestMapping 註解的方法的簽名很是靈活, Spring會自動注入各類類型的實參, 另外返回值類型也能夠有多種選擇.java


=============================
View 方法的形式參數
=============================
View 形參種類和數量能夠很是多, 這裏僅列幾種重要的類型:
1. ServletRequest 或 HttpServletRequest 類型的形參, 在運行時Spring MVC會自動注入 request 實參.
2. HttpSession 類型的形參, 在運行時Spring MVC會自動注入 session 實參.
3. java.util.Map/org.springframework.io.Model/org.springframework.ui.ModelMap 類型的參數, 該參數會被Spring自動注入, 咱們能夠經過該參數進一步控制視圖層模型(向FreeMarker模版傳參). 推薦使用 Model 或者 ModelMap 類型, 它們比 java.util.Map 更好用.
4. 處理 request 模版變量的參數, 這類參數須要加上 @PathVariable 註解.
5. 處理 request header的參數, 這類參數須要加上 @CookieValue 或 @RequestHeader 註解.
6. 處理 request paramater的參數, 這類參數須要加上 @RequestParam 註解, 該註解實際上是調用 Request.getParameter() 獲取request 參數值, 它既可獲取GET的 queryString, 也能夠POST的body data值. 但須要說明的是該註解修飾的參數只能是簡單類型, 不能是複雜的用戶定義類.
7. 處理 request body的參數, 這類參數須要加上 @RequestBody 註解, 該註解多用於 Restful 接口.
8. 處理 request body的參數, 也可使用 @ModelAttribute 註解, @ModelAttribute 用法較複雜, 參見 https://www.cnblogs.com/morethink/p/8028664.htmlspring

 

-----------------------------------
@PathVariable示例
-----------------------------------
@PathVariable註解雖然能夠加上required參數, 但即便加了 required=false 的話, 對應的參數也不能缺省, 也許Spring將來版本會改進點吧.
測試url爲:
http://localhost:8080/pathVariableDemo1/1111/harryjson

@RequestMapping("/pathVariableDemo1/{userId}/{userName}") @ResponseBody public String pathVariableDemo(HttpSession session, @PathVariable String userId, @PathVariable String userName) { return "userId:"+userId+", userName:"+userName; } 

 

-----------------------------------
@RequestParam 示例1
-----------------------------------
@RequestParam, 能夠加上 required 參數, 並能夠指定缺省值.
測試url爲:
http://localhost:8080/requestParamDemo?userId=1111&userName=harry
http://localhost:8080/requestParamDemo?userId=1111&userName=
http://localhost:8080/requestParamDemo?userId=1111數組

@RequestMapping("/requestParamDemo") @ResponseBody public String requestParamDemo(HttpSession session, @RequestParam(name = "userId", required = true) String userId, @RequestParam(name = "userName", required = false, defaultValue = "unamed") String userName) { return "userId:" + userId + ", userName:" + userName; }

 

-----------------------------------
@RequestParam 示例2
-----------------------------------
@RequestParam 也能夠註解數組或List容器類型的參數
測試url爲:
http://localhost:8080/requestParamDemo2?userId=1111&roles=Admin,User
http://localhost:8080/requestParamDemo2?userId=1111瀏覽器

@RequestMapping("/requestParamDemo2") @ResponseBody public String requestParamDemo2(HttpSession session, @RequestParam(name = "userId", required = true) String userId, @RequestParam(name = "roles", required = false, defaultValue = "Guest,UnknownRole") List<String> roles) { return "userId:" + userId + ", roles:" + String.join(",", roles); }

 

 

============================= 
View 方法的返回類型
============================= 
Spring MVC的view函數支持多種返回值類型:
1. [非restful]返回值類型爲 String 時: 返回值即爲目標視圖名, 完整的目標視圖是: prefix前綴+返回值字符串+suffix後綴名.
2. 返回值類型爲 void/Map/Model/ModelMap 時: 真正的目標視圖是: prefix前綴+方法名稱+suffix後綴名. 
3. 返回值類型爲 ModelAndView 時: 真正的視圖是經過 ModelAndView 對象設置的. 
4. [restful]返回值類型爲 String 時: 直接將string返回給 API 客戶端
5. [restful]返回值類型爲 ResponseEntity<T> 時: 將返回對象json序列化後返回給API客戶端.服務器

 

============================= 
View 方法如何向FreeMarker模版傳值?
============================= 
咱們至少有兩個方式能夠向FreeMarker模版傳值:
1. 將任意類型對象壓到Model/ModelMap/ModelAndView/Map中, 能夠完成簡單值/自定義對象/集合等的傳值. 
2. 經過 session.setAttribute() 或者 request.setAttribute(), 一樣, 能夠完成簡單值/自定義對象/集合等的傳值. 
若是上面兩個方式同時被使用, 優先取Model和ModelMap的傳值(Model和ModelMap是同一個東西,誰最後賦值的就取誰的), 而後是request, 最後是從session中獲取.restful

request.getSession().setAttribute("test", "haiwei2Session");
request.setAttribute("test", "haiwei1request"); 
map.addAttribute("test", "haiweiModelMap");
model.addAttribute("test", "haiweiModel");session

 

 

=============================
頁面跳轉
=============================
經常使用的頁面跳轉方式有:
1. 視圖方法返回類型爲 ModelAndView, 直接在 ModelAndView 返回值中設置目標頁面
2. 視圖方法返回類型爲 String, 直接用返回值肯定目標頁面
3. 視圖方式返回值相似於 "redirect:another_view", 重定向至 another_view 視圖取進一步處理
4. 視圖方式返回值相似於 "forward:another_view", 請求轉發至 another_view 視圖取進一步處理app

redirect(重定向) 和 forward(請求轉發) 簡單區別:
redirect 至關於有兩次request. 要向給第二次request傳值, 只能經過url傳參方式爲第二次request傳值. 另外, 最後瀏覽器的url地址是重定向後的地址,
forward 能夠看做只有一次服務器和瀏覽器之間的 request. 請求轉發全過程都在服務器端完成, 因此在轉發以前, 能夠經過request.setAttribute() 傳值. 另外, 最後瀏覽器的url地址是最初的請求地址.

@GetMapping("index/") public String index() { return "redirect:/form"; } @GetMapping("index2/") public String index2() { return "forward:/form2"; } 

=============================參考============================= 1. springMVC 返回類型選擇 以及 SpringMVC中model,modelMap.request,session取值順序 https://blog.csdn.net/zb0567/article/details/79211552. @RequestParam @RequestBody @PathVariable 等參數綁定註解詳解 https://blog.csdn.net/walkerJong/article/details/79461093. Spring MVC@RequestMapping 方法所支持的參數類型和返回類型詳解 https://www.tianmaying.com/tutorial/request-mapping-parameter-type4. SpringMVC強大的數據綁定(2)——第六章 註解式控制器詳解——跟着開濤學SpringMVC http://jinnianshilongnian.iteye.com/blog/17057015. freemarker迭代list、map等常規操做 https://blog.csdn.net/wickedvalley/article/details/659371896. http://www.cnblogs.com/Hymen/p/3296952.html7. https://blog.csdn.net/xiangwanpeng/article/details/530695338. https://www.jianshu.com/p/b4b2c38d31ee

相關文章
相關標籤/搜索