Spring Web MVC入门(6)
应用分层
在开发的过程中, 我们会发现, 程序的代码有时会很"杂乱", 如果后面的项目更大了, 那就会更加地杂乱无章(文件乱, 代码内容乱).
也基于此, 接下来让我们来学习一下应用分层.
也类似于公司的组织架构
公司初创阶段, 一个人身兼数职, 既做财务, 又做人事,还有行政.
随着公司的逐渐壮大, 会把岗位进行细分, 划分为财务部门, 人事部门, 行政部门等.各个部门内部还会再进行划分.
项目开发也是类似, 最开始功能简单时, 我们会放在前后端一起开发. 随着项目功能的复杂, 我们分为前端和后端不同的团队, 甚至更细粒度的团队. 后端开发也会根据功能再进行细分. MVC就是其中的一种拆分方式.
但是随着后端人员不再涉及前端, 后端开发又有了新的分层方式.
介绍
在阿里开发手册中, 关于工程结构部分, 定义了常见工程的应用分层结构:

那什么是应用分层呢?
应用分层是一种软件开发设计思想, 它将应用程序分成N个层次, 这N个层次分别负责各自的职责, 多个层次之间协同提供完整的功能. 根据项目的复杂度, 把项目分成三层, 四层或者更多层.
常见的MVC设计模式, 就是应用分层的一种具体体现.
为什么需要应用分层?
在最开始的时候, 为了让项目快速上线, 我们是通常不考虑分层的. 但是随着业务越来越复杂, 大量的代码混在一起, 会出现逻辑不清晰, 各模块相互依赖, 代码扩展性差, 改动一处就会让全身出现问题. 所以学习项目分层就是程序员的必修课了.如何分层(三层架构)?
我们知道, MVC就是把整体的系统分成了Model(模型), View(视图) 和Controller(控制器)三个层次, 也就是将用户视图和业务处理隔离开, 并通过控制器连接起来, 很好地实现逻辑与表现的解耦, 是一种标准的软件分层架构.
目前现在更主流的开发方式是"前后端分离"的模式, 后端开发工程师不再关注前端的实现, 所以对于Java后端开发者, 又有了一种新的分层架构: 把整体架构分为表现层, 业务逻辑层和数据层. 这种分层方式也称为"三层架构".
1.表现层: 就是展示数据结果和接收用户指令的, 是最靠近用户的一层;
2.业务逻辑层: 负责处理业务逻辑, 里面有复杂业务的具体实现;
3.数据层: 负责存储和整理与应用程序相关的数据.
按照上面的层次划分, Spring MVC站在后端人员的角度上, 也进行了支持, 把上面的代码划分为三个部分:
请求处理, 响应数据: 负责, 接收页面的请求, 给页面响应数据.
逻辑处理: 负责业务逻辑处理的代码.
数据访问: 负责业务数据的维护操作, 包括增, 删, 查, 改等操作.

