目录

  • 前言
  • 不使用注解(不传则为null)
    • 基本数据类型和日期类型
    • 自定义类型POJO
  • @PathVariable注解
  • @RequestParam 注解
  • @RequestBody注解
  • 复杂对象Array,List,Map

前言

对于spring的controller方法参数映射,常用的注解有@RequestParam, @PathVariable, @RequestBody。另外不使用注解,请求参数也能够自动映射到方法形参上。到底有什么区别呢,
什么情况下该使用什么注解呢,本文做一个简单总结,不涉及源码,只是使用总结。使用的spring4版本为最新的 4.3.24.RELEASE

不使用注解(不传则为null)

基本数据类型和日期类型

不用注解,springmvc可以自动的将请求参数映射到同名的方法形参上,get请求和post请求都可以。
** 默认情况下,传入的日期类型必须为 yyyy/MM/dd HH:mm:ss 格式。例如 2018/12/21 17:01:12 **

  • get请求(Content-Type : application/x-www-form-urlencoded)

  • post 请求(Content-Type : application/x-www-form-urlencoded)

    方法代码
@RequestMapping(value = "getNoAnno")@ResponseBodypublic String getNoAnno(String name, String sex, Integer age, Date createTime) {System.out.println(name);System.out.println(sex);System.out.println(age);System.out.println(createTime == null ? null : DateUtils.dateToString(createTime, "yyyy-MM-dd HH:mm:ss"));return "success";}

但是有时候我们需要传入的日期格式是这样的yyyy-MM-dd HH:mm:ss ,怎么处理呢,只要在对应的参数上加上 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解
不过需要注意的是,pattern如果设置为yyyy-MM-dd HH:mm:ss,那么传入的参数必须严格遵守这个格式,例如传入 ‘2019-12-02’,就会报错。
反而pattern如果设置为yyyy-MM-dd,传入的实际值如果含有时间信息,则时间信息会被忽略掉,例如传入 ‘2019-02-12 12:02:21’, 后面的时间信息会被忽略,服务器得到的时间是 2019-02-12 00:00:00

@RequestMapping(value = "getNoAnno")@ResponseBodypublic String getNoAnno(String name, String sex, Integer age, @DateTimeFormat(pattern = "yyyy-MM-dd") Date createTime) {System.out.println(name);System.out.println(sex);System.out.println(age);System.out.println(createTime == null ? null : DateUtils.dateToString(createTime, "yyyy-MM-dd HH:mm:ss"));return "success";}

自定义类型POJO

不用注解,springmvc可以自动的将请求参数映射到pojo类的同名属性上,get请求和post请求都可以。
这种情况要求POJO的属性值与参数名一一对应。例如一个简单的Pojo类:User.java

public class User {private String name;private Integer age;private String sex;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")// DateTimeFormat注解用于处理Date类型参数转换,如果不加这个注解,那么请求参数必须是 yyyy/MM/dd HH:mm:ss 格式的,加了之后请求参数就需要 yyyy-MM-dd HH:mm:ss 格式了private Date createTime;...

controller 方法代码

@RequestMapping("withNoAnnoModel")@ResponseBodypublic String withNoAnnoModel(User user) {if (user == null) {System.out.println("user is null");} else {System.out.println(user.getName() + ":" + user.getSex() + ":" + user.getAge() + ":" + user.getCreateTime());}return "success";}
  • get 请求

  • post 请求

@PathVariable注解

@PathVariable 注解用于url参数上,get和post请求参数支持。

@RequestMapping("withPathVariable/{type}/{id}")@ResponseBodypublic String withPathVariable(@PathVariable("type") String type, @PathVariable("id") Integer id) {System.out.println(type + ": " + id);return "success";}

@RequestParam 注解

@RequestParam注解可以把request.getParameter()获取的参数转换为我们需要的方法形参,也就是说它可以把get请求?后面携带的key=value形式的参数绑定到方法形参上,也支持post请求body里
的请求参数,但目前我发现它只能对于基本数据类型,String和Date类型进行绑定,自定义类型好像不行(也有可能是我自己没找对方法,欢迎评论指出),如果要使用自定义类型,可以不加注解
@RequestParam 有一个name属性,如果请求参数和方法形参不一致,可以通过name属性进行调整,例如@RequestParam ("dateStr") String date, 前端传过来的dateStr属性就会映射到方法的date形参上
@RequestParam有一个required属性,表示是否必须,默认为true。也就是说前端如果没有传这个参数过来,会报错 Required ** parameter is not present
手动设置为false就可以了,不传则为null

@RequestMapping("withRequestParam")@ResponseBodypublic String withRequestParam1(@RequestParam String name, @RequestParam String sex, @RequestParam Integer age, @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date createTime) {System.out.println(name, "null");System.out.println(sex, "null");System.out.println(age, null);System.out.println(createTime == null ? null : DateUtils.dateToString(createTime, "yyyy-MM-dd HH:mm:ss"));return "success";}
  • get 请求
  • post 请求

@RequestBody注解

该注解用于读取Request请求的body部分数据(由此,get请求不适用该注解),使用系统配置的HttpMessageConverter进行解析,然后把相应的数据绑定到方法形参上
常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。

对于日期类型的处理,默认情况下Date类型要求传入的参数格式为: yyyy/MM/dd HH:mm:ss 格式,在PoJo类的date属性上添加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
注解,可以指定传入的参数格式。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

@RequestMapping("withjsonModel")@ResponseBodypublic String withjsonModel(@RequestBody User user) {if (user == null) {System.out.println("user is null");} else {System.out.println(user.getName() + ":" + user.getSex() + ":" + user.getAge() + ":" + user.getCreateTime());}return "success";}

复杂对象Array,List,Map

复合对象的话,直接用.号连接,List的话用[]来表示下标,map类型的话用 [] 来包裹键
User.java

public class User {private String name;private Integer age;private String sex;private Address address;private List<String> ids;private Map<String, Object> params;... get setter方法
}

Address.java

public class Address {private String area;private String code;private String street;

controller方法代码

