zoukankan      html  css  js  c++  java
  • @RequestBody和@RequestParam用法总结

    @RequestBody和@RequestParam的使用

    @RequestBody

    @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

    @RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/jsonapplication/xml等类型的数据。

    GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。

    POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置来解析HttpEntity中的数据,然后绑定到相应的bean上。

    如果前端向后端传递的是非实体类对象,后台也可以使用@RequestBody注解,那就用List<Map<String, String>>来接收

    @RequestParam

    用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

    POST类型和GET类型都可以使用@RequestParam注解来接收参数

    @RequestParam注解有三个参数

    • required 表示是否必须,默认为 true,必须。

    • defaultValue 可设置请求参数的默认值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值。

    • value 为接收url的参数名(相当于key值)。

    举例:

    //一下两种写法效果一模一样
    @RequestParam("") 或 @RequestParam(value="")
    
    //当配置多个属性的时候
    @RequestParam(value="", required=true, defaultValue="")
        
    //如果使用下面这种方式接值,那么前台穿过来的参数名称就要和inputStr一样,这里才能接收到
    @RequestParam String inputStr
        
    //但是如果加上value属性的话,那么前台传过来的参数名称就要和value属性中的一致才能接收到
    @RequestParam(value="aa") String inputStr  
        
    //如果加上required属性,当required=true就是必须要传参值过来, 当required=false表示不传的话,会给参数赋值为null
    @RequestParam(value="aa", required=true)
        
    //有一种特殊情况是参数为int类型时,设置required=false后参数不传值得话会给int类型参数赋值为null,而int是基本数据类型不能赋值为null,所以会报错,此时要将int类型改为Integer类型
    @RequestParam(value="inputInt", required=false) int inputInt  
    

    @RequestParam接收对象类型

    这里举个栗子

    实体类是People属性如下

    private String name; //姓名
    private int age; //年龄
    private String sex;  //性别
    

    前台代码(拿JSP举例)

    <input type="text" value="黑黑" name="name">
    <input type="text" value="18"  name="age">
    <input type="text" value="男"  name="sex"> 
    

    后台代码

    int addPeople(@RequestParam People people) {}
    //这时候使用@RequestParam注解修饰参数 只要前台传的参数名称和people类中的属性名一致就可以自动封装进People实体类
    

    这里我又想到一个问题,加和不加@RequestParam参数有什么区别呢?

    其实不加@RequestParam参数也没问题(此时的参数名称要和前台传过来的参数名称保持一致),也可以接收到前台传过来的参数,当前台没有传值时接收到的为null,只不过使用@RequestParam是为了用它里面的一些属性,比如默认值或required属性。

    总结

    1. Post请求接收@RequestBody修饰的参数和@RequestParam修饰的参数,而Get请求则只能接收@RequestParam修饰的参数。
    2. 如果前端传的是Json类型的对象,后台就要使用@RequestBody修饰的实体类接收,如果是单个属性就使用@RequestParam修饰的变量或实体类接收
  • 相关阅读:
    EF-CodeFirst-3搞事
    EF-CodeFirst-1 玩起来
    EF-CodeFirst-2玩的嗨
    Asp.Net SignalR Hub类中的操作详解
    Asp.Net SignalR GlobalHost外部通知
    Asp.Net SignalR 多平台的Client与Server
    Asp.Net SignalR 集群会遇到的问题
    常用数学符号读法大全
    关于神经网络拟合任意函数的讨论
    Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)
  • 原文地址:https://www.cnblogs.com/blackblack/p/13904187.html
Copyright © 2011-2022 走看看