一、概述

从互联网诞生的第一天起,web从一个简单的静态页面,发展到今天五花八门、令人眼花缭乱的复杂应用,大到企业级的web应用系统,小到简单的SPA管理系统。在硬件性能提升的同时,通过各种技术实现了海量数据存储、解决了高并发的性能瓶颈、追求极致的用户体验等。从前端到后端,随着业务需求的变更和技术的更新迭代,开发模式也随之发生着改变。

二、原则

从软件工程的层面来看,开发一个系统,不仅是为了要完成业务目标。同时,还应该关注实现的过程和在实现过程中所采用的方式方法。

  • 关注点分离
  • 高内聚、低耦合
  • 可维护性、可扩展性、可重用性

三、发展史

1、传统JSP模式

也称为web 1.0时代。基于传统的网页HTML文件,可以作为页面来浏览。同时,又兼容java代码,可以用来处理业务逻辑。对于功能单一、需求稳定的项目,可以把页面展示逻辑和业务逻辑都放到JSP中。

  • 优点:编程简单,易上手,容易控制
  • 缺点:前后端职责不清晰,可维护性差

2、Model1模式

可看做是对传统JSP模式的增强。加入了JavaBean或Servlet,将页面展示逻辑和业务逻辑做了分离。JSP只负责显示页面,JavaBean或者Servlet负责收集数据,以及返回处理结果。

  • 优点:架构简单,适合中小型项目
  • 缺点:虽然分离出业务逻辑,但是JSP中仍然包含页面展示逻辑和流程控制逻辑,不利于维护

3、Model2模式

该模式也可以看做是传统MVC模式。为了更好地进行职责划分,将流程控制逻辑也分离了出来。JSP负责页面展示,以及与用户的交互,展示逻辑;Servlet负责控制数据显示和状态更新,控制逻辑;JavaBeans负责操作和处理数据,业务逻辑。

  • 优点:分工明确,层次清晰,能够更好地适应需求的变化,适合大型项目
  • 缺点:相对复杂,严重依赖Servlet API,JavaBean组件类过于庞大

4、后端MVC模式

该模式是在Model2的基础上,对传统MVC模式的一种变化。涌现出很多基于MVC模式的开发框架,如Struts、SpringMVC等。再加上Spring开源框架强大的兼容特性,进而形成了可以适应绝大多数业务需求的经典框架组合,如SSH、SSM等。

  • 前端开发重度依赖后端开发环境
  • 前后端职责依旧纠缠不清,Controller成为灰色地带

5、前端MVC模式(SPA)

随着Ajax的推出,标志着进入了web 2.0时代。前后端分工明确,通过Ajax接口关联,浏览器端变得复杂。

  • 前后端可以在约定接口后实现高效并行开发
  • 前端开发的复杂度控制比较困难

6、前端为主的MV*模式

为了降低前端开发复杂度,涌现了大量的前端框架,如EmberJS、KnockoutJS、AngularJS等。原则是先按照类型分层,如Templates、Controllers、Models等,然后在层内按照业务功能切分。

好处:

  • 前后端职责清晰,在各自的工作环境开发,测试容易
  • 前端开发的复杂度可控,通过组件化组织结构
  • 部署相对独立

不足:

  • 前后端代码不能复用
  • 全异步不利于SEO
  • 性能并非最佳,尤其是移动互联网的环境下
  • SPA不能满足所有需求

7、全栈模式

随着Node.js的兴起,标志着全栈时代的到来,如MEAN框架组合、React+Redux等。前端UI层,处理浏览器层的展现逻辑,HTML+CSS+JavaScript。后端UI层,处理路由、模板、数据获取等,前端可以自由调控。后端可以专注于业务逻辑层的开发。

好处:

  • 前后端的部分代码可以复用
  • 需要SEO可以在服务端同步渲染
  • 请求太多导致性能问题可以通过服务端缓解

挑战:

  • 需要前端对服务端编程有进一步的了解
  • Node层与Java层能否高效通信尚需要验证
  • 需要更多经验才能对部署、运维层面熟悉了解
  • 还有许多历史遗留问题

四、总结

  • 模式没有好坏高下之分,只有是否合适
  • Ajax给前端开发带来了一次质的飞跃,Node很可能是第二次
  • 关注点分离是一条伟大的原则,本质上都是让前后端的职责更清晰,分工更合理高效
  • 让合适的人做合适的事,前端的专注前端,后端的专注后端,各司其职

