SpringMVC的方法形参注解(Restful风格)

SpringMVC的方法形参注解有:

  • @RequestBody
  • @RequestParam
  • @PathVariable
  • @ModelAttribute

1.@RequestBody

作用:通过@RequestBody 将请求体中的json数据包装成实体类(Category category)

要求:将请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

@PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("category:{}",category);
        categoryService.save(category);
        return R.success("新增分类成功");
    }

请求体中的json数据:

查询数据库中的数据:

2.@RequestParam

作用:用于接收url地址传参或表单传参,配置形参属性

PS:方法的参数叫形参

1.指定形参名字

首先,我们先来看一下简单的key-value参数,url请求路径传来了?ids=xxxxxxx形式的参数,

经过测试发现,用下面的两种形参都可以直接接收数据

像这种简单的key-value传参,不需要用到@RequestParam,直接接收即可。那么问题来了为什么我们还需要@RequestParam这个注解呢?

如果把方法的形参Long ids改成Long id,你会发现新的形参无法接收url传过来的数据,报了400错误

这时候如果将形参加上@RequestParam修改成下面的样子,发现又可以接收url传递的数据了

这是因为,@RequestParam可以对自定义简单类型的参数进行绑定,即如果使用@RequestParam,就无须设置controller方法的形参名称与request传入的参数名称一致。而不使用@RequestParam注解时,就要求controller方法的形参名称与request传入的参数名称一致,这样才能绑定成功。

另外,不加注解的形参接收方法只能接收简单类型的形参,所有从页面传到后台的数据都是String类型,通过request.getParameter()获取的也是String数据类型,但是Spring会自动的进行String和八大基本数据类型转换。当时如果不是八大基本类型的数据会报一个找不到默认构造函数的异常。

所以需要加上@RequestParam。其实这是一种省略的写法,如果形参和传参名字一样可以省略不写

此时@RequestParam=@RequestParam(value="ids")

2.设置非空

require不写默认为true

3.设置默认值

如果有一些参数可以为空,但是又期望它们为空时有一个默认值,此时可以使用@RequestParam注解中的defaultValue属性来指定某些参数的默认值。

/**
 * 根据用户ID,获取用户信息
 */
@RequestMapping(value="getUser",method=RequestMethod.GET)
public String getUser(@RequestParam(value="user_id",defaultValue="1") int userId,Model model)
{
    //忽略具体代码...
}

3.@PathVariable区别

作用:用于接收路径参数,{路径参数名}

@DeleteMapping("/{id}")
    public R<String> delete(@PathVariable Long id){
        log.info("删除分类,id为:{}",id);
        categoryService.removeById(id);
        return R.success("分类信息删除成功");
    }

要求:绑定路径参数名与处理器方法形参名一一对应。

如上例子,绑定路径参数为/{id}中的id,与@PathVariable注解的 Long id变量名一致。

4.@ModelAttribute

作用:@ModelAttribute方法通常被用来填充一些公共需要的属性或数据。

比如将传进来的json数据User的国籍默认为中国。而且@ModelAttribute常常需要配合Model类使用。

package com.example.modelattributetest.entity;

import org.springframework.stereotype.Component;

@Component
public class User {
    String name;
    String gender;
    String nation;

    public String getNation() {
        return nation;
    }

    public void setNation(String nation) {
        this.nation = nation;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}
package com.example.modelattributetest.Controller;

import com.example.modelattributetest.entity.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/hello")
public class MyController {

    @ModelAttribute("myUser")
    public User populateModel(@RequestBody User user, Model model) {
        user.setNation("中国");
        //等同于model.addAttribute("User",user);从model中获取数据
        model.addAttribute(user);
        return user;
    }

    @PostMapping
    public User helloWorld( @ModelAttribute("myUser") User user) {
        System.out.println(user.getName());
        return user;
    }
}

从广义上来说,Model指的是MVC中的M,即Model(模型)。从狭义上讲,Model就是个key-value集合。实际上,上图方法得到的model对象就是一个 java.util.Map ,你可以将Model类型替换为Map<String, Object> ,或者ModelMap——一个实现了Model接口的java.util.HashMap

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值