 @RequestMapping("complexModel")@ResponseBodypublic String complexModel(User user) {System.out.println(user.getName());System.out.println(user.getParams());System.out.println(user.getIds());System.out.println(user.getAddress().getArea());System.out.println(user.getAddress().getStreet());System.out.println(user.getAddress().getCode());return "success";}
// 输出信息
12lsf
{key1=value1, key2=value2}
[1, 2]
浙江省
西湖区
123123

get请求
http://127.0.0.1:8080/admin/user/complexModel?name=12lsf&age=12&sex=1&ids[0]=1&ids[1]=2&params[key1]=value1&params[key2]=value2&address.area=浙江省&address.street=西湖区&address.code=123123

转载于:https://www.cnblogs.com/liu-shijun/p/11004210.html

Spring4MVC 请求参数映射和Content-type相关推荐

  1. 高仿真的类-请求参数映射

    /*** 请求参数映射**/ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public ...

  2. WebRequestDataBinder实现将请求参数映射为POJO对象

    这个WebRequestDataBinder在网上的中文介绍很少,今天看公司的框架时看到这一个东西,用于将webRequest中的所有请求参数映射为对象. 这个类是Spring2.25中就有的一个类. ...

  3. struts2之请求参数接收

    struts2之请求参数接收 1. 采用基本类型接受请求参数(get/post) 在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名的属性. 请求路径:http ...

  4. Spring3 MVC请求参数获取的几种场景

    访问/aaa/bbb所对应的@Controller @RequestMapping("/aaa")//类级别,可以不需要,如果要了,下面所有的请求路径前都需要加入/aaa publ ...

  5. SpringMVC 参数映射与文件上传

    hander参数映射 当我们要实现一个登陆功能时: 创建一个用于处理登录请求的Servlet 实现doget等其他http方法(一些情况可能根据业务需要限制请求方法) 从request对象中取出数据 ...

  6. 请求状态为200,前端报系统出错,后端日志报“Content type ‘application/octet-stream‘not supported“错误

    请求后端出现"Content type 'application/octet-stream'not supported"错误 错误描述: Content type 'applica ...

  7. restTemplate http请求报错:no suitable HttpMessageConverter found for response type and content type

    报错信息: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no sui ...

  8. SpringMVC的请求参数,类型转换器(日期格式),请求映射

    SpringMVC的请求参数,类型转换器(日期格式),请求映射 请求参数 springMVC将传递的参数封装到处理的方法形参中,达到快速访问参数的目的 普通参数类型 参数名与处理器方法形参名保持一致 ...

  9. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--参数自动映射篇(6/8)...

    文章目录 前情概要 路由.action的扫描.发现.注册搞定之后,后来我发现在我们的action里面获取参数往往都是通过request对象来一个一个获取.同样的一行代码我们不厌其烦的重复写了无数次.遂 ...

最新文章

  1. 自动驾驶技术现状与需求分析
  2. if(a==1且a==2且a==3),有没有可能为true?
  3. 「土行孙」机器人登上Science子刊封面,用气流在地下穿梭自如,速度达每秒4.8米...
  4. HDFS 的Trash回收站功能的配置、使用
  5. C#利用反射机制,获取实例的属性和属性值
  6. LeetCode 876. 链表的中间结点
  7. 第1次作业:阅读优秀博文谈感想
  8. vmware linux
  9. EnterpriseLibrary数据访问(3)加密连接信息
  10. 数据分箱4——卡方最优分箱 ChiMerge算法使用(有监督)
  11. 我的世界服务器自定义怪物怎么用,我的世界怪物属性自定义教程 怪物属性代码一览...
  12. vue element-ui NavMenu错位问题
  13. 博客园模板--博客园老牛大讲堂
  14. 银行窗口排队叫号系统实现
  15. 乌班图系统安装mysql
  16. KubeCon上海“行业客户云原生最佳实践日“成功举办,云原生在各行业落地生花...
  17. 华为路由器DHCP服务设置(一)
  18. adt变频器故障代码ol2_变频器常见故障代码及处理实例
  19. 程序人生——一名程序员的自我剖析
  20. java常用算法之冒泡排序简单例子

热门文章

  1. 学好python能干嘛-学会Python后都能做什么?网友们的回答简直不要太厉害
  2. python爬虫入门代码-Python爬虫入门(一) 网络爬虫之规则
  3. python画五角星-python画五角星和六角星程序 | 学步园
  4. python cookbook 中文版 第 3 版-《Python Cookbook》第三版中文版
  5. 鱼c论坛python课后题-【零基础】Python3学习课后练习题(十九)
  6. python编程基础与应用-Python程序设计基础与应用
  7. python爬虫能做什么项目-python爬虫实例项目大全
  8. oracle安装后怎么连接数据库,安装完odp后,连接oracle数据库
  9. cpu使用率 htop显示_Linux查看CPU和内存使用情况
  10. LeetCode 450 Delete Node in a BST(二叉搜索树中的删除结点)