转自: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应用程序强调以下几点规则:
- 网络上的所有事物都被抽象为资源(resource);
- 每个资源对应一个唯一的资源标识(resource identifier);
- 通过通用的连接器接口(generic connector interface)对资源进行操作;
- 对资源的各种操作不会改变资源标识;
- 所有的操作都是无状态的(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风格编程的基本思路:
- 抽象和定义系统中的资源;
- 使用REST风格的URI将请求与资源进行绑定;
- 使用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的订单信息为例:
- Ajax发起请求:http://www.coolfancy.com/rest/order/1;
- 通过REST风格的URI设计将请求与后台实体进行绑定;
- 后台实体返回包含产品信息的JSON/XML数据;
- 前台使用脚本进行数据的展示。
我们用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应用的更多相关文章
-
[转] 使用Spring MVC构建REST风格WEB应用
原文地址:http://fancy888.iteye.com/blog/1629120 对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理 ...
-
spring mvc构建WEB应用程序入门例子
在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请 ...
-
用Spring MVC开发简单的Web应用程序
1 工具与环境 借助Eclipse4.3 + Maven3.0.3构建Java Web应用程序.使用Maven内置的servlet 容器jetty,不需手工集成Web服务器到Eclipse.还帮我们自 ...
-
Spring Boot 2.X(三):使用 Spring MVC + MyBatis + Thymeleaf 开发 web 应用
前言 Spring MVC 是构建在 Servlet API 上的原生框架,并从一开始就包含在 Spring 框架中.本文主要通过简述 Spring MVC 的架构及分析,并用 Spring Boot ...
-
Spring Boot构建 RESTful 风格应用
Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...
-
干净win7要做几步才能运行第一个Spring MVC 写的动态web程序
干净win7要做几步才能运行第一个Spring MVC 写的动态web程序: 1. 下载安装jdk 2. 配置Java环境变量 3. 测试一下第1,2两步是否完全成功:http://jingyan.b ...
-
CRUD using Spring MVC 4.0 RESTful Web Services and AngularJS
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
-
基于Spring + Spring MVC + Mybatis + shiro 高性能web构建
一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详 ...
-
【Spring学习笔记-MVC-18.1】Spring MVC实现RESTful风格-同一资源,多种展现:xml-json-html
概要 要实现Restful风格,主要有两个方面要讲解,如下: 1. 同一个资源,如果需要返回不同的形式,如:json.xml等: 不推荐的做法: /user/getUserJson /user/get ...
随机推荐
-
CentOS6.5 解压安装 二进制分发版 mysql-5.5.49-linux2.6-x86_64.tar.gz
环境:CentOS 6.5 64位 1.下载安装包 http://dev.mysql.com/downloads/mysql/5.5.html#downloads http://dev.mysql.c ...
-
CentOS下通过locale来设置字符集
转载:http://www.centoscn.com/CentOS/config/2013/1013/1784.html 在Centos中通过locale来设置程序运行的不同语言环境,locale由A ...
-
I - Navigation Nightmare-poj 1984
约翰和他的邻居生活在一个村庄里,他们的道路修建的很特别,都是正东正西或者正南正北,但是呢他们用一种方式描述他们和邻居的位置,比如说 6号 在1号 东面13处,那么我们就可以计算出来这两家的曼哈顿距离, ...
-
HDU1062:Text Reverse
Problem Description Ignatius likes to write words in reverse way. Given a single line of text which ...
-
个人作业2-英语学习案例app分析
第一部分 调研, 评测 (软件的bug,功能评测,黑箱测试, 第8章 用户调研, 12 章 软件的用户体验) 下载并使用,描述最简单直观的个人第一次上手体验. ①个人感觉还不错,词典的首页页面挺好看的 ...
-
【RL-TCPnet网络教程】第21章 RL-TCPnet之高效的事件触发框架
第21章 RL-TCPnet之高效的事件触发框架 本章节为大家讲解高效的事件触发框架实现方法,BSD Socket编程和后面章节要讲解到的FTP.TFTP和HTTP等都非常适合使用这种方式 ...
-
babelrc
.babelrc文件 // 简单版 { "presets": ["es2015", "stage-2"], // 使用 es2015 npm ...
-
Selenium上机实验
1.安装SeleniumIDE插件 2.学会使用SeleniumIDE录制脚本和导出脚本 3.访问https://psych.liebes.top/st使用学号登录系统(账户名为学号,密码为学号后6位 ...
-
mongodb mapredReduce 多个条件分组(group by)
from:https://my.oschina.net/chiyong/blog/289138 Mongodb 没有传统数据库的group函数,如果分组需要走MapReduce.这种MR与Hadoop ...
-
Spring资源加载基础ClassLoader
1 ClassLoader工作机制 1.1 ClassLoader作用 寻找类字节码文件并构造出类在JVM内部表示的组件.负责运行时查找和装入Class字节码文件 1.2 装载步骤 1.2.1 装载 ...