Restful风格的URL请求

SpringMVC的URL请求的配置方式有两种

  1. 第一种方式:.do,.action 类似于 /user/addUser.do /user/addUser.action

  2. 第二种配置方式:/* 类似于/user/addUser /user/delUser

注意:第二种方式其实是包含第一种方式,但是当我们的页面包含静态资源文件.js,.image,*.css 的时候 springMVC 会将他们认为是一个 url 请求去匹配,结果 404。

怎么解决?
三种方式:
一:在springmvc.xml配置文件里面配置:

<mvc:resources location="/jsAndCss/" mapping="/jsAndCss/**"></mvc:resources>

二:在springmvc.xml配置文件里面配置:

<mvc:default-servlet-handler/>

三:在web.xml配置:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>         
</servlet-mapping>

ps:实际应用中第一种方式比较常见,因为后两种方式使用的是容器默认的 servlet,不同的容器默认的 servlet 不同,实际项目部署时多用 WebLogic,WebSphere。Tomcat 多用于开发。为了防止部署的时候出现差错,所以一般用第一种方式。

Restful是什么

中文名称:表现层状态转化。用 URL 表示要操作的资源,用不同的 HTTP 请求(GET,POST,PUT,DELETE)描述对资源的操作,通过 HTTP 的状态码来判断此次对资源操作的结果,这就是 Restful风格。

其实 Restful 风格是对请求的一次解耦,提高了 url 的重用性。

  • 状态转化:客户端通过 http 协议访问服务端资源,通过 http 协议里面定义好的四个动词:GET POST PUT DELETE 来讲资源进行状态转化。

    1. GET 用来获取资源
    2. POST 用来新增资源
    3. PUT 用来更新资源
    4. DELETE 用来删除资源
  • put和delete虽然是http协议的规范 ,但是遗憾的是,所有的无论是html4还是h5都不支持,所以我们在实际开开发过程当中要模拟这两种状态。

  • 普通的URL开发方式 :http://qujianlei.com/getUserList addUser deleteUser updateUser

  • Restful风格的URL:

    1. http://qujianlei.com/users/ method = “get” 获取用户列表
    2. http://qujianlei.com/user method = “post” 更新用户
    3. http://qujianlei.com/user method=”delete” 删除用户
    4. http://qujianlei.com/user method = “put” 新增用户

Restful怎么实现

SpringMVC 提供了对 restful 风格很友好的支持。

  • 支持无后缀的 uri 匹配,是一种很优雅的 restful 风格的 URI。
  • 对于 html 不支持的 delete 和 put 两种提交方式,提供了一个过滤器进行转化:设置一个 _method = delete / put 的元素,通过 springmvc 提供的过滤器, 能够将他转化成 http 协议的 delete 和 put 提交方式 ,可以在 springmvc 的 @RequestMapping 注解里面获取。
    像下面这样来模拟 put 和 delete 两种方式:

    url :'<%=path%>/user/'+userId+'?_method=delete'
    url :'<%=path%>/user/'+userId+'?_method=put'

    a:配置 HiddenHttpMethodFilter 过滤器

    <!-- 配置restful风格url请求的hidden过滤器 -->
    <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>

    b:在 @RequesetMapping 注解用指定 method 的方式来匹配 url

    /**
     * restful风格的用户列表
     * @return
     */
    @RequestMapping(value="/users",method = RequestMethod.GET)
        public @ResponseBody List<User> getUserListRestful(){
        List<User> userList = userService.getUserList(new User());
        return userList;
    }

    c:对于 http://qujianlei.com/user/1 带参数的这种方式,需要用 @PathVariable 注解来接收

    /**
     * restful风格的删除
     * @param userId
     * @return
     */
    @RequestMapping(value="/user/{userId}" ,method = RequestMethod.DELETE)
    public @ResponseBody Map<String,Object> userDelRestful(@PathVariable("userId") Long userId){
        Map<String,Object> resultMap = new HashMap<String,Object>();
        if(userId!=null){
            if(userService.delUser(userId)){
                resultMap.put("result", "删除用户成功") ; 
            }else{
                resultMap.put("result", "删除用户失败");  
            }
        }        
        return resultMap;
    }

Restful有什么意义

网络上的所有的信息体都看作一种资源,对网络资源的某种操作,都是通过 method 来确定的。

对于现在的数据或者资源提供方,对外透露的接口一般是 restful 风格的,有利于不同系统之间的资源共享,而且只需要遵守规范不需要做另外的配置就能达到资源共享。

这是豆瓣提供的一个 restful 风格的 URL :https://api.douban.com/v2/book/2129650

获取到的 json 格式的数据如下:

{"rating":{"max":10,"numRaters":16,"average":"7.4","min":0},"subtitle":"","author":["廖雪峰"],"pubdate":"2007","tags":[{"count":21,"name":"spring","title":"spring"},{"count":13,"name":"Java","title":"Java"},{"count":6,"name":"javaee","title":"javaee"},{"count":5,"name":"j2ee","title":"j2ee"},{"count":4,"name":"计算机","title":"计算机"},{"count":4,"name":"编程","title":"编程"},{"count":3,"name":"藏书","title":"藏书"},{"count":3,"name":"POJO","title":"POJO"}],"origin_title":"","image":"https://img3.doubanio.com\/view\/subject\/m\/public\/s2552283.jpg","binding":"平装","translator":[],"catalog":"","pages":"509","images":{"small":"https://img3.doubanio.com\/view\/subject\/s\/public\/s2552283.jpg","large":"https://img3.doubanio.com\/view\/subject\/l\/public\/s2552283.jpg","medium":"https://img3.doubanio.com\/view\/subject\/m\/public\/s2552283.jpg"},"alt":"https:\/\/book.douban.com\/subject\/2129650\/","id":"2129650","publisher":"电子工业出版社","isbn10":"7121042622","isbn13":"9787121042621","title":"Spring 2.0核心技术与最佳实践","url":"https:\/\/api.douban.com\/v2\/book\/2129650","alt_title":"","author_intro":"","summary":"本书注重实践而又深入理论,由浅入深且详细介绍了Spring 2.0框架的几乎全部的内容,并重点突出2.0版本的新特性。本书将为读者展示如何应用Spring 2.0框架创建灵活高效的JavaEE应用,并提供了一个真正可直接部署的完整的Web应用程序——Live在线书店(http:\/\/www.livebookstore.net)。\n在介绍Spring框架的同时,本书还介绍了与Spring相关的大量第三方框架,涉及领域全面,实用性强。本书另一大特色是实用性强,易于上手,以实际项目为出发点,介绍项目开发中应遵循的最佳开发模式。\n本书还介绍了大量实践性极强的例子,并给出了完整的配置步骤,几乎覆盖了Spring 2.0版本的新特性。\n本书适合有一定Java基础的读者,对JavaEE开发人员特别有帮助。本书既可以作为Spring 2.0的学习指南,也可以作为实际项目开发的参考手册。","price":"59.8"}

我们在后台获取到了这些数据之后,再通过一些 json 解析包,像:fastjson,gson…就可以把获取到的数据转换成 java 对象,然后再进行数据库的一些增删改查操作。

restful 是用来外提供接口的,主要用于在不同的系统之间进行数据的交互。

ps:其实在做内部系统的时候并不会使用 restful 风格的 url 请求,只用普通的 @RequestMapping 来匹配请求就行了。

猜你喜欢

转载自blog.csdn.net/a909301740/article/details/80587580