MVC架构 考试重点
经典架构模式
模型-视图-控制器:分离数据、表现与控制流程,是 Web 开发的主流架构。
结构示意
flowchart LR
U[用户] --> C[Controller]
C --> M[Model]
C --> V[View]
M --> V
V --> U
知识说明
MVC 把交互式软件拆成三类对象:Model 负责状态与业务;View 负责展示;Controller 接收输入并协调 Model 与 View。
在 Web 中:浏览器请求进入 Controller,Controller 更新 Model,再选择 View 渲染。目标是改界面不伤业务、改业务不绑死某种页面。
注意:MVC 不是「只有三层包名」,关键是职责分离与单向协作,避免 JSP 里堆业务、Servlet 里堆 SQL。
特点
- 关注点分离
- Controller 协调输入
- Model 与 View 相对独立
- 便于并行开发
优点
- 界面与业务解耦
- 可替换视图
- 便于测试 Model
- 团队可按角色分工
局限
- 小型页面可能显得重
- Controller 容易变成巨型类
- 初学者容易把业务写进 View
适用
Spring MVC / ASP.NET MVC 桌面 GUI 部分移动应用
例子展示 —— 成绩查询:Spring 风格 MVC
问题
查询成绩时如果 Servlet 既取参、又查库、又拼 HTML,换一种展示方式(JSON/导出 Excel)就要复制一整段逻辑。
做法
Controller 只解析学号并调用服务;Model/Service 返回成绩数据;View(模板或 JSON 序列化)负责呈现。同一 Model 可服务网页与接口。
sequenceDiagram
participant U as 浏览器
participant C as ScoreController
participant M as ScoreService
participant V as score-list.jsp
U->>C: GET /score?sid=1
C->>M: findByStudent
M-->>C: scores
C->>V: 渲染
V-->>U: HTML
public class ScoreController {
private final ScoreService service = new ScoreService();
public String query(HttpServletRequest req) {
String sid = req.getParameter("sid");
req.setAttribute("scores", service.findByStudent(sid));
return "/score-list.jsp"; // View 名
}
}
public class ScoreService {
public List<Score> findByStudent(String sid) { /* 查库/规则 */ return java.util.Collections.emptyList(); }
}
class ScoreController:
def __init__(self, service):
self.service = service
def query(self, sid):
return {"scores": self.service.find_by_student(sid)}