SpringMVC:RESTFul编程风格

1. 简介

RESTful 的英文全称是 Representational State Transfer(表述性状态转移)。简称REST。表述性(Representational)是:URI + 请求方式。

状态(State)是:服务器端的数据。

转移(Transfer)是:变化。

表述性状态转移是指:通过 URI + 请求方式 来控制服务器端数据的变化。 

RESTFul是`WEB服务接口`的一种设计风格。

RESTFul定义了一组约束条件和规范,可以让`WEB服务接口`更加简洁、易于理解、易于扩展、安全可靠。

RESTFul对一个`WEB服务接口`都规定了哪些东西?

* 对请求的URL格式有约束和规范
* 对HTTP的请求方式有约束和规范
* 对请求和响应的数据格式有约束和规范
* 对HTTP状态码有约束和规范
* 等 ......

REST对请求方式的约束是这样的:

* 查询必须发送GET请求
* 新增必须发送POST请求
* 修改必须发送PUT请求
* 删除必须发送DELETE请求

REST对URL的约束是这样的:

* 传统的URL:get请求,/springmvc/getUserById?id=1
  
* REST风格的URL:get请求,/springmvc/user/1
  
* 传统的URL:get请求,/springmvc/deleteUserById?id=1
  
* REST风格的URL:delete请求, /springmvc/user/1

 2. RESTFul风格与传统方式对比

传统的 URL 与 RESTful URL 的区别是传统的 URL 是基于方法名进行资源访问和操作,而 RESTful URL 是基于资源的结构和状态进行操作的。下图是,展示两者之间的具体区别: 

从上图中我们可以看出,传统的URL是基于动作的,而 RESTful URL 是基于资源和状态的,因此 RESTful URL 更加清晰和易于理解,这也是 REST 架构风格被广泛使用的主要原因之一。 

3. RESTFul方式演示

查询需用get请求方式

根据id查询 

index.html页

<!--查询单个用户信息-->
    <a th:href="@{/user/1}">查询id为1的用户信息</a> <br>

Controller层

    //映射路径
    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    //获取URL中的id值,赋值给变量id
    public String queryBeanUser(@PathVariable("id") String id) {
        System.out.println("id为" + id +  "的用户信息");
        return "ok";
    }
public class User {
    private String username;
    private String password;

查询所有

 index.html

<!--查询所有用户信息-->
    <a th:href="@{/user}">查询所有用户信息</a> <br>

controller层 

@RequestMapping(value = "/user", method = RequestMethod.GET)
    public String queryUser() {
        System.out.println("查询所有用户信息");
        return "ok";
    }

增加数据

增加数据用post请求方式

 idnex.html

<!--保存用户信息-->
    <form th:action="@{/user}" method="post">
        账号:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"> <br>
        <input type="submit" value="保存">
    </form> <br>

controller

@RequestMapping(value = "/user", method = RequestMethod.POST)
    public String saveUser(User user) {
        System.out.println("正确保存用户信息" + user);
        return "ok";
    }

修改数据

修改用put请求方式,由于超链接和表单提交方式限定,需要在web.xml文件中增加一段配置

以下这段代码所有请求都会走这段过滤器,进而框架底层在进行请求方式判断映射到对应的控制层 

    <!--顺序执行,字符编码过滤器在前面就先执行上面的过滤器-->
    <!--由于过滤器优先级问题,一定要在后面配置,在前面配置就先执行该过滤器在执行编码过滤器,那么无法解决乱码问题-->
    <!--添加请求过滤器-->
    <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>

idnex.html 

    <!--修改用户信息-->
    <!--因为form表单只能发送get或者post请求,所以要发送其他需要添加隐藏域-->
    <form th:action="@{/user}" method="post">
        <!--
        发送PUT请求细节
            发送PUT请求大前提必须为POST请求
            type类型为隐藏
            name的值必须为_method
            如果发送put请求:value的值必须为put或者PUT
            如果发送delete请求:value值必须为delete或者DELETE
        -->
        <!--添加隐藏域,用于指定提交方式为put-->
        <input type="hidden" name="_method" value="put" >

        账号:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"> <br>
        <input type="submit" value="修改">
    </form>

controller

@RequestMapping(value = "/user", method = RequestMethod.PUT)
    public String modifyUser(User user) {
        System.out.println("正在修改用户信息" + user);
        return "ok";
    }

删除数据

删除用到delete请求方式

index.html 

    <!--删除用户信息-->
    <!--如果以超链接的形式进行删除,得先把超链接的get请求方式转换-->
    <a th:href="@{/user/101}" onclick="del(event)">删除用户信息</a>
    <form id="deleteUser" method="post">
        <input type="hidden" name="_method" value="delete">
    </form>
    <script>
        function del(event) {
            let user = document.getElementById('deleteUser')
            //获取请求路径
            let href = event.target.href
            //请求路径赋值给表单进行提交
            user.action = href
            user.submit()
            //阻止超链接行为
            event.preventDefault()
        }
    </script>

 controller层

    @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
    public String deleteUser(@PathVariable("id") Integer id) {
        System.out.println("正在删除用户id为" + id);
        return "ok";
    }

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

食懵你啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值