使用Spring MVC构建REST风格WEB应用

时间:2023-01-18 14:05:58

转自:http://fancy888.iteye.com/blog/1629120

对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理数据的CRUD操作。采用一种什么样的框架结构,能够使得处理数据的操作变得简单且易理解,这是大部分开发者尤其是架构设计者一直以来思考的一个问题。

REST(Representational State Transfer)是一种编程风格,特别是针对网络应用的设计和开发,采用REST可以显著降低开发的复杂性,提高系统的可伸缩性。

REST是一种独特的编程风格,与MVC强调的角色分层概念不同,REST强调使用统一的规则来规范对资源的操作,两者互为补充,相符相成,使用 MVC架构搭配REST编程风格构建基于网络的MIS系统将在不远的为未成为主流。本文着重介绍REST编程风格的核心规则,并且结合Spring MVC描述REST在实际应用中的代码形态。

使用REST风格开发WEB应用程序强调以下几点规则:

  1. 网络上的所有事物都被抽象为资源(resource);
  2. 每个资源对应一个唯一的资源标识(resource identifier);
  3. 通过通用的连接器接口(generic connector interface)对资源进行操作;
  4. 对资源的各种操作不会改变资源标识;
  5. 所有的操作都是无状态的(stateless)。

首先,在笔者看来,REST定义中的资源即应用程序所处理的数据。以订单管理系统为例,订单信息就是数据,同样客户信息和产品信息也是数据,在REST看来这些数据都是资源。

REST强调资源必须有具有唯一名称和ID,名称用来区分不同资源,ID用来定位同类资源中唯一的一条数据。在REST中,这些规则都是通过URI 来描述的。还是以上面的订单系统为例,我们将订单信息名称设定为order,客户信息为customer,货物信息为product,那么就存在几下的几 种URI设计:

    <!--标识所有的订单信息-->
http://www.coolfancy.com/rest/order <!--标识所有的客户信息-->
http://www.coolfancy.com/rest/customer <!--标识ID为1的货物信息-->
http://www.coolfancy.com/rest/product/1

我们可以看出REST风格URI设计的特点:http://host/context/资源名称/[资源ID]。其中资源名称是必选项,资源ID可省略,省略资源ID用来标识一类资源的所有数据。

有了资源和用来标识资源的URI后,REST用连接器来标识对资源的操作。在这里,对资源的操作分为查询/获取、创建、删除、修改四种。在网络编程环境下,REST用HTTP协议作为连接器,用HTTP Method(请求方法)标识操作类型:

  • HTTP GET:查询和获取资源;
  • HTTP POST:创建资源;
  • HTTP PUT: 修改资源;
  • HTTP DELETE: 删除资源。

在完成资源和连接器两个核心概念的定义后,我们已经可以大体勾勒出REST风格编程的基本思路:

  1. 抽象和定义系统中的资源;
  2. 使用REST风格的URI将请求与资源进行绑定;
  3. 使用HTTP请求对资源进行操作;

还用上面提到的订单系统为例,请看下面的例子:

    <!--查询类别为服装的货物信息-->
GET /rest/product HTTP/1.1
Host: www.coolfancy.com productType 服装
    <!--查询ID为1的订单信息-->
GET /rest/order/1 HTTP/1.1
Host: www.coolfancy.com
    <!--删除ID为1的货物信息-->
DELET /rest/product/1 HTTP/1.1
Host: www.coolfancy.com
    <!--创建一条订单信息-->
POST /rest/order HTTP/1.1
Host: www.coolfancy.com field1 value1
field2 value2
... ...

简单的说,URI加上HTTP METHOD构成了REST处理数据的核心规则:URI确定了操作的对象,HTTP METHOD则确定了操作的方式。

与传统处理数据的方式不同,如果不使用REST,那么操作的对象和操作方式将混合在URL设计中,正如首次提出REST概念的Roy T. Fielding博士所说的:“REST允许我们通过url设计系统”。事实上Roy也是Web协议的主要设计者,正是在他的参与下完成了HTTP1.1 规范的制定。

