首页 > 编程语言 > 详细

Spring4MVC 请求参数映射和Content-type

时间:2019-06-11 16:52:04      阅读:126      评论:0      收藏:0      [点我收藏+]

前言

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

不使用注解

基本数据类型和日期类型

不用注解,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类型进行绑定,自定义类型好像不行(也有可能是我自己没找对方法,欢迎评论指出),如果要使用自定义类型,可以不加注解或者使用@ModelAttribute注解
@RequestParam 有一个name属性,如果请求参数和方法形参不一致,可以通过name属性进行调整,例如@RequestParam ("dateStr") String date, 前端传过来的dateStr属性就会映射到方法的date形参上

@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";
    }

技术分享图片
技术分享图片

Spring4MVC 请求参数映射和Content-type

原文:https://www.cnblogs.com/liu-shijun/p/11004210.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!