07-request 参数和 controller 方法参数的绑定对应

主题

  • 如何在SpringMVC controller中获取请求request 里的参数 request parameter
  • 如何将请求参数绑定到不同的参数对象
  • 如何使用@RequestParam,并且知晓何时不需要该注解
  • 以下案例都是get 请求获取request 参数
  • 且要明白request上的请求参数 都是以String形式pass的,Spring需要做很多中间处理,将String类型的值转成Controller中你设定的目的类型

@RequestParam 案例

@Requestparam 注解用来建立 方法参数(method param)与请求参数(request param)的对应关系

1. 绑定方法参数与请求参数的对应关系
  • url: /books?category=java //参数category 不可缺
  • Controller 代码
@RequestMapping("/books")
//@RequestParam("category") 建立 url中 请求参数-category 和 方法参数-cat 之间的对应关系 
//注:当请求参数和方法参数同名时,可省略@RequestParam中的value 值-自动绑定
public String books(@RequestParam("category") String cat) {
    //bussiness logic
    sout("category " + cat)
    return "book.jsp";
}
2. 自动类型转换

当Request Param 不是 String类型如而是 number时,我们可自动将其转成 number类型的 method 参数

  • url: /books?rate=5&maxprice=150.55
  • 目的:将rate转成int,将 maxprice 转成 BigDecimal
@RequestParam("category") 
//只需直接指定想要转变成的类型,如 rate 为 int,maxprice 为 BigDecimal
public String books(@RequestParam("rate") int rate, 
                        @RequestParm("maxprice") BigDecimal maxprice) {
    //bussiness logic
    sout("rate " + rate +", maxprice " + maxprice)
    return "book.jsp";
}
3. request参数为日期类型
  • url: /books?from=2012-01-12
  • 目的:想传递一个日期类型,且controller自动将字符串“2012-01-12” 转成controller方法参数中日期格式
@RequestMapping("/books")
public String books(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) 
                    @RequestParam("from") LocalDate from) {
        //首先用 @DateTimeFormat注解,而且是用其中的ISO.DATE做格式转化, DATE 标识:yyyy-MM-dd
        //再用LocalDate格式做参数,LocalDate 标识:year-month-day
        //java.util.Date:年 月 日 hh mm ss
        System.out.println("from " + from);
        return "book.jsp";
    }

4. request 参数为不必须
  • url: /books?category=math
  • category 不是必须的
@RequestMapping("/books")
public String books(@RequestParam("category", required=false) String cat) {
        //@RequestParam 默认required = true,为false时 该参数不必须
        System.out.println("category " + cat);
        return "book.jsp";
    }
5. request 自带默认值, 用于以下1/2种场景
  • url1: /books? //输出:history --category 为 null, required 可以为 false
  • url2: /books?category= //输出:history --category 为 null
  • url3: /books?category="" // 输出:""
@RequestMapping("/books")
public String books(@RequestParam("category", defaultValue="history") String cat) {
        System.out.println("category " + cat);
        return "book.jsp";
}
6. @RequestParam 为List or array
  • url: /books?authors=zhangsi&authors=lisi
  • request 中同名的参数将自动转化成 controller 中的@RequestParam List ,必要时可用 value 属性指定参数名
  • 方法参数写成 String[] 也可以
@RequestMapping("/books")
public String books(@RequestParam List<String> authors) {
        System.out.println("authors " + authors);
        return "book.jsp";
}
7. @RequestParam 为Map,一个key 对应一个value值
  • url: /books?category=math&authors=lisi
  • controller 参数在这种情况下不能通过 @RequestParam的value指定具体request 参数名
  • controller参数类型 为 Map 就出现了一个 谁是 Key,谁是Value的问题,这个是自动装配
  • 根据requet 参数请求顺序,前面的为 key , 后面的为 value
@RequestMapping("/books")
public String books(@RequestParam Map<String, String> book) {
        
        System.out.println("book " + book);
        return "book.jsp";
}

输出:{category=math, authors=lisi}
8. @RequestParam 为MultiValueMap,一个key 对应一个多个 value 值
  • url: /books?category=math&authors=lisi&authors=zhangsi
  • 参数同样具有顺序性,第一个为key, 其余同名参数封装为 value
@RequestMapping("/books")
public String books(@RequestParam MultiValueMap<String, List<String>> book ) {
        
        System.out.println("book " + book);
        return "book.jsp";
}
输出:{category=[math], authors=[lisi, zhangsi]}
9. 不声明 @RequestParam
  • url: /books?category=math
  • 默认 request 和 controller 方法参数同名,可省略 @RequestParam
@RequestMapping("/books")
public String books(String category) {
        
        System.out.println("category " + category);
        return "book.jsp";
}
输出:math
建议:指明 @RequestParam
10. request 参数为field, 而 controller 参数为 Object
  • url: /books?category=math&author=lisi
  • Object 对象 封装了两个field: category, author
  • 这个转换非常有用,尤其是多request 参数转成封装对象时
  • 注意此时是无@RequestParam的,有则400

public class Box{
    String category;
    String author;
    getter;
    setter;
    String toString() {
        return "category=" + category +", author=" + author;
    }
}

@RequestMapping("/books")
public String books(Box box ) {
        System.out.println("box " + box);
        return "book.jsp";
}
输出:category=math, author=lisi
注意
  • 以上 @RequestMapping 省略掉method 属性,则说明所匹配的方法 可以接受任何请求,PUT/GET/DELETE/POST,并非默认为GET
  • 当method 为 PUT/POST/DELTE时,url 中仍可以用"**?name=lisi" 传递参数,因为POSTMAN中这些方法没有parameter选项,直接写在url中即可
参考:https://reversecoding.net/spring-mvc-requestparam-binding-request-parameters/#default-test
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,188评论 1 23
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • 今天晚上犯懒了,不想写点东西了。但是想想自己之前订过的目标,所以咬咬牙还是要坚持写一写吧。 那我们就聊聊坚持这件事...
    小城的卡夫卡阅读 333评论 0 0
  • 今晚的《哈喽!葡星人》你有准时收看吗? 这下,故事的几位主角都到齐了 来自葡星的我和小Q 整天研究模型的侯烨 武艺...
    葡萄动画阅读 246评论 0 0