@RequestBody,@RequestParam和@Param的区别说明
⽬录
@RequestBody,@RequestParam和@Param区别
@Param
@RequestBody
@RequestParam
@RequestParam使⽤注意事项
⽐如下⾯的接⼝
为了拦截到参数为空的请求
@RequestBody,@RequestParam和@Param区别
@Param
@Param是mybatis中的注解,⽤注解来简化xml配置的时候,@Param注解的作⽤是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传⼊sql语句中。请看下⾯的⽰例:
public interface Mapper {
@Select("select s_id id,s_name name,class_id classid from student where s_name= #{aaaa} and class_id = #{bbbb}")
public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id);
@
@
}
@RequestBody
@requestBody注解常⽤来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,⽐如说:application/json或者是application/xml等。⼀般情况下来说常⽤其来处理application/json类型。
通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。
例如说以下情况:
$.ajax({
url:"/login",
type:"POST",
spring mvc和boot区别data:'{"userName":"admin","pwd","admin123"}',
content-type:"application/json charset=utf-8",
success:function(data){
alert("request success ! ");
}
});
@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中的属性名,否则是请求不过去的。
处理HttpEntity传递过来的数据,⼀般⽤来处理⾮Content-Type: application/x-www-form-urlencoded编
码格式的数据。
GET请求中,因为没有HttpEntity,所以@RequestBody并不适⽤。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使⽤HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
@RequestParam
⽤来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)RequestParam可以接受简单类型的属性,也可以接受对象类型。
实质是将Parameter() 中的Key-Value参数Map利⽤Spring的转化机制ConversionService配置,转化成参数接收对象或字段。
在Content-Type: application/x-www-form-urlencoded的请求中,get⽅式中queryString的值,和post⽅式中 body data的值都会被Servlet接受到并转化到Parameter()参数集中,所以
@RequestParam可以获取的到。
@RequestParam使⽤注意事项
@RequestParam:将请求参数绑定到你控制器的⽅法参数上
该注解中有⼀个属性required,表⽰是否包含该参数,默认为true,表⽰该请求路径中必须包含该参数,如果不包含就报错。
但是⼤家使⽤的时候不要产⽣误区,required=true是能校验请求中是否包含该参数,但是不能校验参数值是否为空.
⽐如下⾯的接⼝
为了拦截到参数为空的请求
还需要在参数中加 @Valid @NotBlank
如下:
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论