前言

对于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")
@ResponseBody
public 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")
@ResponseBody
public 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")
@ResponseBody
public 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}")
@ResponseBody
public 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")
@ResponseBody
public 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")
@ResponseBody
public 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")
@ResponseBody
public 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

Spring4MVC 请求参数映射和Content-type的更多相关文章

  1. struts2之请求参数接收

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

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

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

  3. struts2接受请求参数

    https://blog.csdn.net/y249839817/article/details/77702745 https://blog.csdn.net/nthack5730/article/d ...

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

    handler参数映射: 接下来就是Spring的各个处理细节了,无论框架如何疯转其实我们处理请求的流程是不变的,设计到的操作也是固定的,举个例子,当我们要实现一个登陆功能时: 创建一个用于处理登录请 ...

  5. FiddlerScript修改特定请求参数下的返回值

    使用场景: api/Live/GetLiveList接口: (1)Type为1,接口返回直播列表 (2)Type为2,接口返回回放列表 现在想修改直播列表的返回值 思路: 利用FiddlerScrip ...

  6. SpringMVC——映射请求参数

    Spring MVC 通过分析处理方法的签名,将 HTTP 请求信息绑定到处理方法的相应人参中. @PathVariable @RequestParam @RequestHeader 等) Sprin ...

  7. Jmeter发送post请求报错Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    常识普及: Content-type,在Request Headers里面,告诉服务器,我们发送的请求信息格式,在JMeter中,信息头存储在信息头管理器中,所以在做接口测试的时候,我们维护Conte ...

  8. Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...

  9. SpringMVC之使用requestMapping映射请求、映射参数、映射头

    1. 映射请求 作用:使用requestMapping可以指定处理器可以处理那些请求 地方:类和方法前面都可以 @requestMapping 类定义处: 提供初步的请求映射信息,相对于web应用的根 ...

随机推荐

  1. tomcat 的log4j配置问题

    #log4j.rootLogger=DEBUG,stdout,filelog4j.rootLogger=ERROR,stdout,filelog4j.appender.stdout=org.apach ...

  2. COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)

    ★   输入文件:AgeSort.in   输出文件:AgeSort.out   简单对比时间限制:1 s   内存限制:2 MB [题目描述] Mr.Zero(CH)喜闻乐见地得到了一台内存大大增强 ...

  3. 一个JSON字符串和文件处理的命令行神器jq,windows和linux都可用

    这个命令行神器的下载地址:https://stedolan.github.io/jq/# Windows和Linux版本均只有两个可执行文件,大小不过2MB多. 以Windows版本为例,介绍其用法. ...

  4. 三星系列NXP系列核心板设计研发-迅为嵌入式ARM方案提供商

    多种核心板平台,从硬件原型设计.layout.硬件驱动,操作系统移植.中间到上层应用等方面. 三星系列核心板: 1. SCP-4412核心板 三星Exynos4412 四核 Cortex-A9 主频为 ...

  5. Oracle数据库升级前必要的准备工作

    Oracle数据库升级向来是一门纷繁复杂的工程,DBA需要为产品数据库的升级耗费大量时间精力在准备工作上:因为其升级复杂度高,所以即便做了较为充分的准备仍可能在升级过程中遇到意想不到的问题,为了更高效 ...

  6. tcp 三次握手四次挥手

    1.三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK.SYN.FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三次握手过程说 ...

  7. python基础一 day7 复习文件操作

    read()原样输出 读取出来的是字符串类型 readline()输出一行 读取出来的是字符串类型 readlines()把每行文本作为一个字符串存入列表,并返回列表 打开方式: b以bytes类型打 ...

  8. 最小生成树 || HDU 1301 Jungle Roads

    裸的最小生成树 输入很蓝瘦 **并查集 int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } 找到x在并查集里的根结点,如果 ...

  9. HUST软件与微电子学院第八届程序设计竞赛-小乐乐下象棋

    这题其实很简单,我们可以用一个bfs搜索出所有的,小于k步的,到不同点不同步数的方案数. 我们首先初始化,走到(0,0)点的时候,我们把步数设置为0,但是方法数设置为1,这是因为我们走零步,到一个点, ...

  10. Ubuntu 和 centos7 服务的启动

    Ubuntu 下: /etc/init.d/nginx  start | stop | reload Centos7下: service nginx start | stop | reload