REST:Representational State Transfer,(资源)表现层状态转化。REST是目前流行的请求方式。
在HTTP协议中,有四个基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。REST就是通过get/post/put/delete说明crud的类型。
REST的核心过滤器
浏览器form表单只支持GET和POST请求,Spring增添了一个过滤器HiddenHttpMethodFilter
,可以将这些请求转换成标准的http方法,从而可以支持get/post/put/delete请求。具体点说,HiddenHttpMethodFilter
只能对Post方法转换成PUT和DELETE方法。
案例
需求:按照REST风格完成增删改查
- 配置
HiddenHttpMethodFilter
,位置在web.xml
<url-pattern>/*</url-pattern>
表示只要是有请求,我们都要通过这个过滤器
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 配置
springDispatcherServlet-servlet.xml
mvc:annotation-driven
表示支持 SpringMVC的高级功能,比如JSR303校验、映射动态请求mvc:default-servlet-handler
表示将SpringMVC不能处理的请求交给Tomcat,比如请求css、js
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler/>
GET
- 前端
<a href="user/book/100">点击查询书籍</a>
- 后端
@GetMapping(value = "/book/{id}")
public String getBook(@PathVariable("id") String id) {
System.out.println("查询书籍 id=" + id );
return "success";
}
POST
- 前端
<form action="user/book" method="post">
name:<input name="bookName" type="text"><br>
<input type="submit" value="添加书籍">
</form>
- 后端
@PostMapping(value = "/book")
public String addBook(String bookName) {
System.out.println("添加书籍 bookName== " + bookName);
return "success";
}
PUT
- 前端
<form action="user/book/100" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="修改书籍~">
</form>
- 后端
@PutMapping(value = "/book/{id}")
public String updateBook(@PathVariable("id") String id) {
System.out.println("修改书籍 id=" + id);
return "redirect:/user/success";
}
@RequestMapping(value = "/success")
public String successGenecal() {
return "success"; //由该方法 转发到 success.jsp 页面
}
DELETE
- 前端
<a href="user/book/100" id="deleteBook">删除指定 id 的书</a>
默认情况下,<a href="user/book/100" id="deleteBook">删除指定 id 的书</a>
是get请求。
怎么将get请求自动转换成SpringMVC可以识别的delete请求?HiddenHttpMethodFilter机制。
可是只有POST请求才能通过HiddenHttpMethodFilter机制转换成DELETE和PUT请求,需要用到jquery在前端进行处理:
<script type="text/javascript" src="script/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function () { // 页面加载后就执行
// 1. 给删除按钮添加点击事件
$("#deleteBook").click(function () {
alert("ok");
var href = this.href;
$("#hiddenForm").attr("action", href); // 超链接的地址给表单
$(":hidden").val("DELETE"); // 设置隐藏域的值
$("#hiddenForm").submit();//这里就是提交删除请求了
//这里必须返回 false,否则会提交两次
return false;
});
})
</script>
<a href="user/book/100" id="deleteBook">删除指定 id 的书</a>
<form action="" method="POST" id="hiddenForm">
<input type="hidden" name="_method"/>
</form>
相当于点击删除链接(get)请求,转成通过表单(post请求)发送出去
2. 后端
@DeleteMapping(value = "/book/{id}")
public String delBook(@PathVariable("id") String id) {
System.out.println("删除书籍 id= " + id);
//return "success"; [如果这样返回会报错 JSPs only permit GET POST or HEAD]
return "redirect:/user/success"; //重定向到一个没有指定 method 的 Handler 方法
}
@RequestMapping(value = "/success")
public String successGenecal() {
return "success"; //由该方法 转发到 success.jsp 页面
}
补充
- 什么是JSR303校验
JSR 303,被称为Bean Validation API,是一种用于Java环境的标准数据验证技术。比如注册一个新账号,系统需要确保你输入的数据是有效的,比如电子邮件地址格式正确,密码强度足够,年龄在允许的范围内等。JSR 303正是为了解决这种需求而设计的。
这个标准允许开发者通过一套简单的注解,来声明验证规则,这些规则直接加在Java类的字段上。比如,我们可以用@NotNull
注解来表示一个字段不可以为空,用@Size(min=2, max=30)
来限定字符串的长度必须在2到30个字符之间。这样,当数据通过这些带有验证规则的字段时,系统会自动检查这些条件是否满足,如果不满足,就会抛出一个异常或返回错误信息。
通过JSR 303,开发者可以在代码层面保证数据的正确性和合理性,减少了程序运行时的错误和数据处理的复杂性。这就像是给数据装上了一个自动检查的过滤网,确保所有通过的数据都是干净、有效、符合规定的,从而让整个软件系统更加稳定可靠。