潭州教育JavaWeb从MVC到前后端分离_第1页
潭州教育JavaWeb从MVC到前后端分离_第2页
潭州教育JavaWeb从MVC到前后端分离_第3页
潭州教育JavaWeb从MVC到前后端分离_第4页
潭州教育JavaWeb从MVC到前后端分离_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、潭州教育java教程分享 潭州教育JavaWeb 从 MVC 到前后端分离先描述 MVC 模式是什么,然后针对 MVC 的不足发表了作者的个人观点,随后引出了基于 REST 架构实现前后端分离的方案,最后使用了 Java 的 Spring 框架搭建了一个简单的 REST 框架。全文从原理到实战,希望对于想了解如何实现前后端分离架构的朋友有所帮助。 1 理解 MVCMVC 是一种经典的设计模式,全名为 Model-View-Controller,即 模型-视图-控制器。其中,模型 是用于封装数据的载体,例如,在 Java 中一般通过一个简单的 P

2、OJO(Plain Ordinary Java Object)来表示,其本质是一个普通的 Java Bean,包含一系列的成员变量及其 getter/setter 方法。对于 视图 而言,它更加偏重于展现,也就是说,视图决定了界面到底长什么样子,在 Java 中可通过 JSP 来充当视图,或者通过纯 HTML 的方式进行展现,而后者才是目前的主流。模型和视图需要通过 控制器 来进行粘合,例如,用户发送一个 HTTP 请求,此时该请求首先会进入控制器,然后控制器去获取数据并将其封装为模型,最后将模型传递到视图中进行展现。综上所述,MVC 的交互过程如下图所

3、示:2 MVC 模式的优点与不足MVC 模式早在上个世纪 70 年代就诞生了,直到今天它依然存在,可见生命力相当之强。MVC 模式最早用于 Smalltalk 语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java 中的 Struts、Spring MVC 等框架。正是因为这些 MVC 框架的出现,才让 MVC 模式真正落地,让开发更加高效,让代码耦合度尽量减小,让应用程序各部分的职责更加清晰。既然 MVC 模式这么好,难道它就没有不足的地方吗?我认为 MVC 至少有以下三点不足:1. 每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这

4、个过程似乎有些复杂。2. 实际上视图是依赖于模型的,换句话说,如果没有模型,视图也无法呈现出最终的效果。3. 渲染视图的过程是在服务端来完成的,最终呈现给浏览器的是带有模型的视图页面,性能无法得到很好的优化。为了使数据展现过程更加直接,并且提供更好的用户体验,我们有必要对 MVC 模式进行改进。不妨这样来尝试,首先从浏览器发送 AJAX 请求,然后服务端接受该请求并返回 JSON 数据返回给浏览器,最后在浏览器中进行界面渲染。改进后的 MVC 模式如下图所示:也就是说,我们输入的是 AJAX 请求,输出的是 JSON 数据,市面上有这样的技术来实现这个功能吗?答案是 REST。 RE

5、ST 全称是 Representational State Transfer(表述性状态转移),它是 Roy Fielding 博士在 2000 年写的一篇关于软件架构风格的论文,此文一出,威震四方!国内外许多知名互联网公司纷纷开始采用这种轻量级的 Web 服务,大家习惯将其称为 RESTful Web Services,或简称 REST 服务。如果将浏览器这一端视为前端,而服务器那一端视为后端的话,可以将以上改进后的 MVC 模式简化为以下前后端分离模式:可见,有了 REST 服务,前端关注界面展现,后端关注业务逻辑,分工明确,职责清晰。那么,如何使用 REST 服务将应用程序进行前后端分离

6、呢?我们接下来继续探讨,首先我们需要认识 REST。3 认识 RESTREST 本质上是使用 URL 来访问资源种方式。众所周知,URL 就是我们平常使用的请求地址了,其中包括两部分:请求方式 与 请求路径,比较常见的请求方式是 GET 与 POST,但在 REST 中又提出了几种其它类型的请求方式,汇总起来有六种:GET、POST、PUT、DELETE、HEAD、OPTIONS。尤其是前四种,正好与CRUD(Create-Retrieve-Update-Delete,增删改查)四种操作相对应,例如,GET(查)、POST(增)、PUT(改)、DELETE(删),这正是 R

