logo头像

不破不立

SpringMVC数据绑定(form表单和url形式传参)

Spring MVC目前开发用的很多,对于数据绑定这块很多人经常遇到一些小问题,就是因为对于数据绑定不够熟悉,今天十六子就和大家一起学习一下对于form表单以及url形式传递参数方式的数据绑定。

内容大纲

  1. 基本数据类型
  2. 包装类型
  3. 数组类型
  4. 简单对象(简单对象包含对象,即多层级对象)
  5. 同属性多对象
  6. 集合List类型

开发工具

  Spring版本: 4.1.6.RELEASE
  IDE工具版本: IntelliJ IDEA 2017
  请求模拟工具: Postman


  以下的6种方式的讲解在代码的注释部分基本上已经讲明,这里就以第1基本数据类型为例介绍以下如何按照注释所述进行测试使用。

1.基本数据类型

  在配置好SpringMVC的项目环境后,新建一个 DataBindController.java ,在类名上引入@Controller注解,表示这是一个Controller Bean,接着将以下代码copy放在其中,logger变量可以在类中定义 Logger logger = Logger.getLogger(this.toString());

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 参数为基本数据类型,如int
* 此时param不能为空,否则会出现 HTTP Status 400 – Bad Request
* 可以通过@RequestParam注解来设置别名,默认值,是否必须等
* get方式 : http://localhost:8080/springmvc/basicType?param=16666
* post方式 : http://localhost:8080/springmvc/basicType
* post方式注意: 指定param = 16 同时指定["Content-Type","application/x-www-form-urlencoded"]
*
* @param param
* @return json串
*/
@RequestMapping("/basicType")
@ResponseBody
public String basicType(int param) {
String msg = "the param is " + param;
logger.info(msg);
return msg;
}

  接着启动服务器,打开Postman,进行请求模拟测试。
  测试get方式,选择GET,输入 http://localhost:8080/springmvc/basicType?param=16666 结果如下图:

  可以看出结果为 the param is 16666 ,正是方法返回的值(注意这里@ResponseBody注解表示返回为JSON字符串格式)。

  测试post方式,选择POST,输入 http://localhost:8080/springmvc/basicType ,点击Body,选中x-www-form-urlencoded 模式,填入key为param,value为16,提交,结果如下图:

  可以看出结果为 the param is 16 ,正是方法返回的值。

2. 包装类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 参数为包装类型,如Integer
* 此时param可以为空,为空时值为null
* get方式 : http://localhost:8080/springmvc/wrapperType?param=16666
* post方式 : http://localhost:8080/springmvc/wrapperType
* post方式注意: 指定param = 16 同时指定["Content-Type","application/x-www-form-urlencoded"]
*
* @param param
* @return json串
*/
@RequestMapping("/wrapperType")
@ResponseBody
public String wrapperType(Integer param) {
String msg = "the param is " + param;
logger.info(msg);
return msg;
}

3. 数组类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 参数为数组类型
* get方式 : http://localhost:8080/springmvc/arrayType?params=Tome&params=Jack
* post方式 : http://localhost:8080/springmvc/arrayType
* post方式注意: 指定params=Tome&params=Jack 同时指定["Content-Type","application/x-www-form-urlencoded"]
*
* @param params
* @return json串
*/
@RequestMapping("/arrayType")
@ResponseBody
public String arrayType(String[] params) {
StringBuilder msg = new StringBuilder("params are : ");
for (String p : params) {
msg.append(p + " ");
}
logger.info(msg.toString());
return msg.toString();
}

4. 简单对象(简单对象包含对象,即多层级对象)

  此处要用到User对象,属性有 name , age ,同时有它们的getset方法,请读者自己手动建立,或者在本文下方去github下载本项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 参数为简单对象(简单对象包含对象,即多层级对象)
* get方式: http://localhost:8080/springmvc/objectType?name=Tom&age=18
* post方式: http://localhost:8080/springmvc/objectType
* post方式注意: 直接指定name=Tom&age=18(不需要加user.) 同时指定["Content-Type","application/x-www-form-urlencoded"]
* <p>
* 注意:若简单对象内部还包含一个对象如Contact contact,Contact有address和phone两个属性
* 那么参数传递的方式为name=Tom&age=18&contact.address=北京路&phone18074600000
*
* @param user
* @return json串
*/
@RequestMapping("/objectType")
@ResponseBody
public String objectType(User user) {
String msg = "user is : " + user;
logger.info(msg);
return msg;
}

5. 同属性多对象

  此处要用到Book对象,属性有 name , author ,同时有它们的getset方法,请读者自己手动建立,或者在本文下方去github下载本项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 同属性多对象
* get方式:http://localhost:8080/springmvc/objectsAttributeType?user.name=Jack&user.age=19&book.name=SpringBoot
* post方式:http://localhost:8080/springmvc/objectsAttributeType
* post方式注意: 指定name=Tom&age=18 同时指定["Content-Type","application/x-www-form-urlencoded"]。
* 会出现结果两个对象的name都为Tom。
* 若使用user.name方式则会显示null
* 因此需要使用到下面的initParamUser和initParamBook方法
*
* @param user
* @param book
* @return json串
*/
@RequestMapping("/objectsAttributeType")
@ResponseBody
public String objectsAttributeType(User user, Book book) {
String msg = "user is : " + user + ",book is : " + book;
logger.info(msg);
return msg;
}

//@InitBinder注解在本controller启动时会进行初始化
@InitBinder("user")
public void initParamUser(WebDataBinder binder) {
binder.setFieldDefaultPrefix("user.");
}

@InitBinder("book")
public void initParamBook(WebDataBinder binder) {
binder.setFieldDefaultPrefix("book.");
}

6. 集合List类型

  此处要用到UserListVO对象,属性有 List<User> userList , 同时有它们的getset方法,请读者自己手动建立,或者在本文下方去github下载本项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 参数为集合List类型(Set类型不太兼容,Map类型需要注意键值对,二者都不太常用)
* get方式:http://localhost:8080/springmvc/listType?userList[0].name=gaven&userList[1].name=jack
* post方式:http://localhost:8080/springmvc/listType
* 指定userList[0].name=gaven&userList[1].name=jack
* 同时指定["Content-Type","application/x-www-form-urlencoded"]。
*
* @param userListVO
* @return json串
*/
@RequestMapping("/listType")
@ResponseBody
public String listType(UserListVO userListVO) {
StringBuilder msg = new StringBuilder("userList are : ");
for (User user : userListVO.getUserList()) {
msg.append(user + " ");
}
logger.info(msg.toString());
return msg.toString();
}

  因为集合类型Set和Map不太常用,而且SpringMVC对于Set的兼容性不好,故此处没有介绍。

  本文的代码可以在github上找到,地址为:github.com/panhainan/spring-family

上一篇

评论系统未开启,无法评论!

如果有好的建议或疑问等可以发送邮件至:panhainan@yeah.net,或者添加QQ:1016593477,将你的建议或者疑问告诉作者,作者会对你的建议进行处理并补充到文章的尾部,谢谢大家的谅解!