编程自学指南:java程序设计开发,MVC 设计模式基础知识,MVC 模式的核心思想:职责分离,MVC 模式重构 Servlet/JSP 项目

编程自学指南:java程序设计开发,MVC 设计模式基础知识课件

一、课程信息

学习目标

  1. 理解 MVC 模式的核心思想:职责分离
  2. 掌握 MVC 三组件(Model-View-Controller)的协作流程
  3. 能使用 MVC 模式重构 Servlet/JSP 项目
  4. 理解 MVC 与 JavaWeb 技术栈的关系

二、课程导入:生活中的 MVC

🌰 餐厅模型类比

角色MVC 组件对应技术职责描述
顾客ViewJSP/HTML展示菜单、提交订单
服务员ControllerServlet接收订单、协调厨房与顾客
厨师ModelJava 业务类烹饪食物(处理数据)

三、MVC 核心概念

🔍 1. 模式定义

MVC(Model-View-Controller) 是一种软件架构模式,通过将程序分为三个核心组件,实现关注点分离

  • Model(模型):处理数据与业务逻辑
  • View(视图):负责用户界面展示
  • Controller(控制器):接收输入、协调 Model 与 View

🔍 2. 组件关系图

graph TD
    User -->|请求| Controller
    Controller -->|调用| Model
    Model -->|返回数据| Controller
    Controller -->|选择视图| View
    View -->|展示| User

四、MVC 与 JavaWeb 技术映射

MVC 组件JavaWeb 技术典型实现方式
ModelJava 类(POJO/Service/DAO)处理数据库操作、业务逻辑
ViewJSP/HTML/Thymeleaf渲染页面(EL+JSTL)
ControllerServlet/Filter接收请求、转发数据

五、实战案例:学生管理系统

🔥 1. 项目结构

src/
├─ controller/
│  └─ StudentServlet.java   # 控制器
├─ model/
│  ├─ Student.java         # 实体类
│  └─ StudentService.java  # 业务逻辑
└─ view/
   ├─ list.jsp            # 列表页
   └─ add.jsp             # 添加页

🔥 2. Model 层开发

实体类(Student.java)
public class Student {
    private int id;
    private String name;
    private int age;
    // getter/setter 省略
}
业务逻辑(StudentService.java)
import java.util.ArrayList;
import java.util.List;

public class StudentService {
    private static List<Student> students = new ArrayList<>();

    static { // 初始化数据
        students.add(new Student(1, "张三", 20));
        students.add(new Student(2, "李四", 21));
    }

    public List<Student> getAllStudents() {
        return students;
    }

    public void addStudent(Student student) {
        students.add(student);
    }
}

🔥 3. Controller 层开发(StudentServlet.java)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/student")
public class StudentServlet extends HttpServlet {
    private StudentService service = new StudentService();

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        String action = req.getParameter("action");
        
        if ("list".equals(action)) {
            listStudents(req, resp);
        } else if ("add".equals(action)) {
            showAddForm(req, resp);
        }
    }

    private void listStudents(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        List<Student> studentList = service.getAllStudents();
        req.setAttribute("students", studentList);
        req.getRequestDispatcher("/view/list.jsp").forward(req, resp);
    }

    private void showAddForm(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        req.getRequestDispatcher("/view/add.jsp").forward(req, resp);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        String name = req.getParameter("name");
        int age = Integer.parseInt(req.getParameter("age"));
        service.addStudent(new Student(students.size()+1, name, age));
        resp.sendRedirect("/student?action=list");
    }
}

🔥 4. View 层开发

列表页(list.jsp)
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<h1>学生列表</h1>
<a href="/student?action=add">添加学生</a>

<table border="1">
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <c:forEach items="${students}" var="s">
        <tr>
            <td>${s.id}</td>
            <td>${s.name}</td>
            <td>${s.age}</td>
        </tr>
    </c:forEach>
</table>
添加页(add.jsp)
<%@ page contentType="text/html;charset=UTF-8" %>

<h1>添加学生</h1>
<form action="/student" method="post">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="number" name="age"><br>
    <input type="submit" value="提交">
</form>

六、MVC 流程解析

🔄 1. 请求处理流程

  1. 用户访问 http://localhost:8080/student?action=list
  2. StudentServlet 接收请求(Controller
  3. 调用 StudentService 获取数据(Model
  4. 将数据存入 request 作用域
  5. 转发到 list.jsp 显示(View

🔄 2. 数据提交流程

  1. 用户在 add.jsp 提交表单(View
  2. StudentServlet 接收 POST 请求(Controller
  3. 调用 StudentService 添加数据(Model
  4. 重定向到列表页(避免重复提交)

七、关联知识:MVC 与其他技术

🔗 1. 与 Servlet 的关系

  • Servlet作为 Controller:处理请求分发、参数解析
  • 缺点:传统 Servlet 混合了控制逻辑与视图渲染

🔗 2. 与JSP 的关系

  • JSP 作为 View:通过 EL+JSTL 展示数据
  • 最佳实践:JSP 只做数据展示,不包含业务逻辑

🔗 3. 与 Filter的协作

@WebFilter(urlPatterns = "/*")
public class AuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, 
                        FilterChain chain) throws IOException, ServletException {
        // 在 Controller 执行前验证权限
        if (isLogin(req)) {
            chain.doFilter(req, res);
        } else {
            ((HttpServletResponse)res).sendRedirect("/login.jsp");
        }
    }
}

八、课堂练习

练习 1:添加删除功能

任务

  1. 在 StudentServlet 中添加 delete 方法
  2. 在 list.jsp 中为每个学生添加 “删除” 链接
  3. 实现删除后刷新列表

练习 2:错误处理优化

任务

  1. 当添加年龄为负数时,在 add.jsp 显示错误信息
  2. 使用 request 作用域传递错误消息

九、课程总结

知识图谱:

MVC 模式  
   ↳ 核心原则:关注点分离(SoC)  
   ↳ 组件职责:  
      ✅ Model:数据与业务(Java 类)  
      ✅ View:界面展示(JSP/HTML)  
      ✅ Controller:请求调度(Servlet)  
   ↳ 优势:可维护性↑、可扩展性↑、团队协作效率↑  

口诀记忆:

“MVC 模式分三层,模型视图控制器,
业务逻辑归模型,界面展示看视图,
控制器来做调度,请求响应不糊涂!”

十、课后作业

必做 1:用户管理系统

要求

  1. 实现用户的登录、注册、列表展示
  2. 严格遵循 MVC 分层
  3. 使用 Filter 实现登录状态验证

必做 2:MVC 与 RESTful 结合

任务

  1. 修改 StudentServlet 支持 RESTful 风格
    • GET /students :获取列表
    • POST /students :添加学生
    • DELETE /students/{id} :删除学生
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zl515035644

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值