【JavaWeb】MVC三层架构

MVC三层架构

  • MVC 是什么?
  • 三层架构的组成(View、Controller、Model)
  • 各层职责划分
  • 示例说明
  • 面试高频问题与参考答案

MVC(Model-View-Controller)是一种经典的软件设计模式,广泛应用于 Web 应用开发中,尤其是 Java Web(Servlet + JSP)、Spring MVC 等框架。


什么是 MVC?

MVC 全称是 Model-View-Controller,它将应用程序分为三个核心部分:

层级英文名中文名职责
MModel模型处理数据、业务逻辑
VView视图用户界面(如 HTML 页面)
CController控制器接收请求,调用模型,返回视图

MVC 在 Java Web 中的三层架构详解

在实际开发中,我们通常把 MVC 扩展为 三层架构(3-tier architecture),分别是:

表现层(View / UI Layer)

  • 技术实现:JSP、HTML、CSS、JavaScript
  • 作用
    • 展示数据给用户
    • 接收用户输入
    • 不处理复杂逻辑,只负责展示和跳转

控制层(Controller Layer)

  • 技术实现:Servlet、Spring MVC 的 @Controller@RestController
  • 作用
    • 接收用户的 HTTP 请求
    • 调用 Service 层处理业务逻辑
    • 根据结果选择跳转的页面(Forward/Redirect)

示例代码(Servlet):

@WebServlet("/login")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");UserService userService = new UserService();User user = userService.login(username, password);if (user != null) {request.setAttribute("user", user);request.getRequestDispatcher("welcome.jsp").forward(request, response);} else {response.sendRedirect("login.jsp");}}
}

