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

相关文章
相关标签/搜索