RestFul风格
概念:
Restful就是一个资源定位及资源操作的风格,不是一种标准也不是协议,只是一种风格,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
功能:
资源: 互联网所在事物都可以抽象为资源
资源操作: 使用POST、DELETE、PUT、Get,使用不同方法对资源进行操作,分别对应添加,删除,修改,查询
传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
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
传统操作:
package com.Liang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class NoRestFulController {
@RequestMapping("commit")
public String add(int i , int j, Model model)
{
model.addAttribute("msg","结果为"+(i+j));
return "commit";
}
}
测试结果:
RESTFUL风格的Controller
package com.Liang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class RestFulController {
//映射访问路径
@RequestMapping("commit/{i}/{j}")
public String add(@PathVariable int i ,@PathVariable int j, Model model)
{
model.addAttribute("msg","结果为"+(i+j));
return "commit";
}
}
测试结果
RESTFUL直接输入值即可,客户端不知道参数是啥,保证了安全,并且访问路径简洁。
使用RESTFUL的好处
- 使路径变得更加简洁
- 获得参数更加方便,框架会自动进行类型转换
- 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问的路径是/commit/1/a,则路径与方法不匹配,而不是参数转换失败
@PathVariable 访问资源变量,使用RESTFUL时用到
如以下所示
//映射访问路径
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model model)
RESTFUL不同的请求方式得到不同的界面
使用method属性指定请求类型
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS,
PUT, PATCH, DELETE, TRACE等
注意
@RequestMapping(value = "commit/{i}/{j}",method = RequestMethod.GET)
public String add(@PathVariable int i ,@PathVariable int j, Model model)
{
model.addAttribute("msg","结果1为"+(i+j));
return "commit";
}
//查询资源
@GetMapping("commit/{i}/{j}")
public String add01(@PathVariable int i ,@PathVariable int j, Model model)
{
model.addAttribute("msg","结果2为"+(i+j));
return "commit";
}
这两个运行一样的效果,都为GET方法,访问时报错
出现Ambiguous错误,两个方法一直,不明确使用哪一个
使用不同的HTTP请求实现不同的效果
要实现Method.Post请求,使用POST请求,那么jsp页面也要是POST
1.Controller注解类实现
//映射访问路径
@RequestMapping(value = "commit/{i}/{j}",method = RequestMethod.POST)
public String add(@PathVariable int i ,@PathVariable int j, Model model)
{
model.addAttribute("msg","结果1为"+(i+j));
return "commit";
}
//查询资源
@GetMapping("commit/{i}/{j}")
public String add01(@PathVariable int i ,@PathVariable int j, Model model)
{
model.addAttribute("msg","结果2为"+(i+j));
return "commit";
}
2.jsp页面实现
<%--
Created by IntelliJ IDEA.
User: 梁宣泽
Date: 2022/2/12
Time: 14:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Liang</title>
</head>
<body>
<form action="/commit/1/5" method="post">
${msg}
<input type="submit">
</form>
</body>
</html>
3.控制台查看
可以知道访问路径一样,但是请求方式不同,实现的结果也不同
- 我们使用浏览器地址栏进行访问默认是Get请求,如果我们请求的是Post的HTTP请求,在表单上没有设置POST会报错405:
小结:
@RequestMapping注解本质上能够处理HTTP请求的方法
@RequestMapping(value = “commit/{i}/{j}”,method = RequestMethod.GET)等同于 @GetMapping(“commit/{i}/{j}”)
GET, PUT, POST, DELETE 以及 PATCH是为了标识做Controller做不同的业务逻辑操作,而生成的HTTP请求
注解有如下
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping