Spring - 参数绑定

标签:原创 Spring

更多Spring实战内容,请参考Spring - 实战指南

概述

常见的参数绑定方法有:

  • @PathVariable
  • @RequestParam
  • @RequestBody
  • @ModelAttribute

@PathVariable

@PathVariable用于解析路径中的变量,如:
http://localhost:8080/user/12

@GetMapping("/user/{userId}")
public Object test2(@PathVariable("userId") Long userId) {
    return userId;
}

可将路径中的12绑定到userId上

@RequestParam

@RequestParam用来绑定url上的参数,如

http://localhost:8080/test2?name=asdf&id=12

@GetMapping("/test2")
public Object test2(@RequestParam("name")String name, @RequestParam("id")Long id) {
    return "hehe";
}

当然,@RequestParam可以忽略不写

@RequestBody

@RequestBody用来绑定POST方法中,body中的数据。
如:
假设body中的数据为:

{
    "id":12,
    "name":"asdf"
}

通常将body中数据绑定到对象中。如:

@PostMapping("/test2")
public Object test2(@RequestBody User user) {
    return user;
}

@ModelAttribute

TODO

绑定原始类型

假设url为: http://localhost:8080/test2?name=asdf

Controller撰写方式为:

@GetMapping("/test2")
public Object test2(String name) {
    return name;
}

spring会自动将name绑定到cotroller方法参数列表中。前提是字段名称必须完全一致。

绑定对象

假设有类如下:

@Data
public class User {
    private Integer id;
    private String name;
}

绑定URL参数

假设有url: http://localhost:8080/test2?name=asdf&id=12

controller撰写方式为:

@GetMapping("/test2")
public Object test2(@RequestBody User user) {
    return user;
}

Spring会自动将name和id属性绑定到User对象中,无需加任何参数或注解。

绑定Post body数据

如果我们将数据放到Post Method的body中的话,参数映射需要@RequestBody注解。

假设body中的数据为:

{
    "id":12,
    "name":"asdf"
}

如果使用@RequestBody注解,但是不用对象承接参数的话,绑定的只是json字符串。如下所示:

@PostMapping("/test2")
public Object test2(@RequestBody String param) {
    return param;
}

param的值为上述json的字符串形式。

使用字符串,还需要反序列化成对象,会比较麻烦。如果直接用对象来承接数据的话,会更简单:

@PostMapping("/test2")
public Object test2(@RequestBody User user) {
    return user;
}

Spring会自动将body中的name和id分别映射到User对象的name和id属性中。

当然,如果User对象中有数组的话,能绑定成功吗?能!
假设User对象为:

@Data
public class User {
    private Integer id;
    private String name;
    private List<Integer> scores;
}

body中数据为:

{
    "scores":[91,98,97]
}

Controller撰写方式为:

@PostMapping("/test2")
public Object test2(@RequestBody User user) {
    return user;
}

scores也是能成功绑定到User对象中的。

绑定数组

方法一:使用对象类型绑定

@Data
public class User {
    private List<Integer> scores;
}

即如果想绑定scores这样一个数组,可以把数组放到一个对象中,使用对象来绑定参数。

Controller撰写方式为:

@PostMapping("/test2")
public Object test2(@RequestBody User user) {
    return user;
}

方法二:使用@RequestParam

使用@RequestParam注解绑定数组,需要有一定的规则。url形式需要是这样的:

http://localhost:8080?score=12&score=23&score=34

或者这样的:

http://localhost:8080?score=12,23,34

即url的param需要是一样的

即如果想绑定scores这样一个数组,可以把数组放到一个对象中,使用对象来绑定参数。

Controller撰写方式为:

@PostMapping("/test2")
public Object test2(@RequestParam(value="score") List<Integer>scores) {
    return scores;
}

这样,可以把参数中的所有score绑定到list上。

当然,如果有form表单是这样的,也是可以这样绑定的

<input type="checkbox" name="id" value="12" />
<input type="checkbox" name="id" value="23" />

绑定Map

绑定Map和绑定对象类似,都是比较简单的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,300评论 1 92
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • 总觉得特别浪费光阴,做设计的精彩要去现场做执行。虽然也能学到很多东西,但好像我不是我想要的……
    薇风阅读 163评论 0 0
  • 四年前去了丽江----向往已久的地方。 一路向南,飞抵昆明,短暂停留之后,踏上去丽江的火车。 车厢里满满的都是人,...
    山有木兮122阅读 495评论 0 2