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)}