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 类(如 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)
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)
欢迎你,${user.username}
面试高频问题
Q1:MVC 和三层架构的区别是什么?
A:MVC 是一种设计模式,强调的是 用户交互流程;而三层架构是从 系统架构角度 划分的层次结构,两者结合后形成完整的 Web 应用结构。
Q2:为什么要在项目中使用 MVC?
A:为了实现 前后端分离、逻辑清晰、易于维护、提高开发效率。各层分工明确,便于多人协作开发。
Q3:Servlet 在 MVC 中属于哪一层?JSP 呢?
A:
Servlet 属于 Controller 层,用于接收请求和控制流程;JSP 属于 View 层,用于展示数据和页面渲染。
Q4:如果不用 MVC,会有什么问题?
A:会出现大量业务逻辑混杂在 JSP 页面中,导致代码难以维护、不易测试、安全性差等问题。
Q5:如何保证各层之间的低耦合?
A:通过接口编程、依赖注入等方式,使各层之间仅依赖接口而非具体实现类。