MVC设计模式⯐
OO设计原则
五大设计原则(SOLID):
-
单一职责原则 (Single Responsibility Principle)
- 每个方法或类应当做一件事情,或者只有一项职责。
-
开闭原则(Open Close Principle)
- 开闭原则就是说对扩展开放,对修改关闭。
-
里氏代换原则(Liskov Substitution Principle)
- 任何基类可以出现的地方,子类一定可以出现。
-
接口隔离原则(Interface Segregation Principle)
- 使用多个隔离的接口,比使用单个接口要好。
-
依赖倒转原则(Dependence Inversion Principle)
- 对接口编程,依赖于抽象而不依赖于具体。
OO设计模式
设计模式是对软件设计过程中反复出现的典型问题,总结出的可复用、经过验证的解决方案与设计思路,是软件开发的最佳实践。
它用于优化代码结构、降低耦合、提高可扩展性与可维护性,同时统一开发者之间的设计沟通语言。
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 《Design Patterns - Elements of Reusable Object-Oriented Software》的书,该书首次提到了软件开发中设计模式的概念。
设计模式通常分为三大类:
- 创建型模式:关注对象的创建与实例化过程
- 结构型模式:关注类或对象的组合与结构关系
- 行为型模式:关注对象间的交互、通信与职责分配
合理使用设计模式,能让系统更灵活、易扩展、易维护,是实现高质量软件设计的重要手段。
MVC设计模式
MVC 是一种软件架构设计模式,核心思想是职责分离,将一个应用划分为三个核心部分,以降低耦合、提高代码可维护性和扩展性。协作原理图如下:
-
Model(模型) 负责数据封装、业务逻辑处理和数据持久化,与视图和控制器无关,独立维护数据状态。
-
View(视图) 负责数据展示与用户界面渲染,只做显示,不处理业务逻辑。
-
Controller(控制器) 作为中间调度层,接收用户请求,调用模型处理数据,再选择视图进行响应。
- 用户通过视图发出请求
- 控制器接收并处理请求
- 控制器调用模型完成业务与数据操作
- 模型返回数据给控制器
- 控制器将数据交给视图渲染并展示给用户
- 职责清晰,视图与业务逻辑分离
- 代码耦合度低,便于维护、扩展和测试
- 支持前后端分工开发
- 便于界面灵活替换(同一套业务可适配多端展示)
JavaWeb与设计模式
Model1
Model1 是 Java Web 早期最基础的开发模式 = “JSP + JavaBean“。它没有 Servlet、没有 Controller,是最原始的两层结构,模式原理如下:
- JSP页面:显示 + 业务逻辑处理
- JavaBean:封装数据、简单业务
- 用户访问 JSP
- JSP 直接接收参数、调用 JavaBean
- JavaBean 处理数据/业务
- JSP 直接把结果渲染成页面返回
- 只有两层:JSP(视图+控制)+ JavaBean(模型)
- JSP 大包大揽:接收请求、处理逻辑、连接数据库、输出页面
- 没有控制器(Controller)
- 开发速度快、结构简单
- 适合小型项目
- 结构简单,上手快
- 小型项目开发效率极高
- 不需要复杂框架
- 适合学习 Java Web 入门
- 高耦合:JSP 里混写 HTML 和 Java 代码
- 难以维护:逻辑和页面搅在一起
- 难以分工:前端后端无法分开开发
- 无法复用业务逻辑
- 不适合大型项目
Model2
Model2 = Servlet + JSP + JavaBean,也就是标准 MVC 模式。其模式原理如下:
- Servlet:Controller 控制器
- JSP:View 视图
- JavaBean:Model 模型(数据 + 业务)
- 用户请求 → Servlet 接收
- Servlet 调用 JavaBean 处理业务、查数据库
- 数据封装好,Servlet 转发给 JSP
- JSP 只负责展示页面,返回给用户
- 职责清晰,低耦合
- 便于维护、便于扩展
- 前后端可以分工开发
- 适合中大型项目
- 便于复用业务逻辑
- 结构比 Model1 复杂
- 入门稍微麻烦一点
SMT架构
Spring MVC + MyBatis + Thymeleaf 是Java Web主流轻量级企业架构,基于Model2(MVC)模式,分工明确、低耦合,适用于中大型Web项目,核心分为视图层、控制层、业务层、持久层四层。架构组合原理如下:
-
Thymeleaf(视图层):替代JSP,负责页面渲染与数据展示,支持HTML原生语法和动态数据绑定,可实现前后端分离预览。
-
Spring MVC(控制层):接收用户请求、解析参数、调度业务逻辑,传递数据至视图层,控制请求流转。
-
Service(业务层):封装核心业务逻辑与事务管理,调用持久层完成数据操作,将结果返回控制器,实现逻辑复用解耦。
-
MyBatis(持久层):通过XML或注解配置SQL,实现数据库交互,将结果封装为Java实体类,供业务层调用。
-
数据库(DB):存储核心数据,接收MyBatis的SQL请求并返回数据。
-
用户发送HTTP请求,由Spring MVC前端控制器拦截并转发至对应Controller。
-
Controller解析请求参数,调用Service层对应业务方法。
-
Service层执行业务逻辑,调用MyBatis持久层接口发起数据操作。
-
MyBatis执行SQL并与数据库交互,将结果封装为实体类返回Service层。
-
Service层将处理后的数据返回Controller。
-
Controller将数据传递给Thymeleaf视图层进行渲染。
-
Thymeleaf生成HTML页面,响应给用户,完成请求-响应流程。
-
职责分离:各层独立,降低耦合,便于维护扩展。
-
开发高效:MyBatis简化数据库操作,Thymeleaf支持静态预览,Spring MVC简化请求处理。
-
兼容性强:适配主流Web服务器与数据库,可无缝集成Spring生态。
-
分工便捷:支持前后端分离协作,提升开发效率。
不同构架对比
| Model1 | Model2 | SMT | |
|---|---|---|---|
| 结构 | JSP + JavaBean | Servlet + JSP + JavaBean | SpringMVC + Service + MyBatis + Thymeleaf |
| 控制层 | 无,JSP 兼任控制器 | Servlet 作为控制器 | SpringMVC 控制器 |
| 视图层 | JSP | JSP | Thymeleaf |
| 持久层 | JDBC/简单封装 | JavaBean 封装 | MyBatis 专业持久层 |
| 业务层 | 无 | 简单业务逻辑 | 独立 Service 层 + 事务 |
| 耦合度 | 高,代码混乱 | 中等,职责分离 | 低,分层清晰 |
| 可维护性 | 差 | 较好 | 优秀 |
| 适用场景 | 入门、小Demo | 学习MVC、小型项目 | 企业级、中大型项目 |
| 核心思想 | 简易开发 | MVC 职责分离 | 分层架构 + 生态整合 |
总结
- Model1:JSP 一把抓,简单但混乱,适合入门。
- Model2:MVC 基础实现,Servlet 控制、JSP 展示、JavaBean 处理数据。
- SMT:现代化企业级架构,分层更细、功能更强、易于维护和扩展。