站在另一个角度,REST强调资源(数据)的概念,一切操作围绕特定资源展开,离开了资源,REST就失去了存在的意义。在这一点上,REST所倡导的思想与时下流行的Ajax的编程风格有着异曲同工之妙。

Ajax强调数据与展现分离,后台应用程序致力于生产数据,前台使用脚本进行数据的展示。对于数据的组织与传输Ajax并没有内置的支持。而 REST强调通过URI将请求与资源进行绑定,如果将REST与Ajax技术进行结合,则可以形成有效的互补,我们不妨将上面提到的编程思路进行扩展,仍 然以获取ID为1的订单信息为例:

  1. Ajax发起请求:http://www.coolfancy.com/rest/order/1;
  2. 通过REST风格的URI设计将请求与后台实体进行绑定;
  3. 后台实体返回包含产品信息的JSON/XML数据;
  4. 前台使用脚本进行数据的展示。

我们用Spring MVC来实现上面描述的过程,作为主流的MVC产品,Spring MVC天然支持REST编程风格,所以使用Spring MVC来搭建REST风格的应用程序将变得异常简单。

Spring MVC使用特殊的标注对Handler对象进行修饰,使得Handler能够处理REST风格的请求,我们来看几个例子:

/**
* 按ID值获取订单信息
*
* @param id
* @return
*/
@ResponseBody
@RequestMapping(value = "/order/${id}", method = RequestMethod.GET)
public OrderEntity getOrder(@PathVariable int id) {
return orderManager.get(id);
} /**
* 按类型查询货物信息
*
* @param id
* @return
*/
@ResponseBody
@RequestMapping(value = "/product", method = RequestMethod.GET)
public List<ProductEntity> getProductByType(String type) {
return productManager.queryByType(type);
} /**
* 创建订单信息
*
* @param id
* @return
*/
@RequestMapping(value = "/order", method = RequestMethod.POST)
public void createOrder(OrderEntity entity) {
orderManager.create(entity);
} /**
* 修改订单信息
*
* @param id
* @return
*/
@RequestMapping(value = "/order/${id}", method = RequestMethod.PUT)
public OrderEntity updateOrder(@PathVariable int id, OrderEntity entity) {
return orderManager.update(entity);
} /**
* 删除指定ID值的订单信息
*
* @param id
* @return
*/
@RequestMapping(value = "/order/${id}", method = RequestMethod.DELETE)
public void deleteOrder(@PathVariable int id) {
orderManager.delete(id);
}

通过上面的例子可以看出,使用Spring MVC编写REST风格的应用程序是多么的简单。

需要我们注意的是,REST要求资源的标识是不变的,也就是说对于特定的资源,无论对这个资源作了什么样的操作,资源的ID不可以改变。之所以加入 这样的限制是为了保证URI的一致性。试想如果某个操作在处理过程中改变了资源的标识,那么为了保证规则的完整性,我们必须付出额外的代价去在其它的处理 中同步这些变化,这在REST中是不可接受的。

另一方面,REST要求针对资源的所有操作必须是无状态的,URI是确定资源的唯一途径。如果我们在处理数据的过程中融入了状态数据,那么针对同一资源的URI就会出现二义性,这将与REST的定义背道而驰。