Controller:控制层. 接收前端发送的请求, 对请求进行处理, 并响应数据.
Service:业务逻辑层. 处理具体的业务逻辑.
Dao:数据访问层, 也称为持久层. 负责数据的访问操作, 包括增删查改.
MVC和三层架构的区别和联系
在它们的联系上, 众说风云, 能够自己说出自己的观点即可.
从概念上来讲, 它们都是软件工程领域中的架构模式.
MVC三层架构模式由三部分组成, 分别是: 模型, 视图, 控制器.
三层架构将业务应用划分为: 表现层, 业务逻辑层, 数据访问层.
MVC中, 视图和控制器合起来对应三层架构中的表现层. 模型对应三层架构中的业务逻辑层, 数据层以及实体类.
两者实际上是从不同角度上对软件工程进行了抽象.
MVC模式强调数据和视图的分离,将数据展示和数据处理分隔开, 通过控制器对两者进行组合.
三层架构强调的是不同维度数据处理的高内聚和低耦合,将交互界面, 业务处理和数据库操作的逻辑分开.
两者共同的目的都是: "解耦, 分层, 代码复用".
软件设计的原则:高内聚低耦合
高内聚指的是: 一个模块中各个元素之间联系的紧密程度, 如果各个元素(语句,程序段)之间的联系程度越高, 则内聚性越高, 即"高内聚".
低耦合指的是: 软件中各个层, 模块之间的依赖关联程序越小越好. 修改一处代码, 其它模块的代码改动越少越好.
高内聚和低耦合矛盾吗?
不矛盾, 高内聚指的是一个模块中各个元素之间的紧密程度, 低耦合指的是不同模块之间的紧密程度.
这就好比一个企业, 包含很多部门, 各个部门之间的关联关系要尽可能的小, 一个部门发生问题,要尽可能对降低的其它部门减小影响, 就是耦合. 但是部门内部员工关系要尽可能紧密, 遇到问题一起解决, 克服, 这叫做内聚.
应用分层的好处
降低层与层之间的依赖, 结构更加的明确, 利于各层逻辑的复用.
开发人员可以只关注整个结构中的其中的某一层, 极大地降低了维护成本和维护时间.
可以很容易的用新的实现替换原有层次的体现
有利于标准化.
大总结
1.学习Spring MVC, 其实就是学习各种Web开发需要用到的注解.
(1)@RequestMapping: 路由映射
(2)@RequestParam: 后端参数重命名
(3)@RequestBody: 接收JSON类型的参数
(4)@PathVariable: 接收路径参数
(5)@RequestPart:上传文件
(6)@ResponseBody: 返回数据
(7)@CookieValue: 从Cookie中获取值
(8)@SesssionAttribute: 从Session中获取值
(9)@RequestHeader: 从Header中获取值
(10)@Controller: 定义一个控制器, Spring框架启动时加载, 把这个对象交给Spring管理.默认返回视图
(11)@RestController: @RequestBody + @Controller 返回数据.
2.Cookie和Session都是会话机制, Cookie是客户端机制, Session是服务端机制. 两者通过SessionId来关联. Spring MVC内置HttpServletRequest, HttpServletResponse两个对象.需要使用时, 直接在方法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中获取, 也可以直接使用HttpServletResponse设置Http响应状态码.
3.JavaEE学习阶段会涉及到较多的工具,插件的学习.
相关文章:
Spring Web MVC入门(6)
应用分层 在开发的过程中, 我们会发现, 程序的代码有时会很"杂乱", 如果后面的项目更大了, 那就会更加地杂乱无章(文件乱, 代码内容乱). 也基于此, 接下来让我们来学习一下应用分层. 也类似于公司的组织架构 公司初创阶段, 一个人身兼数职, 既做财务, 又做人事,还有…...
muduo异步日志
muduo异步日志实现 陈硕老师的muduo网络库的异步日志的实现,今晚有点晚了,我明晚再把这个异步日志抽出来,作为一个独立的日志库。 所在文件 AsyncLogging.cc AsyncLogging.h LogFile.h LogFile.cc CountDownLatch.h CountDownLatch.cc…...
在智慧能源的发展历程中,哪些技术的出现起到了关键性的作用?
智慧能源作为一种全新的能源发展理念,正逐渐成为能源领域的热门话题。在智慧能源的发展历程中,有许多技术的出现起到了关键性的作用,推动了智慧能源的快速发展。 一、物联网技术 物联网技术使得能源设备可以实现互联互通,通过传感…...
SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)
返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(十二) 下一篇: 待续 51、sqlite3_stmt_scanstatus_reset sqlite3_stmt_scanstatus_reset 函数用于重置指定语句对象最近一次执行的 WHER…...
扫雷(蓝桥杯,acwing)
题目描述: 扫雷是一种计算机游戏,在 2020 世纪 80 年代开始流行,并且仍然包含在某些版本的 Microsoft Windows 操作系统中。 在这个问题中,你正在一个矩形网格上玩扫雷游戏。 最初网格内的所有单元格都呈未打开状态。 其中 M个…...
macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
如果你通过 sudo port install 命令正常安装了 MySQL,再通过 sudo port load 命令启动了 MySQL Server,此刻却发现使用 Navicat 之类的 GUI 软件无法连接,始终返回无法连接到 127.0.0.1 服务器。这是一个小坑,因为他默认使用了 So…...
Semi-supervised Open-World Object Detection
Semi-supervised Open-World Object Detection 摘要1 介绍2.准备工作提出的SS-OWOD问题设置2.1 基础架构3 方法3.1整体架构摘要 传统的开放世界对象检测(OWOD)问题设置首先区分已知和未知类别,然后在后续任务中引入标签时逐步学习未知对象。然而,当前的OWOD公式在增量学习…...
C语言实现射击小游戏
以下是一个简单的C语言射击小游戏的实现示例。这个游戏中,玩家控制一个飞船,敌方飞船会随机出现并向玩家移动。如果玩家的飞船与敌方飞船相撞,玩家就失去一条生命,代码如下: #include <stdio.h> #include <s…...
c++11 标准模板(STL)本地化库 - std::islower(std::locale) 检查字符是否被本地环境分类为小写
本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 检查字符是否被本地环境分类为小写 std::islower(std::locale) template&…...
粘度指数改进剂市场需求增长 为润滑油添加剂细分产品
粘度指数改进剂市场需求增长 为润滑油添加剂细分产品 粘度指数改进剂是一种油溶性高分子聚合物,主要用于提高润滑油粘度以及粘度指数。粘度指数改进剂具有稠化能力强、抗磨性好、热稳定性好等优势,可添加于液压油、内燃机油以及齿轮油等油品中。 …...
LabVIEW柴油机安保监控系统
LabVIEW柴油机安保监控系统 随着航运业的快速发展,确保船舶柴油机的安全稳定运行变得尤为重要。船舶柴油机故障不仅会导致重大的经济损失,还可能危及人员安全和环境。设计并开发了一套基于LabVIEW平台的柴油机安保监控系统,旨在通过实时监控…...
实测国内AI大模型问答效果
随着ChatGPT热度的攀升,越来越多的公司也相继推出了自己的AI大模型。按照github工程awesome-LLMs-In-China所列举的,现如今国内AI大模型已达243个,比较著名的有文心一言、通义千问等。各大应用也开始内置AI玩法,如抖音的AI特效。下…...
不得不等待的无奈 -《葡萄成熟时》
恋上一个人便是撒下一颗葡萄种子,你可能会坚持,但不一定会结果,收获(在一起)。 更有可能得到的是枯枝烂叶(ta的离开)。 就算你再努力,再用心去栽培(为ta付出࿰…...
【Python】Python中装饰器和魔法方法的区别
在Python中,装饰器(Decorators)和魔法方法(Magic Methods)是两种不同的高级特性,分别服务于不同的目的。 装饰器 (Decorators) 装饰器是一种强大的工具,它可以修改或增强函数、方法或类的行为…...
【React】创建你的第一个React组件
要使用React创建你的第一个组件,首先确保你已经安装了Node.js和npm(Node包管理器)。然后,你可以通过npm安装Create React App这个官方支持的脚手架工具来快速生成一个新的React应用项目,该项目包含了React、ReactDOM、…...
五分钟搞懂MySQL索引下推
什么是索引下推 索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。 索引下推优化的原理 我们先简单了解一下MySQL大概的架构: MySQL服务层负责SQL语法解析、…...
【数据库】SQL如何添加数据
在SQL中,您可以使用INSERT INTO语句来添加数据到数据库表中。以下是一些基本的示例和解释: 1.插入完整行数据: 如果您想为表中的每一列都插入数据,那么可以不必指定列名。但是,您需要为每一列都提供数据,并…...
ClickHouse01-什么是ClickHouse
什么是ClickHouse? 关于发展历史存在的优势与劣势什么是它风靡的原因? 什么是ClickHouse? 官方给出的回答是,它是一个高性能、列式存储、基于SQL、供在线分析处理的数据库管理系统 当然这边不得不提到OLAP(Online Analytical Pr…...
使用Docker搭建Nascab
使用Docker来部署Nascab能够让这个过程变得更加灵活和便捷,因为Docker可以在隔离的环境中运行应用程序,简化了部署和配置的复杂性。 使用Docker CLI部署Nascab docker run -d \ --name nascab \ -p 18080:80 \ -p 18443:443 \ -p 18090:90 \ -p 18021:…...
Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改
前言 并发控制,一般有两种方案,悲观锁和乐观锁,其中悲观锁是默认每次更新操作肯定会冲突,所以每次操作都要先获取锁,操作完毕再释放锁,适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...


