实现步骤
- 先看后台代码如何获取前端传过来的数据,直接在方法的参数列表中添加@RequestParam(xxx),再在后面加上参数列表即可
不过这样的方式会出现一个问题:当前端页面没有提交相应的数据过来的时候,后台会出现异常,所以在实际的开发中,如果不添加这个注解,同样能正常获取前端传递的数据,即使没有传递数据,也不会报错,如果必须要添加该注解,可以设置 isRequired = false 避免空值报错的问题
- 后台如何把值传递给前端,可以在方法的参数列表中添加Model对象,通过Model对象把值传递给前端,Model 可以视为 Map 和 Attribute 的结合体
前端可以直接用nl标签${userName}获取
这个 Model 对象还有一个只有一个参数的方法,那么这个时候传递值的 key 是什么呢?
key 就是所传递值的 类型(key 的首字母小写),例如:这里的 userName 是 String 类型,这里实际效果就相当于:model.addAttribute(“string”, userName)
在SpringMVC中,@RequestMapping(value=“user/add”) 中定义的value的值是前后台映射的重要标识。但是有可能 value 的值是动态的,那么又该如何处理呢?例如:在显示用户列表的界面,添加了显示每一个用户详情的功能
此时传递的参数是每一个被点击的用户的 username 属性,那么后台就会将传递在路径中的值作为参数处理,@PathVariable 的功能就是用来获取 url 中的动态参数
@RequestParam(xxx) 和 @PathVariable(xxx) 的异同
-
两种注解都是用于后台获取前端传递的值
-
@RequestParam(“username”)主要用于 url 传值 http://localhost:8080/SpringMVC/user?username=Andy;而@PathVariable String username 主要用于REST风格的传值,而且是动态的值 http://localhost:8080/SpringMVC/user/Andy
-
@RequestParam(“username”),前端传递的值不能为空,否则程序会出现异常;@RequestParam(“xxx”),在前端传递参数和后台形参不匹配(包括参数类型)的时候使用可以起到一个转换的作用;例如:在批量上传文件时,前端传递的 name 参数是字符串,而后台接收时定义的类型是数组
前端
后端
注意
- 在后台服务器跳转时,有时候可能会需要跳转的时候带参数到下一个链接;这种情况下可以使用 RedirectAttributes 来设值
不过要注意的是,传递的参数类型是 String 格式的,传递的值会以字符串的方式连接在跳转连接的后方
2. 如果要传递对象的话,可以采用如下方式
这种传递方式不会在跳转链接后拼接字符串,而是将值暂时放在 session 中,跳转完毕后,再删除传递的值
注意:动态参数传值包含多个小数点可能会出现数据丢失
在使用 @PathVariable(xxx) 标签取值的时候,如果参数有多个小数点(一个不会有问题),超过两个会出现数据丢失的情况;如下所示:
如果前端传递的参数是:user/cddufu@cn.ibm.com 那么在后台接收参数的时候会变成 cddufu@cn.ibm ;从而出现数据丢失(.com 不见了)
解决方案
(1) 把动态参数夹在中间,像这样:user/cddufu@cn.ibm.com/name (推荐)
(2) 修改 @GetMapping 注解为:@GetMapping(“/user/{username:.+}”)