@PathVariable、@RequestBody、@RequestParam、@ResponseBody、@Param的详解和用法

简介: @PathVariable、@RequestBody、@RequestParam、@ResponseBody、@Param的详解和用法

一、@PathVariable

1.首先Restful方法的基本概念:


REST架构的主要原则


对网络上所有的资源都有一个资源标志符。


对资源的操作不会改变标识符。


同一资源有多种表现形式(xml、json)


所有操作都是无状态的(Stateless)


具体例子:


https://github.com/git

https://github.com/git/git

https://github.com/git/git/blob/master/block-sha1/sha1.h

https://github.com/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08

https://github.com/git/git/pulls

https://github.com/git/git/pulls?state=closed

https://github.com/git/git/compare/master…next

————————————————

版权声明:本文为CSDN博主「小汤源.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lxy_lixinyuan/article/details/109906171


2.@PathVariable定义



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



3.明确一个URI的具体格式


具体URI的格式如下:


 [协议名] : // [用户名] : [密码] @ [服务器地址] : [服务器端口号] / [路径] ? [查询字符串] # [片段ID]


例:http://kkoneone:password@www.baidu.com:80/main/index.html;type=a;color=b?name=bob&id=123#main


而?后面的通常是URL路径参数,路径部分一般是"/xx"这样的,所以GetMapping中通常会用到("/id"),而PutMapping等其他的一般是不需要。

+25.png
+26.png4.使用方法

4.1方法参数名称和需要绑定的url中变量名称一致时

//请求路径:http://196.0.0.1/getUser/tom

@RequestMapping("/getUser/{name}")
    public User getUser(@PathVariable String name){
        return userService.selectUser(name);
    }

4.2方法参数名称和需要绑定的url中变量名称不一致时

用PathVariable注明,相当于备注了url变量名称就是方法参数名

@RequestMapping("/getUserById/{name}")
    public User getUser(@PathVariable("name") String userName){
        return userService.selectUser(userName);
    }

二、@RequestParam

1.@RequestParam定义:


@RequestParam (org.springframework.web.bind.annotation.RequestParam)用于将指定的请求参数赋值给方法中的形参。


2.小细节


如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通 过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400。

如果参数前不写@RequestParam(xxx)的话,那么就前端对应的xxx名字有无都行,如果有xxx名的话,那么就会自动匹配;没有的话,请求也能正确发送。

3.使用方法


处理URL的控制方法中获取URL中的参数,也就是?key1=value1&key2=value2这样的参数列表


3.1

//请求路径:http://127.0.0.1/user/?name=tom
@RequestMapping(value="/user")
public String getUserBlog(@RequestParam(value="name") String username) {
    return name;
}

三、@RequestBody

1.一般请求中返回体是json格式的(是一个集合、某个类)就会需要用到RequestBody。而也有特殊情况,前端发送一个参数但是用一个实体类接收(方便后面复用),这个时候就不需要RequestBody。

+27.png
+28.png
2.细节


后端参数是以@RequestBody修饰,前端传回的json数据时:


后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为), 实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。

json字符串中,如果value为""的话,后端对应属性如果是String类型的,那么接受到的就是"",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。

json字符串中,如果value为null的话,后端对应收到的就是null。

如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或""都行。

3.使用

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/addUser")
    public void addUser(@RequestBody User user){
        System.out.println(user);
    }
}

四、@ResponseBody

1.@ResponseBody注解的作用是将controller的方法返回的对象通过转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。是JavaBean对象转化为json格式,然后返回给前端。


2.使用方法:


@ResponseBody注解是写在方法上的

+29.png
3.细节:


在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。


五、@Param

1.概念:


@Param的作用是服务于SQL语句中的参数数值


@Param的作用就是给参数命名,比如在mapper里面某方法A(int id),添加注解后变成A(@Param("userId") int id)。当外部想要取出传入的id值,只需要取它的参数名userId就可以了。将参数值传如SQL语句中,通过#{userId}进行取值给SQL的参数赋值。


2.方法


2.1 @Param注解基本类型的参数


mapper、dao中的方法:

public User selectUser(@Param("userName") String name,@Param("userId") String id);

映射到xml中的<select>标签

<select id="selectUser" resultMap="User">  
   select * from user  where user_name = #{userName} and user_id=#{userId}  
</select>

#{userName} and  #{password}中的userName和password都是从注解@Param()里面取出来的,取出来的值就是方法中形式参数 String name 和 String pwd的值。


2.2@Param注解JavaBean对象


mapper中的方法:  

public List<User> getAllUser(@Param("user") User u);

映射到xml中的<select>标签

<select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper">  
        select   
        from user t where 1=1  
             and   t.user_name = #{user.userName}  
              and   t.user_age = #{user.userAge}  
    </select>  

@RequestParam和@PathVariable的区别

@PathVariable是在URL路径部分,@RequestParam是在请求参数部分


@PathVariable,例如/user/1

@RequestParam,例如user?userId=1

URL的设计选择:


1、当URL指向的是某一具体业务资源(或资源列表),例如博客,用户时,使用@PathVariable


2、当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam


例如我们会这样设计URL:


/blogs/{blogId}

/blogs?state=publish而不是/blogs/state/publish来表示处于发布状态的博客文章




@Param 与@RequestParam的区别

@Param 是mybatis注解,@RequestParam是Springboot的注解

@Param使用在DAO层函数,@RequestParam使用在Controlller层函数

@Param与XML的参数关联对应,@RequestParam与html前端请求参数关联对应

参考文章:


https://blog.csdn.net/originations/article/details/89492884


目录
相关文章
|
5月前
|
JSON Java 数据格式
@RequestParam与@RequestBody使用对比
@RequestParam与@RequestBody使用对比
85 8
|
XML JSON 数据格式
@RequestParam @RequestBody @PathVariable 等参数绑定
@RequestParam @RequestBody @PathVariable 等参数绑定
@RequestParam()和@PathVariable()的区别
@RequestParam()和@PathVariable()的区别
|
7月前
|
Java API Spring
spring注解中@RequestParam和@PathVariable的区别
spring注解中@RequestParam和@PathVariable的区别
147 0
|
XML JSON Java
【Java用法】@RequestParam、@RequestBody、@ResponseBody和@PathVariable的使用与区别
【Java用法】@RequestParam、@RequestBody、@ResponseBody和@PathVariable的使用与区别
154 0
|
XML JSON Java
详解@RequestParam和@RequestBody
你好看官,里面请!今天笔者讲的是@RequestParam和@RequestBody。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
499 3
详解@RequestParam和@RequestBody
|
Java API Spring
@RequestParam和@PathVariable的区别
@RequestParam注解获取URL中携带的请求参数的值既URL中“?”后携带的参数,传递参数的格式是:key=value;@PathVariable注解用于获取URL中路径的参数值,参数名由RequestMapping注解请求路径时指定,常用于restful风格的api中,传递参数格式:直接在url后添加需要传递的值即可
200 0
|
JSON 前端开发 数据格式
@RequestParam、@RequestBody、@PathVariable区别和案例分析
@RequestParam、@RequestBody、@PathVariable区别和案例分析
171 2
|
JSON 数据格式
@PathVariable,@RequestParam,@RequestBody区别
@PathVariable,@RequestParam,@RequestBody区别