一、@PathVariable
1.首先Restful方法的基本概念:
REST架构的主要原则
对网络上所有的资源都有一个资源标志符。
对资源的操作不会改变标识符。
同一资源有多种表现形式(xml、json)
所有操作都是无状态的(Stateless)
具体例子:
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 数据。
五、@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