首页 > 其他分享 >SpringMVC(2)-Rest请求风格

SpringMVC(2)-Rest请求风格

时间:2024-05-02 16:22:36浏览次数:25  
标签:HiddenHttpMethodFilter return String success SpringMVC Rest id 请求

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,开发者可以在代码层面保证数据的正确性和合理性,减少了程序运行时的错误和数据处理的复杂性。这就像是给数据装上了一个自动检查的过滤网,确保所有通过的数据都是干净、有效、符合规定的,从而让整个软件系统更加稳定可靠。

标签:HiddenHttpMethodFilter,return,String,success,SpringMVC,Rest,id,请求
From: https://www.cnblogs.com/marigo/p/18170292

相关文章

  • RESTful风格接口设计
    我们平常开发一般只使用GET、POST方法。而对于HTTP给出的PUT、DELETE等其他方法都没使用。以RESTful风格设计接口就能全部用上这些方法。按照RESTful理查德森成熟度模型改造接口这个模型跟数据库范式等级相似,都是一层一层满足。我们的mvc接口不好说是哪一级,一般都是每个操作一个......
  • .Net 8.0 下的新RPC,IceRPC之"请求"生命线意义非凡
    作者引言很高兴啊,我们来到了IceRPC之"请求"生命线意义非凡,号称“死亡时间”的追命线,颤抖吧!"请求"生命线之意义非凡本文将深入探讨将截止时间纳入RPCs的重要性,以开发更强大的分布式应用程序。概述RPC(远程过程调用)系统中发送请求,通常会带来不确定性:无法保证,何时会收到回......
  • jsrpc获取瑞数请求后缀和cookie
    jsrpc获取瑞数请求后缀和cookie记得加入我们的学习群:961566389点击链接加入群聊:https://h5.qun.qq.com/s/62P0xwrCNO1.分析xhr每次请求都能看到会携带一个请求后缀uB04BPdr:以及每次请求都会更换cookie下的mEsoE3ffu2LGP:这两个就是需要逆向的参数。2.调试因为使用jsrpc......
  • @RestController
    @RestController是一个组合注解,它包含了@Controller和@ResponseBody两个注解的功能。用@RestController标记的类表示这是一个RESTful风格的控制器,它可以处理HTTP请求并返回JSON格式的响应。@RestController注解在处理请求时,会自动将方法的返回值转换为JSON格式的响应体,并返回给......
  • HEAD请求方法引起方法未定义的错误
    今天遇到一个奇怪的问题,我的代码里面明明没有任何地方发出HEAD请求,但是log却有一个请求HEAD方法失败的记录,因为我服务端没有定义HEAD方法。后面查看apache的log知道是用户从Excel点击网址的超链接的时候,Excel发出了一个本应该是GET请求的HEAD请求,应该是Excel的某种检测超链接是否......
  • fiddler 修改请求接口的返回结果
    修改返回结果Response结果有两种方式,一种把结果写在文件中,一种直接修改接口返回的结果第一种:把response结果放在txt文件中让其访问txt的内容response.txt文件中内容如下:{"code":0,"msg":"查询成功!","count":0,"data":[]}操作步骤:1、点击需要修改response的url2、......
  • [转帖]WEB请求处理三:Servlet容器请求处理
    https://www.jianshu.com/p/571c474279af 0系列目录#WEB请求处理WEB请求处理一:浏览器请求发起处理WEB请求处理二:Nginx请求反向代理本篇文章将给大家讲述Servlet容器中请求处理的过程,在给本篇文章起标题时,一直在“应用服务器”与“Servlet容器”这两者之间......
  • REST API
    REST,全称RepresentationalStateTransfer(资源)表现层状态转移。用URL定位资源,用HTTP描述操作。REST的六项原则客户端-服务器架构客户端(请求数据)和服务器(提供数据)独立运行,增强了可扩展性和可移植性。无状态客户端向服务器发出的每个请求都必须包含理解和完成请......
  • curl多请求脚本
    #!/bin/bash#定义请求URL和数据url="https://api-adservices.apple.com/api/v1"data=""output_file="requests_log.txt"#清空或创建输出文件>"$output_file"#函数用于发送POST请求并记录日志send_post_request(){localrequest_number=$1local......
  • Financial - 银行间债券市场,询价(意向报价、对话报价)、请求报价、点击成交报价
    总结     对话报价    请求报价   点击成交   ......