欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

@Param,@RequestBody、@RequestParam 、@PathVariable、 @ResponseBody总结

程序员文章站 2022-04-27 20:27:15
...

前言

在开发中这几个注解经常性的忘记如何使用,几者之间的区别,今天做一下总结,方便之后的复习
以下部分内容有摘自其他文章,如有侵权,请联系作者修改

@Param注解的作用

@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,当我们的传递的参数不止一个时,我们会通过@Param注解来进行区分(是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)。),如果是一个参数时,不需要添加也可以。

dao层示例:

Public User xxx(@param(“userName”) String user_name ,@param(“password”) String password);

xml映射对应示例:

    <select id=" xxx" resultMap="BaseResultMap">  
       select  *  from user_user_t   where user_name = #{userName} and user_password=#{password}  
    </select>

注意:采用#{}的方式把@Param注解括号内的参数进行引用(括号内参数对应的是形参如 userName对应的是user_name );

不使用@Param注解
如果不使用注解的话,参数只能有一个,而且该参数必须与javabean中的属性对应

@RequestParam注解的作用

@RequestParam是来传递参数的,用于将请求参数区数据映射到功能处理方法的参数上。
在控制层 Controller 中,有时候写接口会带@RequestParam,有时候也可以不带。
如果带@RequestParam,它一般有三个值,Value,required,defaultValue。

public String XXX(@RequestParam(value = "Id", required = false) String Id,)

@RequestParam主要参数:

  1. Value:代表你传参的参数名称,例如 @RequestParam(value=“id”) Long userId。在这里,你 传userId是没有用的,你必须传id,因为value指定了你必须传哪个参数名。当然,你也可以省略value 不写,直接写参数名。
  2. required:默认是true,也就是说,你不显示定义required=false,那么你就必须传参
  3. defaultValue:表示默认值的意思,如果你不传参,也可以通过,因为defaultValue起到了作用。

@RequestBody注解的作用

(注意:以下@RequestBody部分内容摘自: https://blog.csdn.net/zyx1260168395/article/details/103207614.

  1. @requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
  2. 使用@RequestBody只能发送POST请求
  3. ajax中的默认发送的参数类型及编码为:application/x-www-form-urlcoded,而使用@RequestBody时参数类型及编码为:aplication/json或者是application/xml,通过contentType属性来指定
  4. 在传递之前,对JSON对象要使用JSON.stringify(),JSON.stringify() 方法将一个 JavaScript 值(对象或者数组)转换为一个 JSON 字符串
  5. 一个请求不能同时存在多个@RequestBody

ajax代码

$.ajax({
    url: "workbench/activity/deleteActivity.do",
    contentType:"application/json;charset=utf-8",//必须指定数据类型为application
    type: "post",//请求必须是post
    dataType: "json",
    data: JSON.stringify([{id:"1",name:"ceshi1"},{id:"2",name:"ceshi2"}]),//必须使用JSON.stringify(),如果是json字符串,要用eval()方法转为json对象
    success: function (data) {
        if (data.success) {
            alert("发送成功");
        } else {
            alert("发送失败");
        }
    }
})

后台接收
后台可以根据发回来的数据,使用Map,数组,实体类(要有相应属性的set()方法),集合来接收参数

@RequestMapping("/deleteActivity")
public void deleteActivity(@RequestBody List<Map> ids) {
    activityService.deleteActivityById(ids);
    return HandleFlag.successTrue();
}

简单理解
1.当客户端的HTTP请求参数contentType设置为:application/json
2.服务端的处理接口参数使用:@RequestBody注解,就会把客户参数当成一个javaBean进行耦合字段赋值,简单的说就是,把客户的json对象转换为javaBean对象

@PathVariable注解的作用

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable(“xxx”) 绑定到操作方法的入参中。

加注解时

 @GetMapping("/toPass/{id}")
    public String toPass(@PathVariable("id") Long id) {
        return prefix + "/toPass";
    }

发起请求时,请求路径后面需要加上参数
@Param,@RequestBody、@RequestParam 、@PathVariable、 @ResponseBody总结

没有加注解时

    @GetMapping("/toPass")
    public String toPass(Long id) {
        return prefix + "/toPass";
    }

发起请求时,请求路径后面不需要加上参数
@Param,@RequestBody、@RequestParam 、@PathVariable、 @ResponseBody总结

@ResponseBody注解的作用

[email protected],一般时存在controller层,该注解的作用是将后台查询的数据转换成json格式传值前台进行展示,包括前台传输数据时也要以json的格式传输给后台。

示例:

    @ResponseBody
	@GetMapping("/list")
	public PageUtils list(@RequestParam Map<String, Object> params){
		//查询列表数据
        Query query = new Query(params);
		List<InsuranceMsgDO> insuranceMsgList = insuranceMsgService.list(query);
		int total = insuranceMsgService.count(query);
		PageUtils pageUtils = new PageUtils(insuranceMsgList, total);
		return pageUtils;
	}

如果在Controller没有添加注解,则我们一般是跳转页面
示例:

    @GetMapping("/add")
	String add(){
	    return "add";
	}

而我们在进行spring框架开发的时候,几乎每一个方法都需要添加@ResponseBody注解,所以之后又形成了@RestController注解,它的作用就是将@Controller和@ResponseBody结合,包括了该两个注解的作用。
示例:

@RestController
@RequestMapping("/test")
public class Test {
    public String test(){
        return "hello";
    }
}

以上见解只是为个人方便日后复习,如有错误,希望各位大佬能评论提醒,感谢!