SpringMVC(2)-Rest请求风格

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风格完成增删改查

  1. 配置HiddenHttpMethodFilter,位置在web.xml
    1. <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>
  1. 配置springDispatcherServlet-servlet.xml
    1. mvc:annotation-driven 表示支持 SpringMVC的高级功能,比如JSR303校验、映射动态请求
    2. mvc:default-servlet-handler 表示将SpringMVC不能处理的请求交给Tomcat,比如请求css、js
<mvc:annotation-driven></mvc:annotation-driven>  
<mvc:default-servlet-handler/>

GET

  1. 前端
<a href="user/book/100">点击查询书籍</a>
  1. 后端
@GetMapping(value = "/book/{id}")  
public String getBook(@PathVariable("id") String id) {  
    System.out.println("查询书籍 id=" + id );  
    return "success";  
}

POST

  1. 前端
<form action="user/book" method="post">  
    name:<input name="bookName" type="text"><br>  
    <input type="submit" value="添加书籍">  
</form>
  1. 后端
@PostMapping(value = "/book")  
public String addBook(String bookName) {  
    System.out.println("添加书籍 bookName== " + bookName);  
    return "success";  
}

PUT

  1. 前端
<form action="user/book/100" method="post">  
    <input type="hidden" name="_method" value="PUT">  
    <input type="submit" value="修改书籍~">  
</form>
  1. 后端
@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

  1. 前端
<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 页面  
}

补充

  1. 什么是JSR303校验
    JSR 303,被称为Bean Validation API,是一种用于Java环境的标准数据验证技术。比如注册一个新账号,系统需要确保你输入的数据是有效的,比如电子邮件地址格式正确,密码强度足够,年龄在允许的范围内等。JSR 303正是为了解决这种需求而设计的。
    这个标准允许开发者通过一套简单的注解,来声明验证规则,这些规则直接加在Java类的字段上。比如,我们可以用@NotNull注解来表示一个字段不可以为空,用@Size(min=2, max=30)来限定字符串的长度必须在2到30个字符之间。这样,当数据通过这些带有验证规则的字段时,系统会自动检查这些条件是否满足,如果不满足,就会抛出一个异常或返回错误信息。
    通过JSR 303,开发者可以在代码层面保证数据的正确性和合理性,减少了程序运行时的错误和数据处理的复杂性。这就像是给数据装上了一个自动检查的过滤网,确保所有通过的数据都是干净、有效、符合规定的,从而让整个软件系统更加稳定可靠。
posted @ 2024-05-02 16:13  marigo  阅读(7)  评论(0编辑  收藏  举报