MVC 是一种经典的设计模式,全名为 Model-View-Controller
,即 模型-视图-控制器
。javascript
其中,模型
是用于封装数据的载体,例如,在 Java 中通常经过一个简单的 POJO
(Plain Ordinary Java Object)来表示,其本质是一个普通的 Java Bean,包含一系列的成员变量及其 getter/setter 方法。对于 视图
而言,它更加偏重于展示,也就是说,视图决定了界面到底长什么样子,在 Java 中可经过 JSP 来充当视图,或者经过纯 HTML 的方式进行展示,然后者才是目前的主流。模型和视图须要经过 控制器
来进行粘合,例如,用户发送一个 HTTP 请求,此时该请求首先会进入控制器,而后控制器去获取数据并将其封装为模型,最后将模型传递到视图中进行展示。前端
综上所述,MVC 的交互过程以下图所示:java
MVC 模式早在上个世纪 70 年代就诞生了,直到今天它依然存在,可见生命力至关之强。MVC 模式最先用于 Smalltalk 语言中,最后在其它许多开发语言中都获得了很好的应用,例如,Java 中的 Struts、Spring MVC 等框架。正是由于这些 MVC 框架的出现,才让 MVC 模式真正落地,让开发更加高效,让代码耦合度尽可能减少,让应用程序各部分的职责更加清晰。web
既然 MVC 模式这么好,难道它就没有不足的地方吗?我认为 MVC 至少有如下三点不足:spring
为了使数据展示过程更加直接,而且提供更好的用户体验,咱们有必要对 MVC 模式进行改进。不妨这样来尝试,首先从浏览器发送 AJAX 请求,而后服务端接受该请求并返回 JSON 数据返回给浏览器,最后在浏览器中进行界面渲染。typescript
改进后的 MVC 模式以下图所示:数据库
也就是说,咱们输入的是 AJAX 请求,输出的是 JSON 数据,市面上有这样的技术来实现这个功能吗?答案是 REST。编程
REST 全称是 Representational State Transfer(表述性状态转移),它是 Roy Fielding 博士在 2000 年写的一篇关于软件架构风格的论文,此文一出,威震四方!国内外许多知名互联网公司纷纷开始采用这种轻量级的 Web 服务,你们习惯将其称为 RESTful Web Services,或简称 REST 服务。json
若是将浏览器这一端视为前端,而服务器那一端视为后端的话,能够将以上改进后的 MVC 模式简化为如下先后端分离模式:后端
可见,有了 REST 服务,前端关注界面展示,后端关注业务逻辑,分工明确,职责清晰。那么,如何使用 REST 服务将应用程序进行先后端分离呢?咱们接下来继续探讨,首先咱们须要认识 REST。
REST 本质上是使用 URL 来访问资源种方式。众所周知,URL 就是咱们日常使用的请求地址了,其中包括两部分:请求方式
与 请求路径
,比较常见的请求方式是 GET 与 POST,但在 REST 中又提出了几种其它类型的请求方式,汇总起来有六种:GET、POST、PUT、DELETE、HEAD、OPTIONS。尤为是前四种,正好与 CRUD
(Create-Retrieve-Update-Delete,增删改查)四种操做相对应,例如,GET(查)、POST(增)、PUT(改)、DELETE(删),这正是 REST 与 CRUD 的殊途同归之妙!须要强调的是,REST 是“面向资源”的,这里提到的资源,实际上就是咱们常说的领域对象,在系统设计过程当中,咱们常常经过领域对象来进行数据建模。
REST 是一个“无状态”的架构模式,由于在任什么时候候均可以由客户端发出请求到服务端,最终返回本身想要的数据,当前请求不会受到上次请求的影响。也就是说,服务端将内部资源发布 REST 服务,客户端经过 URL 来访问这些资源,这不就是 SOA 所提倡的“面向服务”的思想吗?因此,REST 也被人们看作是一种“轻量级”的 SOA 实现技术,所以在企业级应用与互联网应用中都获得了普遍应用。
下面咱们举几个例子对 REST 请求进行简单描述:
REST 请求 | 描述 |
---|---|
GET:/advertisers | 获取全部的广告主 |
GET:/advertiser/1 | 获取 ID 为 1 的广告主 |
PUT:/advertiser/1 | 更新 ID 为 1 的广告主 |
DELETE:/advertiser/1 | 删除 ID 为 1 的广告主 |
POST:/advertiser | 建立广告主 |
可见,请求路径相同,但请求方式不一样,所表明的业务操做也不一样,例如,/advertiser/1 这个请求,带有 GET、PUT、DELETE 三种不一样的请求方式,对应三种不一样的业务操做。
虽然 REST 看起来仍是很简单的,实际上咱们每每须要提供一个 REST 框架,让其实现先后端分离架构,让开发人员将精力集中在业务上,而并不是那些具体的技术细节。下面咱们将使用 Java 技术来实现这个 REST 框架,总体框架会基于 Spring 进行开发。
使用 REST 框架实现先后端分离架构,咱们须要首先肯定返回的 JSON 响应结构是统一的,也就是说,每一个 REST 请求将返回相同结构的 JSON 响应结构。不妨定义一个相对通用的 JSON 响应结构,其中包含两部分:元数据
与 返回值
,其中,元数据表示操做是否成功与返回值消息等,返回值对应服务端方法所返回的数据。该 JSON 响应结构以下:
{
"meta": { "success": true, "message": "ok" }, "data": ... }
为了在框架中映射以上 JSON 响应结构,咱们须要编写一个 Response
类与其对应:
public class Response { private static final String OK = "ok"; private static final String ERROR = "error"; private Meta meta; private Object data; public Response success() { this.meta = new Meta(true, OK); return this; } public Response success(Object data) { this.meta = new Meta(true, OK); this.data = data; return this; } public Response failure() { this.meta = new Meta(false, ERROR); return this; } public Response failure(String message) { this.meta = new Meta(false, message); return this; } public Meta getMeta() { return meta; } public Object getData() { return data; } public class Meta { private boolean success; private String message; public Meta(boolean success) { this.success = success; } public Meta(boolean success, String message) { this.success = success; this.message = message; } public boolean isSuccess() { return success; } public String