springmvc对restful风格的支持

一、什么是Restful风格?

Restful是一种描述资源资源定位及资源操作的风格,相比于传统的url描述更加简单明了。

特点:

  • 认为每一个操作都是针对一个资源。而固定到资源上的操作可以用 HTTP 协议⾥⾯,四个表示操作⽅式的动词: GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET ⽤来获取资源,POST ⽤来新建资 源,PUT ⽤来更新资源,DELETE ⽤来删除资源。 详细见下面 Restful风格和传统风格对比
  • 结构清晰、符合标准、易于理解、扩展方便。

二、Restful风格和传统风格对比

传统风格:

  • http://localhost:8080/user/queryUserById.action?id=3
  • url中定义了动作(操作),参数具体锁定到操作的是谁

Restful风格:

  • http://localhost:8080/user/3
  • 锁定id为3的那个⽤户记录(资源)
  • 而get请求对应的就是查询操作

三、springmvc中的使用

  1. 创建springmvc工程,引入相关的依赖,配置web.xml和springmv.xml文件,创建对应的controller层,详情见springmvc的基本使用

  2. 前端jsp界面的设计

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    
    </head>
    <body>
    
        <div>
            <h2>SpringMVC对Resrful风格url的支持</h2>
            <fieldset>
                <p>测试用例:SpringMVC对Resrful风格url的支持</p>
    
                <a href="/demo/handle/15">rest_get测试</a>
    
                <form method="post" action="/demo/handle">
                    <input type="text" name="username">
                    <input type="submit" value="提交rest_post请求">
                </form>
    
                <form method="post" action="/demo/handle/15/lisi">
                    <input type="hidden" name="_method" value="put">
                    <input type="submit" value="提交rest_put请求">
                </form>
    
                <form method="post" action="/demo/handle/15">
                    <input type="hidden" name="_method" value="delete">
                    <input type="submit" value="提交rest_delete请求">
                </form>
            </fieldset>
        </div>
    
        <hr/>
    
    
    </body>
    </html>
    
    

    界面样式:

    在这里插入图片描述

  3. 后台Hnadler方法测试,注意,此处只测试是否由前端的请求能传递到后端对应操作的方法上,并不实际操作数据库

    • 当输入中文时,会出现中文乱码,需要在web.xml中添加springmvc支持的filter过滤器

        <!--配置springmvc提供的编码过滤器-->
        <filter>
          <filter-name>encoding</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>
        </filter>
        <filter-mapping>
          <filter-name>encoding</filter-name>
          <url-pattern>/*</url-pattern>
        </filter-mapping>
      
    • 查询 对应 http中get:

      测试代码,注意:@PathVariable 注解获取 RESTful ⻛格的请求 URL中的路径变量。

          @RequestMapping(value = "/handle/{id}", method = {RequestMethod.GET})
          public void handleGet(@PathVariable("id") Integer id){
              System.out.println(id);
          }
      

      测试结果

      在这里插入图片描述

    • 增加 对应 http中post:

      测试代码:

          @RequestMapping(value = "/handle", method = {RequestMethod.POST})
          public void handlePost(String username){
              System.out.println(username);
          }
      

      测试结果

      在这里插入图片描述

    • 对应修改和增加操作在请求方式上仍然是post,但会增加一个隐藏的属性:

      <input type="hidden" name="_method" value="put"/>
      
    • web.xml中配置请求⽅式过滤器(将特定的post请求转换为put和delete请求)

        <!--配置springmvc提供的过滤器,检查请求参数中是否有_method参数,有则按照制定的请求方式转化-->
        <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>
      
    • 修改 对应 http中put:

      User实体类:

      public class User {
      
          private Integer id;
      
          private String name;
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "id=" + id +
                      ", name='" + name + '\'' +
                      '}';
          }
      }
      

      测试代码:

          @RequestMapping(value = "/handle/{id}/{name}", method = {RequestMethod.PUT})
          public void handlePut(User user){
              System.out.println(user);
          }
      

      测试结果

      在这里插入图片描述

    • 增加 对应 http中delete:

      测试代码:

          @RequestMapping(value = "/handle/{id1}", method = {RequestMethod.DELETE})
          public void handleDelete(@PathVariable("id1") Integer id){
              System.out.println(id);
          }
      

      测试结果

      在这里插入图片描述

      注意:

      • 重新debug启动了服务,执行delete操作,会卡在delete对应的方法上,注意到url路径和get请求是一样的,通过请求方法区分。
      • @PathVariable使用url路径中的参数名称,可将参数传递到对应标注的形参上,当请求参数名 和 传入形参参数名不一致时,即可如此使用。

总结

restful风格采用了资源定位的方式,需要操作的方法定义在http的请求中,url中只有要操作的资源,结构清晰,易于理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值