Spring中的注解@RequestParam @RequestBody @ResponseBody的使用和区别

@RequestBody

  • @RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象,需要注意的是传入数据的属性名称要和后端javabean中定义的一致
  • @RequestBody要写在方法的参数前不能写在方法名上方

@ResponseBody

  • @ResponseBody的作用是将后端以return返回的javabean类型数据转为json类型数据
  • @ResponseBody要写在方法名上(如果使用@Restcontroller注解则不用写,因为Restcontroller注解里包含了ResponseBody注解)

区别

在GET请求中,不能使用@RequestBody.
在POST请求,可以使用@Request和RequestParam,但是如果使用@RequstBody,对于参数转化的配置必须统
@RequestParam 适用于Get请求且content-type为application/x-www-form-urlencoded
@RequestBody 适用于post请求且content-type为非application/x-www-form-urlencoded类型,一般为application/json

前端传过来的参数必须和实例类里的参数定义的一致,本例就是和CourseVo里的属性名称一致

package com.stu.eduservice.controller;

import com.stu.commonutils.ResultData;
import com.stu.eduservice.entity.vo.CourseVo;
import com.stu.eduservice.service.IEduCourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 课程 前端控制器
 * </p>
 *
 * @author stu
 * @since 2021-05-29
 */
@RestController
@RequestMapping("/eduservice/course")
@CrossOrigin
public class EduCourseController {

    @Autowired
    private IEduCourseService eduCourseService;

    //添加课程基本信息
    //@RestController里包含了ResponseBody注解,如果controller不是@RestController而是@Controller,则这里需要加上ResponseBody注解
    @PostMapping("addCourseInfo")
    public ResultData addCourseInfo(@RequestBody CourseVo courseVo){

        eduCourseService.saveCourseInfo(courseVo);
        return ResultData.success();
    }

}

@requestBody注解的使用

@RequestBody这个一般处理的是在ajax请求中声明contentType: “application/json; charset=utf-8”时候。也就是json数据格式或者 xml 数据格式

1、@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。

2、通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。
例如说以下情况:

$.ajax({
    url:”/login”,
    type:”POST”,
    data:’{“userName”:”admin”,”pwd”,”admin123”}’,
    content-type:”application/json charset=utf-8”,
    success:function(data){
      alert(“request success ! “);
    }});

java代码

@requestMapping(“/login”)
public void login(@requestBody String userName,@requestBody String pwd){
      System.out.println(userName+” :”+pwd);
    }

这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,但是呢假如我有一个User类,拥有如下字段:
String userName; String pwd;
那么上述参数可以改为以下形式:@requestBody User user 这种形式会将JSON字符串中的值赋予user中对应的属性上
需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。

3、特殊情况 @requestBody也可以用来处理content-type类型为application/x-www-form-urlcoded的内容,只不过这种方式
不是很常用,在处理这类请求的时候,@requestBody会将处理结果放到一个MultiValueMap<String,String>中,这种情况一般在,特殊情况下才会使用,例如jQuery easyUI的datagrid请求数据的时候需要使用到这种方式、小型项目只创建一个POJO类的话也可以使用这种接受方式

@RequestParam

@RequestParam这个一般就是在ajax里面没有声明contentType的时候,为默认的. 另外使用form提交数据的就只能使用@RequestParam接收。

@responseBody注解的使用

1、@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML
数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

@RequestMapping(“/login”)
@ResponseBody
public User login(User user){
    return user;
  }

User字段:userName pwd
那么在前台接收到的数据为:’{“userName”:”xxx”,”pwd”:”xxx”}’

效果等同于如下代码:

@RequestMapping(“/login”)
public void login(User user, HttpServletResponse response){
   response.getWriter.write(JSONObject.fromObject(user).toString());
  }

 

posted @ 2021-05-30 01:04  程序员小明1024  阅读(622)  评论(0编辑  收藏  举报