【SpringMVC】(3)浅谈前台往后台传参
- (1)基本介绍
- (2)准备表单和pojo实体类
-
-
- (2.1)前端代码index.jsp
- (2.2)pojo实体类(省略setget方法和toString)
-
- (3)五种传参方式(开始Controller)
-
-
- (3.1)接收普通请求参数(用参数变量接收)
-
-
-
- (3.1.1)Controller编写
- (3.1.2)前台输入数据
- (3.1.3)运行效果
-
-
- (3.1)接收普通请求参数(用pojo实体类接收)
- (3.2)使用@RequestParam注解获取参数
- (3.3)使用URL传递参数(RESTful风格)
- (3.4)传递JSON参数(参数较多转成JSON集,@RequestAttribute或者@RequestBody)
- (3.5)接收列表数据和表单序列化
-
-
-
- (3.5.1)传递数组
- (3.5.2)传递多个角色数组
- (3.5.3)传递序列化表单
-
-
-
(1)基本介绍
前台往后台发送请求的时候,往往需要同时传递参数,用Controller控制器接收,这样控制器才能对参数进行处理。
- RESTful风格:把参数写到请求路径中,而不是以HTTP请求参数
- JSON:比如查询用户的时候,需要分页,可能用户的信息非常多,那么查询参数可能有数十个,显然一个个传参很麻烦,那就把这些参数组装成一个JSON数据集,而把分页参数作为普通参数传递,然后再把数据传递给后台
(2)准备表单和pojo实体类
(2.1)前端代码index.jsp
<html>
<head>
<title>请求参数绑定的讲解</title>
<script src="js"></script>
</head>
<body>
<h3>请求参数绑定的讲解</h3>
<%--参数username和password会和Controller里方法中的参数比对--%>
<%--也可以把这一部分调出去,写一个JavaBean,先把这段注释掉--%>
<%--<a href="param/testParam?username=hehe & password=123">请求参数绑定</a>--%>
<form id="form" action="param/commonParams" method="post">
<%--Account类name属性要跟Controller里的参数一样--%>
姓名:<input type="text" name="username"><br>
密码:<input type="text" name="password"><br>
金额:<input type="text" name="money"><br>
<%--把user类的属性也封装到Account里去--%>
用户姓名:<input type="text" name="user.uname"><br>
用户年龄:<input type="text" name="user.age"><br>
<input type="submit" value="提交"><br>
</form>
</body>
</html>
效果如图:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR50MnpXT5dGROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0QTM2AzMwgTM4IzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(2.2)pojo实体类(省略setget方法和toString)
(1)User类
public class User implements Serializable {
private String uname;
private String age;
...
}
(2)Account类(包含User对象)
public class Account implements Serializable {
private String username;
private String password;
private Double money;
// 引入一个实体类(获取getter方法,和toString)
private User user;
...
}
(3)五种传参方式(开始Controller)
(3.1)接收普通请求参数(用参数变量接收)
如果传递过来的参数名称和HTTP的保存一致,那么不用任何注解也可以获取参数。上面表单提交传递三个HTTP参数,controller中用String类型和Double类型对参数直接进行获取。
如果Controller方法中的参数名称和HTTP请求参数的名称不一致,就无法获取到,允许参数为空
(3.1.1)Controller编写
@Controller
@RequestMapping("/param")
public class ParamTestController {
@RequestMapping("/commonParams")
public ModelAndView commonParams(String username,String password,Double money){
System.out.println(username);
System.out.println(password);
System.out.println(money);
ModelAndView mv=new ModelAndView();
mv.setViewName("yes");
return mv;
}
}
(3.1.2)前台输入数据
(3.1.3)运行效果
如图,Controller确实获取到了前台传进来的参数,并且在控制台进行了输出
(3.1)接收普通请求参数(用pojo实体类接收)
(1)Controller编写
@Controller
@RequestMapping("/param")
public class ParamTestController {
@RequestMapping("/commonParams")
public ModelAndView commonParams(Account account){
System.out.println(account.getUsername());
System.out.println(account.getPassword());
System.out.println(account.getMoney());
ModelAndView mv=new ModelAndView();
mv.setViewName("yes");
return mv;
}
}
(2)前台输入
(3)运行效果(pojo实体类成功获取到参数,并且自动赋值给属性字段)
(3.2)使用@RequestParam注解获取参数
如上所述,要求参数名称和HTTP的请求参数必须一致。如果不想保持一致就可以使用@RequestParam注解
(1)前端的参数修改成name,与参数username不再一致
(2)Controller编写(用注解获取请求参数,然后再赋值给参数)
默认情况下参数不能为空,当加上required = false,就可以允许请求参数为空
@RequestMapping("/commonParams")
public ModelAndView commonParams(@RequestParam(value = "name",required = false) String username){
System.out.println(username);
ModelAndView mv=new ModelAndView();
mv.setViewName("yes");
return mv;
}
(3)运行效果(获取成功)
(3.3)使用URL传递参数(RESTful风格)
适用于一些业务比较简单的应用
(1)Controller编写
@RequestMapping("/commonParams/{id}")
public ModelAndView commonParams(@PathVariable("id") Long id){
System.out.println(id);
ModelAndView mv=new ModelAndView();
mv.setViewName("yes");
return mv;
}
(2)修改URL访问路径
(3.4)传递JSON参数(参数较多转成JSON集,@RequestAttribute或者@RequestBody)
(1)用jQuery传递数据
<script>
$("#btn").click(function () {
var data={
username:"孙治",
password:"123456",
money:"30",
user:{
uname:"Allen",
age:"18"
}
}
$.post({
url:"param/commonParams",
contentType:"application/json",
data:JSON.stringify(data),
success:function (result) {
}
})
})
</script>
(2)controller编写
@RequestAttribute或者@RequestBody
@RequestMapping("/commonParams")
public ModelAndView commonParams(@RequestAttribute Account account){
System.out.println(account);
ModelAndView mv=new ModelAndView();
mv.addObject(account);
mv.setViewName(String.valueOf(new MappingJackson2JsonView()));
return mv;
}
(3.5)接收列表数据和表单序列化
(3.5.1)传递数组
(1)JQuery传递数组
(2)Controller接收数组
(3.5.2)传递多个角色数组
(1)JQuery传递多个
(2)Controller接收
(3.5.3)传递序列化表单
(1)JQuery把表单序列化后再传递
(2)Controller接收