参考文章:

lifesinger:Web 研发模式演变

Java Web应用的开发模式的更多相关文章

  1. java web几种开发模式(转)

    Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket)并不了解,这里就不列举 ...

  2. Unit05: WEB项目的开发模式 、转发 和 Unit09: EL、JSTL

    Unit05: WEB项目的开发模式 .转发   和  Unit09: EL.JSTL dao package dao; import java.io.Serializable; import jav ...

  3. 实战突击: Java Web项目整合开发(PDF)

    实战突击:  Java  Web项目整合开发(PDF)

  4. Java Web应用的开发环境配置

    1:第一是下载好Eclipse开发工具,这里不做叙述,自行下载安装. 2:使用Eclipse开发WEB项目,启动Eclipse,选择File--->new --->other---> ...

  5. 给大一的学弟学妹们培训java web的后台开发讨论班计划

    蓝旭工作室5月大一讨论班课程计划   课时 讨论班性质 讨论班名称 主要内容 主讲人   第一讲 先导课 后台开发工具的使用与MySQL数据库基础 后台开发工具的基本使用方法与工程的创建,MySQL数 ...

  6. Java基础85 MVC开发模式

    1.MVC开发模式 本文用 Servlet+JSP+javaBean 的开发模式来讲解 Model:用javabean实现,用于封装业务数据View:用jsp实现,用于显示数据Controller:用 ...

  7. 服务器部署Java Web及微信开发调试

    参考摘抄: 阿里云部署Java网站和微信开发调试心得技巧(上):https://www.imooc.com/article/20583 阿里云部署Java网站和微信开发调试心得技巧(下):https: ...

  8. 使用Spring Boot来加速Java web项目的开发

    我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用 ...

  9. Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)

    三.Servlet的生命周期 一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet怎样被加载并被初始化,怎样接收请求并作出对请求的响应,怎样被从服务中清除.Servlet ...

随机推荐

  1. svn的初级使用

    首先呢 你需要下载一个软件  比如说是 Cornerstone. 进行安装好之后 然后 然后输入账号密码 就可以了 然后去xcode去进行相关的配置 点击第二个进入 偏好设置 点击最下边的+ 点击第二 ...

  2. SGU 142.Keyword

    时间限制:0.5s 空间限制:16M 题意 给出一个仅由'a',‘b’组成的字符串S,长度小于500 000,求一个由‘a’,‘b’组成的不是S子串的字符串T. 输出T的长度和T. Sample In ...

  3. SGU 199 Beautiful People(DP+二分)

    时间限制:0.25s 空间限制:4M 题意: 有n个人,每个人有两个能力值,只有一个人的两个能力都小于另一个的能力值,这两个人才能共存,求能同时共存的最大人数. Solution: 显然这是一个两个关 ...

  4. 内置方法+lambda是pythonic的利器

    python可以写的非常简洁,通过使用内置的map,reduce,filter,lambda方法,非常具有文艺范. 举个例子,例如 def fromIpToNum(ipAddr):    return ...

  5. Extjs4.2.1学习笔记[更新]

    心血来潮准备学习一下Extjs,就从官方网站http://extjs.org.cn/下载了最新版本4.2.1,开始从头学习,记一下笔记,让自己能够持之以恒. 先说一下基本文件类库引用吧, 每个项目一开 ...

  6. dictionary(字典)

    dictionary(字典):   字典对象   字典是一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划.字母来查对应页的详细内容. 1.      dic={"n ...

  7. pkg-config相关的常用指令

    pkg-config用途: 查询系统已安装库的基础信息(元信息) 1.查看所有的pkg-config库 pkg-config --list-all --list-all  列出pkg-config路径 ...

  8. NSDate 总结日期操作

    IOS Object-c NSDate总结日期操作 //NSDate //1, 创建NSDate对象 NSDate *nowDate = [NSDate date]; NSLog(@"%@& ...

  9. 转:.NET中使用Redis (一)

    原文来自于:http://blog.jobbole.com/83821/ 原文出处: 寒江独钓   欢迎分享原创到伯乐头条 Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Gi ...

  10. C# 关于NULL 可空值类型 ? 和空接操作符??

    作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...