这篇文章主要介绍了@RequestBody,@RequestParam和@Param的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
@RequestBody,@RequestParam和@Param区别
@Param
@Param是mybatis里的评论。使用注释简化xml配置时,@Param comment的作用是命名参数。参数命名后,可以根据名称获取参数值,并可以正确地将参数传入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); @Delete...... @Insert...... }
@RequestBody
@requestBody注释通常用于处理内容类型不是默认的application/x-www-form-URL编码的内容,比如application/json或application/xml。一般来说,经常用来处理应用/json类型。
请求体中的JSON字符串可以通过@requestBody绑定到对应的bean,当然也可以单独绑定到对应的字符串。
例如,说下面的话:
$.ajax({url:"/login",type:"POST",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字符串中两个变量的值被分别赋给两个字符串,但是假设我有一个用户类,它有以下字段:
String userName;String pwd;
那么以上参数可以改成以下形式:@requestBody user用户。这个表单将把JSON字符串中的值赋予User中相应的属性。
需要注意的是,JSON字符串中的key必须对应user中的属性名,否则将无法请求。
处理HttpEntity传递的数据,http entity通常用于处理非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类型)
Param可以接受简单类型或对象类型的属性。
本质上,Request.getParameter()中的键值参数映射是由Spring的ConversionService配置的,并转换成参数接收对象或字段。
在content-type:application/x-www-form-urlencoded的请求中,get模式下的queryString的值和post模式下的body data的值会被Servlet接受并转换成Request.getParameter()的参数集,所以@RequestParam可以得到。
@RequestParam使用注意事项@RequestParam:将请求参数绑定到你控制器的方法参数上
注释中需要一个属性,该属性指示是否包含该参数。默认值为true,表示该参数必须包含在请求路径中。否则,将会报告一个错误。
但是用的时候不要出错。required=true可以检查请求中是否包含该参数,但不能检查参数值是否为空。
比如下面的接口
http://127 . 0 . 0 . 1:9802/API/order/VR/testrequestparam这是可以截获的,因为param1不存在于请求参数中。
但是http://127 . 0 . 0 . 1:9802/API/order/VR/testrequestparamaram 1可以请求成功。
为了拦截到参数为空的请求
您还需要在参数中添加@Valid @NotBlank。
如下所示:
以上个人经验,希望能给你一个参考
精彩评论