SpringMVC 视图方法的参数, 已经在这个文章中写得非常清楚了, 链接为 https://www.cnblogs.com/morethink/p/8028664.html

这篇文章做一些补充. 被@RequestMapping 注解的方法的签名非常灵活, Spring会自动注入各种类型的实参, 另外返回值类型也可以有多种选择.

=============================
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.html

-----------------------------------
@PathVariable示例
-----------------------------------
@PathVariable注解虽然可以加上required参数, 但即使加了 required=false 的话, 对应的参数也不能缺省, 也许Spring未来版本会改进点吧.
测试url为:
http://localhost:8080/pathVariableDemo1/1111/harry

    @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中获取.

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

=============================
页面跳转
=============================
常用的页面跳转方式有:
1. 视图方法返回类型为 ModelAndView, 直接在 ModelAndView 返回值中设置目标页面
2. 视图方法返回类型为 String, 直接用返回值确定目标页面
3. 视图方式返回值类似于 "redirect:another_view", 重定向至 another_view 视图取进一步处理
4. 视图方式返回值类似于 "forward:another_view", 请求转发至 another_view 视图取进一步处理

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/7921155
2. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解 https://blog.csdn.net/walkerJong/article/details/7946109
3. Spring MVC@RequestMapping 方法所支持的参数类型和返回类型详解 https://www.tianmaying.com/tutorial/request-mapping-parameter-type
4. SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC http://jinnianshilongnian.iteye.com/blog/1705701
5. freemarker迭代list、map等常规操作 https://blog.csdn.net/wickedvalley/article/details/65937189
6. http://www.cnblogs.com/Hymen/p/3296952.html
7. https://blog.csdn.net/xiangwanpeng/article/details/53069533
8. https://www.jianshu.com/p/b4b2c38d31ee

SpringBoot系列: Spring MVC视图方法的补充的更多相关文章

  1. SpringBoot集成Spring MVC视图

    SpringBoot在springmvc的视图解析器方面就默认集成了ContentNegotiatingViewResolver和BeanNameViewResolver,在视图引擎上就已经集成自动配 ...

  2. 【深度分析】:阿里,腾讯面试题 SpringBoot整合Spring MVC

    Java学习总结 SpringBoot整合Spring MVC 1.SpringMVC概述 MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为 ...

  3. SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数

    在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...

  4. spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClassNameHandlerMapping

    spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClas ...

  5. spring mvc: 属性方法名称解析器(多动作控制器)MultiActionController/ControllerClassNameHandlerMapping/PropertiesMethodNameResolver

    spring mvc: 属性方法名称解析器(多动作控制器) 加入控制器是StudentContrller.java,里面有3个方法 index,add,remove 那么访问地址是: http://l ...

  6. 2分钟在eclipse下使用SpringBoot搭建Spring MVC的WEB项目

    1. 首先用eclipse创建一个maven工程, 普通maven工程即可 2. 修改pom如下: <?xml version="1.0" encoding="UT ...

  7. Spring MVC视图解析器

    Spring MVC提供的视图解析器使用ViewResolver进行视图解析,实现浏览器中渲染模型.ViewResolver能够解析JSP.Velocity模板.FreeMarker模板和XSLT等多 ...

  8. SpringBoot系列: Spring支持的异常处理方式

    ===================================视图函数返回 status code 的方式===================================Spring 有 ...

  9. Spring MVC的方法返回值和参数传递

    1. SpringMVC方法的返回值类型 3.1String类作为返回值 3.1.1Controller层 /** * 返回值类型为String时,一般用于返回视图名称 * 1.当方法返回值为null ...

随机推荐

  1. 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...

  2. Double.valueOf(0.0D) 分析

    private Double price = Double.valueOf(0.0D); 查看Java API 文档如下: doubleValue public double doubleValue( ...

  3. [luogu4005]小Y和地铁【搜索+树状数组】

    传送门:https://www.luogu.org/problemnew/show/P4005 最简单的暴力拿最高的分,二进制爆搜. #include <bits/stdc++.h> #d ...

  4. 「TJOI2015」组合数学 解题报告

    「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行 ...

  5. 「TJOI2015」线性代数 解题报告

    「TJOI2015」线性代数 和牛客某题很像 在和里面有\(B_{i,j}\)要求是\(A_i,A_j\)都为\(1\),和里面减去\(C_i\)要求\(A_i\)为\(1\),然后先把贡献也就是\( ...

  6. HDU 5950 Recursive sequence(矩阵快速幂)

    题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...

  7. Nginx实现负载均衡的几种方式

    负载均衡的几种常用方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. upstream backserver { server 192.168 ...

  8. 如何在以太坊上搭建一个Dapp?

    原创: 前哨小兵甲 区块链前哨 昨天 策划|Tina作者|Mahesh Murthy俗话说,实践出真知!对于开发人员来说,最好的学习办法就是亲自动手做一个小项目.所以,接下来我们将会以一个投票程序为例 ...

  9. Docker中如何删除image(镜像)

    原文地址:http://yaxin-cn.github.io/Docker/how-to-delete-a-docker-image.html docker中删除images的命令是docker rm ...

  10. jQuery preventDefault() ,stopPropagation(),stopImmediatePropagation()

    preventDefault()函数用于阻止当前触发事件的默认行为. 在HTML文档中,当我们触发某些DOM元素的特定事件时,可以执行该元素的默认行为.比如链接的click事件:当我们点击一个链接时, ...