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

2023-10-27

一、@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等其他的一般是不需要。

 

4.使用方法

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。

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注解是写在方法上的

 3.细节:

在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

五、@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

mybatis传多个参数(不使用@param注解情况和使用@param注解的情况)_ghgxm520的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@PathVariable、@RequestBody、@RequestParam、@ResponseBody、@Param的详解和用法 的相关文章

随机推荐