概念
RestFul就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
功能
资源:互联网所有的事物都可以抽象为资源
资源操作:使用POST,DELETE,PUT,GET,使用不同方法对资源进行操作
分别对应,添加,删除,修改,查询
传统方式操作资源:通过不同的参数来实现不同的效果!方法单一,post,get
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
使用RestFul操作资源:可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
测试
新建一个Controller类 RestFulController
在springMVC中可以使用@PathVariable 注解,让方法参数的值对应绑定到一个URL模板变量上
@Controller
public class RestFulController {
//http://localhost:8023/springmvc_04_controller_Web_exploded/add?a=1&b=2 原来的写法
// http://localhost:8023/springmvc_04_controller_Web_exploded/add/1/2 RestFul风格
@RequestMapping("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model){
int result = a+b;
model.addAttribute("msg","结果为"+result);
return "test";
}
}
3.运行效果
使用路径变量的好处:
是路径变的更加简洁高效且安全,不会暴露参数
获得参数更加方便,框架会自动进行类型转换
通过路径变量的类型可以约束访问参数,如果请求类型不一样,则访问不到对应的请求方法,会报错400,请求错误
这样是比之前的写法简便许多,但好像还是无法理解同样的URL却是不同的作用,让我们继续测试,我们先看下RequestMapping的源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
发现其中还有个方法method,返回RequestMethod类型,而RequestMethod是一个枚举,其中就是不同的请求方式
public enum RequestMethod {
GET,
HEAD,
POST,
PUT,
PATCH,
DELETE,
OPTIONS,
TRACE;
这说明我们可以使用method属性来指定请求类型
用于约束请求的类型,可以收窄请求范围,指定请求谓词的类型如: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
让我们通过测试感受一下
public class RestFulController {
//http://localhost:8023/springmvc_04_controller_Web_exploded/add?a=1&b=2 原来的写法
// http://localhost:8023/springmvc_04_controller_Web_exploded/add/1/2 RestFul风格
@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
public String test(@PathVariable int a, @PathVariable int b, Model model){
int result = a+b;
model.addAttribute("msg","结果1为"+result);
return "test";
}
@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.POST)
public String test1(@PathVariable int a, @PathVariable int b, Model model){
int result = a+b;
model.addAttribute("msg","结果2为"+result);
return "test";
}
}
直接运行结果:
我们在写一个表单用post方法请求
a.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="add/1/12" method="post">
<button type="submit" > 提交</button>
</form>
</body>
</html>
测试:进入a.jsp提交表单
两次对比,我们发现两次测试的URL一致,但方法却不相同!!!
小结:SpringMVC的@RequestMapping注解能够处理HTTP请求的方法,如GET,POST,PUT,DELETE以及PATCH
所有的地址栏请求默认都会是HTTP GET类型的
简便方法:Spring中还有组合注解,比如 @GetMapping("/add/{a}/{b}")代替@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
@GetMapping("/add/{a}/{b}") == @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)**
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
注:一般@GetMapping使用较多