REST 表述性状态传递 (Representational State Transfer 简称 REST)
representational [ˌreprɪzenˈteɪʃənl 具象派的; 代表性的
REST 客户端映射到服务器资源的一种架构设计。
restful 一种优雅的URL风格
万维网 http协议
命名混乱
例如:
user/getuser.do?id=1
user.do?action=getUser&id=1
user.do?action=a&id=xx
user/chaxunyonghu?id=1
user/xxx_cxyh?id=1
..........
是Roy Fielding 博士2000年 博士论文提出的一种软件架构风格。降低开发的复杂性 提供系统的可伸缩性
一种相较与之前URL所产生的一种更优雅的URL风格。
URL CURD
之前 查询用户 user.do?action=getUser&id=xxx GET
增加用户 user_add.do POST
修改用户 edit_user.do POST
删除用户 deluser.do?id=xxx GET/POST
GET POST PUT DELETE
之前URL用动词 现在用名词
面向资源
现在 查询用户 /xxx/user/1 GET
多个用户 /xxx/users GET 新增用户 xxx/user POST 修改用户 xxx/user/1 PUT 删除用户 xxx/user/1 DELETE
实际开发中 尽量向REST风格靠拢 尽量一个URL映射服务器一个资源
SpringMVC 增删改查 post delete put get
1、控制器
@Controller
@RequestMapping("/rest")
public class RestController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") Integer id){
System.out.println("查询用户ID是"+id);
return "/index.jsp";
}
@PostMapping("/user")
public String addUser(User user){
System.out.println("新增用户"+user);
return "/index.jsp";
}
@PutMapping("/user/{id}")
public String update(User user,Integer id){
System.out.println("修改用户"+user);
return "redirect:/index.jsp";
}
@DeleteMapping("/user/{id}")
public String delete(@PathVariable("id") Integer id){
System.out.println("删除用户"+id);
return "redirect:/index.jsp";
}
2、form表单 因传统html不支持put delete 改为post
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2023/2/2
Time: 9:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% //这个地方需要tomcat提供的依赖
request.setAttribute("basepath",request.getContextPath()); %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${basepath}/rest/user/1" method="get">
<input type="submit" value="查询">
</form>
<form action="${basepath}/rest/user" method="post">
<input type="text" name="id" value="666">
<input type="text" name="username" value="李四">
<input type="submit" value="添加">
</form>
<form action="${basepath}/rest/user/id" method="post">
<input type="hidden" name="_method" value="put">
<input type="text" name="id" value="666">
<input type="text" name="username" value="张三">
<input type="submit" value="修改">
</form>
<form action="${basepath}/rest/user/1" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="删除">
</form>
</body>
</html>
3、配置过滤器 实现put delete请求。
过滤器按顺序执行 什么时候都要把编码处理的放在前面
<!-- 配置编码过滤器 写到其他过滤器前面-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--同时开启请求和响应的比那吗规则-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!--只过滤request1的servlet-->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<servlet-name>dps</servlet-name>
</filter-mapping>
<!--处理HTML不支持rest中put和delete方法-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>dps</servlet-name>
</filter-mapping>
4、分析 HiddenHttpMethodFilter
private String methodParam = "_method";
if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
if (ALLOWED_METHODS.contains(method)) {
requestToUse = new HttpMethodRequestWrapper(request, method);
}
}
}
HTTP Status 405 – Method Not Allowed
JSPs only permit GET POST or HEAD处理方式
1、Tomcat7 以上的版本对request.method支持更加严格 支支持 GET POST Header,用Tomcat7版本
2、不用转发 用重定向
3、将JSP的page指定 isErrorPage=true 不推荐这么用
4、 自己写过滤器 将request.method 改回post