7、EST 与 CRUD 的异曲同工之妙!需要强调的是,REST 是“面向资源”的,这里提到的资源,实际上就是我们常说的领域对象,在系统设计过程中,我们经常通过领域对象来进行数据建模。REST 是一个“无状态”的架构模式,因为在任何时候都可以由客户端发出请求到服务端,最终返回自己想要的数据,当前请求不会受到上次请求的影响。也就是说,服务端将内部资源发布 REST 服务,客户端通过 URL 来访问这些资源,这不就是 SOA 所提倡的“面向服务”的思想吗?所以,REST 也被人们看做是一种“轻量级”的 SOA 实现技术,因此在企业级应用与互联网应用中都得到了广泛应用。下面我们举几个例子对 REST 请

8、求进行简单描述: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 框架,让其实现前后端分离架

9、构,让开发人员将精力集中在业务上,而并非那些具体的技术细节。下面我们将使用 Java 技术来实现这个 REST 框架,整体框架会基于 Spring 进行开发。4 实现 REST 框架4.1 统一响应结构使用 REST 框架实现前后端分离架构,我们需要首先确定返回的 JSON 响应结构是统一的,也就是说,每个 REST 请求将返回相同结构的 JSON 响应结构。不妨定义一个相对通用的 JSON 响应结构,其中包含两部分:元数据 与 返回值,其中,元数据表示操作是否成功与返回值消息等,返回值对应服务端方法所返回的数据。该 JSON 响应结构如下:1234567 

10、60;  "meta":         "success": true,        "message": "ok"    ,    "data": .为了在框架中映射以上 JSON 响应结构,我们需要编写一个 Respons

11、e 类与其对应:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960public class Response      private static final String OK = "ok"    private static final String ERROR = "error"

12、     private Meta meta;    private Object data;     public Response success()         this.meta = new Meta(true, OK);        return this;  &

13、#160;      public Response success(Object data)         this.meta = new Meta(true, OK);        this.data = data;        return this;   

14、      public Response failure()         this.meta = new Meta(false, ERROR);        return this;         public Response failure(String message) &

15、#160;       this.meta = new Meta(false, message);        return this;         public Meta getMeta()         return meta;   &#

16、160;     public Object getData()         return data;         public class Meta          private boolean success;     &#

17、160;  private String message;         public Meta(boolean success)             this.success = success;              

18、;   public Meta(boolean success, String message)             this.success = success;            this.message = message;       

19、0;         public boolean isSuccess()             return success;                 public String getMessage() &

20、#160;           return message;            以上 Response 类包括两类通用返回值消息:ok 与 error,还包括两个常用的操作方法:success( ) 与 failure( ),通过一个内部类来展现元数据结构,我们在下文中多次会使用该 Response 类。实现该 REST 框架需要考虑许多问题,首当其冲的就是对象

21、序列化问题。 4.2 实现对象序列化想要解释什么是 对象序列化?不妨通过一些例子进行说明。比如,在服务端从数据库中获取了数据,此时该数据是一个普通的 Java 对象,然后需要将这个 Java 对象转换为 JSON 字符串,并将其返回到浏览器中进行渲染,这个转换过程称为 序列化;再比如,通过浏览器发送了一个普通的 HTTP 请求,该请求携带了一个 JSON 格式的参数,在服务端需要将该 JSON 参数转换为普通的 Java 对象,这个转换过程称为 反序列化。不管是序列化还是反序列化,我们一般都称为序列化。实际上,Spring MVC 已经为我们提供了这类序

22、列化特性,只需在 Controller 的方法参数中使用 RequestBody 注解定义需要反序列化的参数即可,如以下代码片段:12345678Controllerpublic class AdvertiserController      RequestMapping(value = "/advertiser", method = RequestMethod.POST)    public Response createAdvertiser(RequestBody AdvertiserParam advertiserParam)       

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论