zoukankan      html  css  js  c++  java
  • SpringMVC对restful请求的支持

    [1] restful格式请求的介绍

    问题:

    目前我们浏览器发起请求给服务器的时候,一般我们常用的请求方式有两个,get post方式。不管get还是post方式,请求数据的格式都是键值对格式,get 方式请求数据是在请求地址上以问号隔开的形式,拼接在请求地址后,post请求 呢是有专门的请求实体的,例如:

    get方式请求:

    localhost:8080/project/aa?uname=zhangsan&age=18

    post方式请求:

    地址:localhost:8080/project/aa

    请求数据:

    uname=zhangsan

    age=18

    要求我们后台获取请求数据的代码,必须按照指定的键名来获取请求数据。键名

    就是请求数据的键名。这样造成,一旦请求数据的键名发生变更,造成后台的逻辑

    代码也需要进行变更。前台的请求数据的键名和后台的逻辑代码之间的耦合性过 ,造成前台和后台的开发过程中相互依赖性过高。怎么办?

    解决:

    让前台和后台代码之间进行解耦。也就说不再让请求请求数据的键名造成前后台

    代码之间的依赖。前台请求数据的键名发生变更,不影响后台逻辑代码的正常执行

    实现:

    请求数据不再以键值对的形式发送给后台使用。直接发送数据本身给后台即可。

    既然请求数据不再使用键值对,请求数据必须按照指定的格式来进行发送。使用

    restful格式。

    restful格式:

    传统的get方式请求格式:

    localhost:8080/project/aa?uname=zhangsan&age18

    restful请求格式:

    localhost:8080/project/aa/zhangsan/18

    注意:

    restful格式要求请求数据作为请求地址的一部分发送给后台使用。

    [2] restful格式请求后台获取请求数据

    问题:

    按照以前键值对格式的请求数据,我们在后台直接使用req.getParameter方法

    根据键名获取请求数据即可。但是在restful请求格式中,请求数据是作为请求

    地址的一部分来进行发送的,那么在后台我们如何获取restful格式的请求数据呢?

    解决:

    从服务器的角度,服务器在接收到请求后,会根据请求地址调用对应的Servlet

    来处理请求。

    ①传统请求格式的流程:

    localhost:8080/project/aa?uname=zhangsan&age=18

    服务器在接收到此请求后,会调用一个url-pattern为aa的Servlet来处理 请求

      ②restful格式请求的流程:

    localhost:8080/project/aa/zhangsan/18
    服务器在接收到此请求后,会调用一个url-pattern为aa/zhangsan/18的 Servlet来处理请求。

    ③通过原有方式和restful格式的请求流程处理的比较,在后台处理请求的Servlet 就不能针对的声明某个url-pattern值为确定值的Servlet来处理请求。创建一个 公共Servlet来处理请求,而公共的Servlet的url-pattern的值为”/”即可。除 jsp请求以外的所有的请求都会被该Servlet拦截处理,无需关心请求数据是单独 携带还是在请求地址中携带了。

    ④封装的公共的Servlet既可以处理键值对类型的请求,又可以处理restful格式 的请求。

    实现:

    必须在后台封装一个公共Servlet,该Servlet可以处理键值对请求,和restful

    请求,并且能够按照执行的格式获取restful中的请求数据。

    [3] SpringMVC对restful格式的支持

    解释:

    DispactherServlet拦截除jsp请求以外的所有请求,浏览器发起了一个

    restful格式的请求,会被DispatcherServlet拦截处理。而DispatcherServlet

    根据请求调用对应的单元方法处理请求。比如:

    locahost:8080/project/aa/zhangsan/18

    DispatcherServlet会调用一个@RequestMapping的值为”aa/zhangsan/18”

    的单元方法来处理此次请求。但是restful格式请求的请求数据每次都不同,也就

    说每次请求地址都不相同,我们无法声明对应的单元方法来处理请求。所以 SpringMVC在单员方法中使用指定的格式来进行模糊匹配,具体实现参照示例代 码。

    示例代码:

    /***
     * SpringMVC处理restful格式请求
     *
     * 1.
     *      在 @RequestMapping注解中可以使用{字母}来声明单元方法的拦截范围
     *      比如:
     *       @RequestMapping("aa/{uname}/{age}")
     *      表示请求地址要请求的单元方法以aa开头,后面为两位任意。
     * 2.
     *      我们可以在单元方法的形参声明上使用注解@PathVariable
     *      来告诉DispatcherServlet将请求地址中的数据截取后作为
     *      实参传递给单元方法使用,默认按照地址占位中的参数名和
     *      形参名一致的规则赋值,如果不一致可以在@PathVariable中
     *      指明赋值@PathVariable("un")
     *
     * 3.
     *  注意:
     *      说白了SpringMVC的restful格式的支持就是单元方法模糊拦截+注解声明来实现。
     *
     */
    @RequestMapping("aa/{un}/{age}")
    public String demoResful(@PathVariable("un")  String uname,@PathVariable Integer age){
        //处理请求
        System.out.println("MyController.demoResful:SpringMVC处理restful格式请求:"+uname+":"+age);
        //响应结果
        return "aa";
    }
    

      

  • 相关阅读:
    传感器系列之4.4超声测距传感器
    传感器系列之4.3流量传感器
    传感器系列之4.2气压传感器
    传感器系列之4.12GPS定位传感器
    传感器系列之4.1振动传感实验
    传感器系列之3.4继电器
    传感器系列之3.2直流电机
    Spring切面编程步骤
    SpringMVC中的java.lang.ClassNotFoundException: org.aspectj.weaver.BCException 调试过程记录
    SpringMVC中使用@Value给非String类型注入值
  • 原文地址:https://www.cnblogs.com/vincentmax/p/14309043.html
Copyright © 2011-2022 走看看