@Param,@RequestBody、@RequestParam 、@PathVariable、 @ResponseBody总结
前言
在开发中这几个注解经常性的忘记如何使用,几者之间的区别,今天做一下总结,方便之后的复习
以下部分内容有摘自其他文章,如有侵权,请联系作者修改
@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中的属性对应,如果多个参数没有加此注解那么就需要使用param1,param2索引来实现。
@RequestParam注解的作用
@RequestParam是来传递参数的,用于将请求参数区数据映射到功能处理方法的参数上。
在控制层 Controller 中,有时候写接口会带@RequestParam,有时候也可以不带。
如果带@RequestParam,它一般有三个值,Value,required,defaultValue。
public String XXX(@RequestParam(value = "Id", required = false) String Id,)
@RequestParam主要参数:
- Value:代表你传参的参数名称,例如 @RequestParam(value=“id”) Long userId。在这里,你 传userId是没有用的,你必须传id,因为value指定了你必须传哪个参数名。当然,你也可以省略value 不写,直接写参数名。
- required:默认是true,也就是说,你不显示定义required=false,那么你就必须传参
- defaultValue:表示默认值的意思,如果你不传参,也可以通过,因为defaultValue起到了作用。
@RequestBody注解的作用
(注意:以下@RequestBody部分内容摘自: https://blog.csdn.net/zyx1260168395/article/details/103207614.
- @requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
- 使用@RequestBody只能发送POST请求
- ajax中的默认发送的参数类型及编码为:application/x-www-form-urlcoded,而使用@RequestBody时参数类型及编码为:aplication/json或者是application/xml,通过contentType属性来指定
- 在传递之前,对JSON对象要使用JSON.stringify(),JSON.stringify() 方法将一个 JavaScript 值(对象或者数组)转换为一个 JSON 字符串
- 一个请求不能同时存在多个@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对象
但是如果前端是如下表单则不能直接使用**JSON.stringify($(’#signupForm’).serialize())**来传值,需要另外进行一次转换
<form class="form-horizontal m-t" id="signupForm">
<div class="form-group">
<label class="col-sm-3 control-label">姓名:</label>
<div class="col-sm-6">
<input id="name" name="name" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<div class="col-sm-8 col-sm-offset-3">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
转换方式
/**
* 表单转json
*/
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [ o[this.name] ];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
然后使用**JSON.stringify($(’#signupForm’).serializeObject())**传值
@PathVariable注解的作用
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable(“xxx”) 绑定到操作方法的入参中。
加注解时
@GetMapping("/toPass/{id}")
public String toPass(@PathVariable("id") Long id) {
return prefix + "/toPass";
}
发起请求时,请求路径后面需要加上参数
没有加注解时
@GetMapping("/toPass")
public String toPass(Long id) {
return prefix + "/toPass";
}
发起请求时,请求路径后面不需要加上参数
@ResponseBody注解的作用
1.@ResponseBody,一般时存在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";
}
}
扩展:
关于POSTMAN传参不能接收的问题解决方案
问题:
post请求Map参数中有数组集合时参数不能接收问题。
解决方案:
将Map参数转化为json串传给后台进行接收。也可以后台定义一个实体类进行接收。
在requestMapping里面添加consumes = “application/json”,以json的形式传参。注解使用RequestBody,不然参数会接收不到(application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam)
使用Map接收参数时,如果是url后面跟得参数需要用**@RequestParam注解**,如果使用json传参需要使用**@RequestBody注解**
以上见解只是为个人方便日后复习,如有错误,希望各位大佬能评论提醒,感谢!