使用Spring MVC构建REST风格WEB应用的更多相关文章

  1. &lbrack;转&rsqb; 使用Spring MVC构建REST风格WEB应用

    原文地址:http://fancy888.iteye.com/blog/1629120 对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理 ...

  2. spring mvc构建WEB应用程序入门例子

    在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请 ...

  3. 用Spring MVC开发简单的Web应用程序

    1 工具与环境 借助Eclipse4.3 + Maven3.0.3构建Java Web应用程序.使用Maven内置的servlet 容器jetty,不需手工集成Web服务器到Eclipse.还帮我们自 ...

  4. Spring Boot 2&period;X&lpar;三&rpar;:使用 Spring MVC &plus; MyBatis &plus; Thymeleaf 开发 web 应用

    前言 Spring MVC 是构建在 Servlet API 上的原生框架,并从一开始就包含在 Spring 框架中.本文主要通过简述 Spring MVC 的架构及分析,并用 Spring Boot ...

  5. Spring Boot构建 RESTful 风格应用

    Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...

  6. 干净win7要做几步才能运行第一个Spring MVC 写的动态web程序

    干净win7要做几步才能运行第一个Spring MVC 写的动态web程序: 1. 下载安装jdk 2. 配置Java环境变量 3. 测试一下第1,2两步是否完全成功:http://jingyan.b ...

  7. CRUD using Spring MVC 4&period;0 RESTful Web Services and AngularJS

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. 基于Spring &plus; Spring MVC &plus; Mybatis &plus; shiro 高性能web构建

    一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详 ...

  9. 【Spring学习笔记-MVC-18&period;1】Spring MVC实现RESTful风格-同一资源&comma;多种展现&colon;xml-json-html

    概要 要实现Restful风格,主要有两个方面要讲解,如下: 1. 同一个资源,如果需要返回不同的形式,如:json.xml等: 不推荐的做法: /user/getUserJson /user/get ...

随机推荐

  1. CentOS6&period;5 解压安装 二进制分发版 mysql-5&period;5&period;49-linux2&period;6-x86&lowbar;64&period;tar&period;gz

    环境:CentOS 6.5 64位 1.下载安装包 http://dev.mysql.com/downloads/mysql/5.5.html#downloads http://dev.mysql.c ...

  2. CentOS下通过locale来设置字符集

    转载:http://www.centoscn.com/CentOS/config/2013/1013/1784.html 在Centos中通过locale来设置程序运行的不同语言环境,locale由A ...

  3. I - Navigation Nightmare-poj 1984

    约翰和他的邻居生活在一个村庄里,他们的道路修建的很特别,都是正东正西或者正南正北,但是呢他们用一种方式描述他们和邻居的位置,比如说 6号 在1号 东面13处,那么我们就可以计算出来这两家的曼哈顿距离, ...

  4. HDU1062&colon;Text Reverse

    Problem Description Ignatius likes to write words in reverse way. Given a single line of text which ...

  5. 个人作业2-英语学习案例app分析

    第一部分 调研, 评测 (软件的bug,功能评测,黑箱测试, 第8章 用户调研, 12 章 软件的用户体验) 下载并使用,描述最简单直观的个人第一次上手体验. ①个人感觉还不错,词典的首页页面挺好看的 ...

  6. 【RL-TCPnet网络教程】第21章 RL-TCPnet之高效的事件触发框架

    第21章       RL-TCPnet之高效的事件触发框架 本章节为大家讲解高效的事件触发框架实现方法,BSD Socket编程和后面章节要讲解到的FTP.TFTP和HTTP等都非常适合使用这种方式 ...

  7. babelrc

    .babelrc文件 // 简单版 { "presets": ["es2015", "stage-2"], // 使用 es2015 npm ...

  8. Selenium上机实验

    1.安装SeleniumIDE插件 2.学会使用SeleniumIDE录制脚本和导出脚本 3.访问https://psych.liebes.top/st使用学号登录系统(账户名为学号,密码为学号后6位 ...

  9. mongodb mapredReduce 多个条件分组(group by)

    from:https://my.oschina.net/chiyong/blog/289138 Mongodb 没有传统数据库的group函数,如果分组需要走MapReduce.这种MR与Hadoop ...

  10. Spring资源加载基础ClassLoader

    1 ClassLoader工作机制 1.1 ClassLoader作用 寻找类字节码文件并构造出类在JVM内部表示的组件.负责运行时查找和装入Class字节码文件 1.2 装载步骤 1.2.1 装载 ...