业务逻辑层(Service Layer)

  • 技术实现:Java 类(如 UserServiceOrderService
  • 作用
    • 处理具体的业务规则(如登录验证、订单计算)
    • 调用 DAO 层获取或保存数据

示例代码:

public class UserService {private UserDao userDao = new UserDao();public User login(String username, String password) {return userDao.findByUsernameAndPassword(username, password);}
}

数据访问层(DAO Layer / Persistence Layer)

  • 技术实现:Java 类(如 UserDao),配合 JDBC、MyBatis、Hibernate 等
  • 作用
    • 与数据库交互(增删改查)
    • 封装底层 SQL 操作

示例代码:

public class UserDao {public User findByUsernameAndPassword(String username, String password) {// 连接数据库查询// 返回 User 对象}
}

MVC 分层结构

+---------------------+
|       Browser       |
+----------+----------+|| HTTP Requestv
+----------+----------+
|     Controller      | ←→ 调用 Service 层
+----------+----------+|| 调用 DAO 层v
+----------+----------+
|       Service       |
+----------+----------+|| 操作数据库v
+----------+----------+
|         DAO         |
+----------+----------+|| 数据库操作v
+----------+----------+
|       Database      |
+---------------------+

MVC 的优势

优点说明
分工明确各层职责清晰,便于团队协作
易于维护修改某一层不影响其他层
可扩展性强可以替换某一层而不影响整体架构
降低耦合各层之间通过接口通信,松耦合设计
提高复用性Service 层可被多个 Controller 复用

简单案例演示

场景:用户登录功能

View(login.jsp)
<form action="login" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录">
</form>
Controller(LoginServlet)
@WebServlet("/login")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");UserService userService = new UserService();User user = userService.login(username, password);if (user != null) {request.setAttribute("user", user);request.getRequestDispatcher("welcome.jsp").forward(request, response);} else {response.sendRedirect("login.jsp");}}
}
Service(UserService.java)
public class UserService {private UserDao userDao = new UserDao();public User login(String username, String password) {return userDao.findByUsernameAndPassword(username, password);}
}
DAO(UserDao.java)
public class UserDao {public User findByUsernameAndPassword(String username, String password) {// 查询数据库并封装成 User 对象return user;}
}
View(welcome.jsp)
<h1>欢迎你,${user.username}</h1>

面试高频问题

Q1:MVC 和三层架构的区别是什么?

A:MVC 是一种设计模式,强调的是 用户交互流程;而三层架构是从 系统架构角度 划分的层次结构,两者结合后形成完整的 Web 应用结构。


Q2:为什么要在项目中使用 MVC?

A:为了实现 前后端分离、逻辑清晰、易于维护、提高开发效率。各层分工明确,便于多人协作开发。


Q3:Servlet 在 MVC 中属于哪一层?JSP 呢?

A:

  • Servlet 属于 Controller 层,用于接收请求和控制流程;
  • JSP 属于 View 层,用于展示数据和页面渲染。

Q4:如果不用 MVC,会有什么问题?

A:会出现大量业务逻辑混杂在 JSP 页面中,导致代码难以维护、不易测试、安全性差等问题。


Q5:如何保证各层之间的低耦合?

A:通过接口编程、依赖注入等方式,使各层之间仅依赖接口而非具体实现类。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式分析利器:DuckDB与SqlSugar实战

​ 一、DuckDB 的核心特性与适用场景 DuckDB 是一款 嵌入式分析型数据库&#xff08;OLAP&#xff09; &#xff0c;专为高效查询设计&#xff0c;主要特点包括&#xff1a; 列式存储与向量化引擎 数据按列存储&#xff0c;提升聚合统计效率&#xff08;如 SUM/AVG&#xf…

React---day6、7

6、组件之间进行数据传递 **6.1 父传子&#xff1a;**props传递属性 父组件&#xff1a; <div><ChildCpn name"蒋乙菥" age"18" height"1,88" /> </div>子组件&#xff1a; export class ChildCpn extends React.Component…

Windows上用FFmpeg采集摄像头推流 → MediaMTX服务器转发流 → WSL2上拉流播放

1. Windows上 FFmpeg 推流&#xff08;摄像头采集&#xff09; 设备名称可用 ffmpeg -list_devices true -f dshow -i dummy 查询&#xff0c;假设为Integrated Camera 采集推流示例&#xff08;推RTMP到MediaMTX&#xff09;&#xff1a; ffmpeg -rtbufsize 100M -f dshow …

SpringBoot1--简单体验

1 Helloworld 打开&#xff1a;https://start.spring.io/ 选择maven配置。增加SpringWeb的依赖。 Generate之后解压&#xff0c;代码大致如下&#xff1a; hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

MATLAB 中调整超参数的系统性方法

在深度学习中&#xff0c;超参数调整是提升模型性能的关键环节。以下是 MATLAB 中调整超参数的系统性方法&#xff0c;涵盖核心参数、优化策略及实战案例&#xff1a; 一、关键超参数及其影响 超参数作用典型范围学习率 (Learning Rate)控制参数更新步长&#xff0c;影响收敛…

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…

(二)stm32使用4g模块(移远ec800k)连接mqtt

下面代码是随手写的&#xff0c;没有严谨测试仅供参考测试 uint8_t msgBuf[200]{"msg from mcu"}; uint8_t txBuf[250]{0}; uint16_t msgid0; uint16_t mqttTaskState0; uint16_t t100msCount0; uint8_t sendFlag10; uint8_t sendFlag20; void t100msTask1(void) { …

哈希表入门:用 C 语言实现简单哈希表(开放寻址法解决冲突)

目录 一、引言 二、代码结构与核心概念解析 1. 数据结构定义 2. 初始化函数 initList 3. 哈希函数 hash 4. 插入函数 put&#xff08;核心逻辑&#xff09; 开放寻址法详解&#xff1a; 三、主函数验证与运行结果 1. 测试逻辑 2. 运行结果分析 四、完整代码 五、优…

Windows下运行Redis并设置为开机自启的服务

下载Redis-Windows 点击redis-windows-7.4.0下载链接下载Redis 解压之后得到如下文件 右键install_redis.cmd文件&#xff0c;选择在记事本中编辑。 将这里改为redis.windows.conf后保存&#xff0c;退出记事本&#xff0c;右键后选择以管理员身份运行。 在任务管理器中能够…

2025年ESWA SCI1区TOP,改进成吉思汗鲨鱼算法MGKSO+肝癌疾病预测,深度解析+性能实测

目录 1.摘要2.成吉思汗鲨鱼优化算法GKSO原理3.MGKSO4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流 1.摘要 本文针对肝癌&#xff08;HCC&#xff09;早期诊断难题&#xff0c;提出了一种基于改进成吉思汗鲨鱼优化算法&#xff08;MGKSO&#xff09;的计算机辅助诊…

李沐-动手学深度学习:RNN

1.RNN从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l#8.3.4节 #batch_size&#xff1a;每个小批量中子序列样本的数目&#xff0c;num_steps&#xff1a;每个子序列中预定义的时间步数 #loa…

【C++ Qt】多元素控件(ListWidget、TableWidget、TreeWidget)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将通过代码示例详细介绍了Qt中QListWidget、QTableWidget和QTreeWidget三种多元素控件的使用方法与核心功能&#xff0c;涵盖列表的增删操作、表格…

基于TI DSP控制的光伏逆变器最大功率跟踪mppt

基于TI DSP&#xff08;如TMS320F28335&#xff09;控制的光伏逆变器最大功率跟踪&#xff08;MPPT&#xff09;程序通常涉及以下几个关键部分&#xff1a;硬件电路设计、MPPT算法实现、以及DSP的编程。以下是基于TI DSP的光伏逆变器MPPT程序的一个示例&#xff0c;主要采用扰动…

Python实现P-PSO优化算法优化卷积神经网络CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能和深度学习技术的快速发展&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测…

计算机视觉入门:OpenCV与YOLO目标检测

计算机视觉入门&#xff1a;OpenCV与YOLO目标检测 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 计算机视觉入门&#xff1a;OpenCV与YOLO目标检测摘要引言技术原理对比1. OpenCV&#xff1a;传统图像处理与机器学…

【PCB工艺】绘制原理图 + PCB设计大纲:最小核心板STM32F103ZET6

绘制原理图和PCB布线之间的联系,在绘制原理图的时候,考虑到后续的PCB设计+嵌入式软件代码的业务逻辑,需要在绘制原理图之初涉及到 硬件设计流程的前期规划。在嵌入式系统开发中,原理图设计是整个项目的基础,直接影响到后续的: PCB 布线效率和质量 ☆☆☆重点嵌入式软件的…

Centos系统搭建主备DNS服务

目录 一、主DNS服务器配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建正向区域文件 4.创建区域数据文件 5.检查配置语法并重启服务 二、从DNS服务配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建缓存目录 4.启动并设置开机自启 一、主DNS服务器配置 1.安装 BIN…

LeetCode[513]找树左下角的值

思路&#xff1a; 找树左下角的值&#xff0c;有可能这个值不是左叶子节点&#xff0c;可能是右叶子节点&#xff0c;但怎么说这个值都是叶子节点&#xff0c;首先这道题用层序遍历的思路比如什么队列和BSF的递归都可以做&#xff0c;但我比较喜欢用纯递归来搞&#xff0c;因为…

ubuntu20.04.5--arm64版上使用node集成java

ubuntu20.04.5arm上使用node集成java #ssh&#xff0c;可选 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墙相关&#xff0c;可选 sudo ufw allow ssh sudo ufw allow 22…

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…