javaweb开发:从传统的MVC架构到现在流行的前后端分离开发架构(RESTful架构)
2017-03-17 21:14
549 查看
本文介绍传统的MVC框架和现代的RESTful架构.介绍他们之间的对比。
spring:提供IOC/AOP核心功能。实现了低耦合和高内聚的特点,让java开发者更加关注与业务逻辑的实现。spring最强大的地方在于它能够与其他主流框架整合以减轻程序员的开发负担。
ORM:当前使用最多的O/R mapping框架,一个是Mybatis(IBATIS), 另一个是Hibernate
Controller:对服务端的MVC框架,使用最多的是Structs2以及SpringMVC.
那么对于传统的MVC开发模式,我们做一点简要回顾:
模型(Model):是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的Java Bean。
视图(View):它更加偏重于展现,也就是说,视图决定了界面到底长什么样子,在Java中可通过JSP来充当视图,或者通过纯HTML的方式进行展现,而后者才是目前的主流。
控制器(Controller):模型和视图需要通过控制器来进行粘合,例如,用户发送一个HTTP请求,此时该请求首先会进入控制器,然后控制器去获取数据并将其封装为模型,最后将模型传递到视图中进行展现。
那么传统的MVC框架的不足之处在哪呢?
1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂。
2)实际上视图是依赖于模型的,换句话说,如果没有模型,视图也无法呈现出最终的效果。 渲染视图的过程是在服务端来完成的,最终呈现给浏览器的是带有模型的视图页面,性能无法得到很好的优化。
正如上图所示,我们在传统的MVC框架中进行了改进:
首先从浏览器发送AJAX请求,然后服务端接受该请求并返回JSON数据返回给浏览器,最后在浏览器中进行界面渲染。
而这个模型正是REST(表述性状态转移),这种轻量级的Web服务我们把它称之为RESTful Web Services服务(REST服务)。
所以如果把浏览器视作是前端,服务器是作为后台,则将会有如下图所示:
(注:starUML中箭头会重叠,所以分为两个用例了。)
总结:REST服务能够使得前后端分离。
下面使用SpringMVC创建REST API的一个例子:(当然这里没有使用框架)
说明:
toIndex方法:传统的MVC模式,HTTP请求被控制器处理,封装成模型,最终通过视图展示。
selectUser方法:前后端分离的REST模式,客户端通过HTTP请求获取到JSON数据后进行解析渲染展示。
问题1.对于传统MVC:前端人员仅仅提供静态html页面,其余工作皆由后端开发人员完成。---减轻前端人员开发负担,后端开发压力较大。
前后端分离开发:可以减后台负担,加快研发效率,当然,前提是前端能做好的话。以往只需要提供静态页面的前端人员,在前后端分离模式中要负责项目的view+controller部分,即除了静态页面,还需要负责页面的所有交互代码、以及nodejs与视图层以及后端API的交互工作,无疑增加了前端人员的学习成本,在没有足够知识和人才储备的情况下,只能让前端人员加班加点。结果是大量前端人员离职
问题2:很多公司认为采用前后端分离之后,前后端只需要通过指定API进行交互即可,前端负责页面渲染,Nodejs负责路由分配,后端提供API。忽视了大量关键工作,职责分配和细节处理没有相应文档规定,缓存机制、图片上传下载、数据校验、语言国际化等等并没有出具相应信息。另外,大量忽视了nodejs层的作用,仅仅把nodejs当成一个路由中转,这一方面也是对nodejs技术的不熟悉导致的,其实nodejs能负责很多事,除了复杂业务逻辑处理和数据操作由Java 负责,大量工作完全可以在nodejs层处理。
问题3:很多公司采用了前后端分离模式后,后端API仍然采用以往的传统风格,这是不合理的,Restful风格的API应该是前后端分离的最佳实践。ResultFul推荐每个URL能操作具体的资源,而且能准确描述服务器对资源的处理动作,通常服务器对资源支持get/post/put/delete/等,用来实现资源的增删改查。前后端分离的话,这些api-url是对接的桥梁,采用resultFul接口地址含义才更清晰、见名知意
问题四:前后端分离后,无论是API接口的对接还是测试工作,都涉及到前后端人员的沟通,很多公司采用前后端分离后,前后端协作模式配合力度底,互相等待,开发效率低下,反而不如传统的开发模式。例如:当后端 API 没有编写完成时,前端无法进行调试,这就导致了前端会被后端阻塞的情况。其实像这种互相等待的模式需要改进, Mock Server 可能可以解决一些问题。
大致的前后端分离模式:
1、项目设计阶段,前后端架构负责人将项目整体进行分析,讨论并确定API风格、职责分配、开发协助模式,确定人员配备;设计确定后,前后端人员共同制定开发接口。
2、项目开发阶段,前后端分离是各自分工,协同敏捷开发,后端提供Restful API,并给出详细文档说明,前端人员进行页面渲染前台的任务是发送API请(GET,PUT,POST,DELETE等)获取数据(json,xml)后渲染页面。
3、项目测试阶段,API完成之前,前端人员会使用mock server进行模拟测试,后端人员采用junit进行API单元测试,不用互相等待;API完成之后,前后端再对接测试一下就可以了,当然并不是所有的接口都可以提前定义,有一些是在开发过程中进行调整的。
4、项目部署阶段,利用nginx 做反向代理,即Java + nodejs + nginx 方式进行。
传统的MVC框架vs基于RESTful架构前后端分离的开发架构
传统方法
对于传统的java'开发,我们使用常用的一处框架是SSH(spring+struts+Hibernate),SSM(spring+springmvc+mybatis).这两个组合都简化了开发过程,让程序员更加专注于业务逻辑而非其他细节。简要回顾一下传统框架的核心技术:spring:提供IOC/AOP核心功能。实现了低耦合和高内聚的特点,让java开发者更加关注与业务逻辑的实现。spring最强大的地方在于它能够与其他主流框架整合以减轻程序员的开发负担。
ORM:当前使用最多的O/R mapping框架,一个是Mybatis(IBATIS), 另一个是Hibernate
Controller:对服务端的MVC框架,使用最多的是Structs2以及SpringMVC.
那么对于传统的MVC开发模式,我们做一点简要回顾:
模型(Model):是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的Java Bean。
视图(View):它更加偏重于展现,也就是说,视图决定了界面到底长什么样子,在Java中可通过JSP来充当视图,或者通过纯HTML的方式进行展现,而后者才是目前的主流。
控制器(Controller):模型和视图需要通过控制器来进行粘合,例如,用户发送一个HTTP请求,此时该请求首先会进入控制器,然后控制器去获取数据并将其封装为模型,最后将模型传递到视图中进行展现。
那么传统的MVC框架的不足之处在哪呢?
1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂。
2)实际上视图是依赖于模型的,换句话说,如果没有模型,视图也无法呈现出最终的效果。 渲染视图的过程是在服务端来完成的,最终呈现给浏览器的是带有模型的视图页面,性能无法得到很好的优化。
新的方法
正如上图所示,我们在传统的MVC框架中进行了改进:
首先从浏览器发送AJAX请求,然后服务端接受该请求并返回JSON数据返回给浏览器,最后在浏览器中进行界面渲染。
而这个模型正是REST(表述性状态转移),这种轻量级的Web服务我们把它称之为RESTful Web Services服务(REST服务)。
所以如果把浏览器视作是前端,服务器是作为后台,则将会有如下图所示:
(注:starUML中箭头会重叠,所以分为两个用例了。)
总结:REST服务能够使得前后端分离。
下面使用SpringMVC创建REST API的一个例子:(当然这里没有使用框架)
import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.bestpay.skynet.mockerplatform.entity.User; import com.bestpay.skynet.mockerplatform.service.UserService; @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("showUser") public String toIndex(HttpServletRequest request, Model model) { Long userId = Long.parseLong(request.getParameter("id")); User user = userService.searchUserModelInfo(userId); model.addAttribute("user", user); return "showUser"; } @RequestMapping(value="/selectUserById/{userId}", method=RequestMethod.GET) public @ResponseBody User selectUser(@PathVariable Long userId) { return userService.searchUserModelInfo(userId); } @RequestMapping(value="/createUser", method=RequestMethod.POST) public @ResponseBody Long createUser(@RequestBody User user) { return userService.addUserModelInfo(user); } @RequestMapping(value="/updateUser", method=RequestMethod.PUT) public @ResponseBody Long updateUser(@RequestBody User user) { return userService.updateUserModelInfo(user); } @RequestMapping(value="/deleteUserById/{userId}", method=RequestMethod.DELETE) public @ResponseBody Long deleteUser(@PathVariable Long userId) { return userService.removeUserModelInfo(userId); } }
说明:
toIndex方法:传统的MVC模式,HTTP请求被控制器处理,封装成模型,最终通过视图展示。
selectUser方法:前后端分离的REST模式,客户端通过HTTP请求获取到JSON数据后进行解析渲染展示。
新的问题:
但是并非前后端开发模式就优越于传统的开发模式:问题1.对于传统MVC:前端人员仅仅提供静态html页面,其余工作皆由后端开发人员完成。---减轻前端人员开发负担,后端开发压力较大。
前后端分离开发:可以减后台负担,加快研发效率,当然,前提是前端能做好的话。以往只需要提供静态页面的前端人员,在前后端分离模式中要负责项目的view+controller部分,即除了静态页面,还需要负责页面的所有交互代码、以及nodejs与视图层以及后端API的交互工作,无疑增加了前端人员的学习成本,在没有足够知识和人才储备的情况下,只能让前端人员加班加点。结果是大量前端人员离职
问题2:很多公司认为采用前后端分离之后,前后端只需要通过指定API进行交互即可,前端负责页面渲染,Nodejs负责路由分配,后端提供API。忽视了大量关键工作,职责分配和细节处理没有相应文档规定,缓存机制、图片上传下载、数据校验、语言国际化等等并没有出具相应信息。另外,大量忽视了nodejs层的作用,仅仅把nodejs当成一个路由中转,这一方面也是对nodejs技术的不熟悉导致的,其实nodejs能负责很多事,除了复杂业务逻辑处理和数据操作由Java 负责,大量工作完全可以在nodejs层处理。
问题3:很多公司采用了前后端分离模式后,后端API仍然采用以往的传统风格,这是不合理的,Restful风格的API应该是前后端分离的最佳实践。ResultFul推荐每个URL能操作具体的资源,而且能准确描述服务器对资源的处理动作,通常服务器对资源支持get/post/put/delete/等,用来实现资源的增删改查。前后端分离的话,这些api-url是对接的桥梁,采用resultFul接口地址含义才更清晰、见名知意
问题四:前后端分离后,无论是API接口的对接还是测试工作,都涉及到前后端人员的沟通,很多公司采用前后端分离后,前后端协作模式配合力度底,互相等待,开发效率低下,反而不如传统的开发模式。例如:当后端 API 没有编写完成时,前端无法进行调试,这就导致了前端会被后端阻塞的情况。其实像这种互相等待的模式需要改进, Mock Server 可能可以解决一些问题。
如何实现前后端分离开发
怎么做前后端分离?大方向就是:后端专注于:后端控制层(Restful API) & 服务层 & 数据访问层;前端专注于:前端控制层(Nodejs) & 视图层.大致的前后端分离模式:
1、项目设计阶段,前后端架构负责人将项目整体进行分析,讨论并确定API风格、职责分配、开发协助模式,确定人员配备;设计确定后,前后端人员共同制定开发接口。
2、项目开发阶段,前后端分离是各自分工,协同敏捷开发,后端提供Restful API,并给出详细文档说明,前端人员进行页面渲染前台的任务是发送API请(GET,PUT,POST,DELETE等)获取数据(json,xml)后渲染页面。
3、项目测试阶段,API完成之前,前端人员会使用mock server进行模拟测试,后端人员采用junit进行API单元测试,不用互相等待;API完成之后,前后端再对接测试一下就可以了,当然并不是所有的接口都可以提前定义,有一些是在开发过程中进行调整的。
4、项目部署阶段,利用nginx 做反向代理,即Java + nodejs + nginx 方式进行。
相关文章推荐
- 什么是RESTful架构?相比于RESTful架构,传统的MVC架构又有哪些区别?
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- JavaWeb开发中前后端分离的技术方案和优缺点
- 前端调用后端的方法(基于restful接口的mvc架构)
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- 通过Express4构建Restful API服务器 - 结合AngularJS前后端分离开发
- 【Spring MVC】从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- MVC 前后端分离(REST-个人也认为是目前比较流行和比较好的方式) 2017-07-24 19:23 77人阅读 评论(0) 收藏 举报 分类: Spring(4) 目录(?)[+] 摘要
- ReactJS +Spring MVC前后端分离 RESTful 交互
- asp.net,C#,sqlserver,数据库,iis,js,异常,兼容,搜索,性能,备份,编辑器,存取分离,lucene,SEO优化,产品,运营,MVC,三层架构,nhibernate,microsoft,freamwork,网站开发联盟群号:
- JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式) 2015-10-26 09:16 31406人阅读 评论(10) 收藏 举报 分类: PHP+MySQL技术(156)
- MVC 前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- [置顶]信息发布系统 Jquery+MVC架构开发(3)解决方案创建)
- [置顶]信息发布系统 Jquery+MVC架构开发(2) 在EA下进行数据库设计