MVC三层架构
- MVC 是什么?
- 三层架构的组成(View、Controller、Model)
- 各层职责划分
- 示例说明
- 面试高频问题与参考答案
MVC(Model-View-Controller)是一种经典的软件设计模式,广泛应用于 Web 应用开发中,尤其是 Java Web(Servlet + JSP)、Spring MVC 等框架。
什么是 MVC?
MVC 全称是 Model-View-Controller,它将应用程序分为三个核心部分:
层级 | 英文名 | 中文名 | 职责 |
---|---|---|---|
M | Model | 模型 | 处理数据、业务逻辑 |
V | View | 视图 | 用户界面(如 HTML 页面) |
C | Controller | 控制器 | 接收请求,调用模型,返回视图 |
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 类(如
UserService
、OrderService
) - 作用:
- 处理具体的业务规则(如登录验证、订单计算)
- 调用 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 Request
v
+----------+----------+
| 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:通过接口编程、依赖注入等方式,使各层之间仅依赖接口而非具体实现类。