一、什么是 MVCMVC 是一种软件设计模式把一个 Web 应用分成三个核心组件组件全称职责在 Java Web 中用什么实现MModel模型负责数据和业务逻辑比如读取数据库、计算、验证JavaBean / DAO / Service 类VView视图负责展示数据生成 HTML呈现给用户JSP / HTML / ThymeleafCController控制器负责接收请求、调用模型、选择视图Servlet / Spring MVC Controller二、生活类比餐厅点餐Model模型后厨的食材和菜谱真正的“数据”和“怎么做”。View视图服务员递给客人的菜单展示给用户看的样子。Controller控制器前台服务员客人点菜 → 服务员去后厨告诉厨师 → 做完了再端给客人。流程客人浏览器看菜单View。客人告诉服务员Controller要什么菜。服务员去后厨Model通知厨师做菜。厨师按菜谱业务逻辑做好。服务员把菜端给客人Controller 把数据给 View 展示。三、没有 MVC 会怎样你已经见过的反例反例1所有代码都写在 Servlet 里Java // Servlet 里既有业务逻辑又有 HTML 拼接 String name request.getParameter(name); User user userDAO.findByName(name); // 业务逻辑 PrintWriter out response.getWriter(); out.println(htmlbody); out.println(欢迎 user.getName()); // 页面输出 out.println(/body/html);问题改了数据库查询逻辑要改 Servlet改了页面样式也要改 Servlet。高耦合无法分工。反例2所有代码都写在 JSP 里jsp % String name request.getParameter(name); User user userDAO.findByName(name); // 在 JSP 里查数据库 % html...欢迎% user.getName() %.../html问题JSP 本应只管显示结果却混入了业务逻辑和数据库操作。页面设计师没法改Java 程序员维护起来也痛苦。四、MVC 的清晰分工正例假设我们要做一个“显示用户信息”的功能。1. Model模型只负责数据和业务逻辑java // User.java数据载体 public class User { private String name; private int age; // getter/setter } // UserService.java业务逻辑 public class UserService { public User findUser(String id) { // 去数据库查询返回 User 对象 } }2. View视图只负责展示user.jspjsp html body h1用户信息/h1 p姓名${user.name}/p p年龄${user.age}/p /body /html只有 HTML 和 EL 表达式没有任何 Java 业务代码3. Controller控制器负责接收请求、调用 Model、选择 Viewjava WebServlet(/user) public class UserServlet extends HttpServlet { protected void doGet(...) { String id request.getParameter(id); UserService service new UserService(); User user service.findUser(id); // 调用 Model request.setAttribute(user, user); // 存数据 request.getRequestDispatcher(/user.jsp).forward(request, response); // 去 View } }完整请求流程浏览器请求/user?id100ControllerUserServlet接收请求调用 ModelUserService获取数据。Controller 把数据放进 request然后转发给 Viewuser.jsp。View 使用 EL 展示数据生成 HTML。响应返回浏览器。五、MVC 的好处为什么你要学它好处说明分离关注点业务逻辑Model、页面展示View、请求处理Controller各管各的互不影响易于维护改数据库逻辑只改 Model改页面样式只改 View改 URL 路由只改 Controller团队协作后端工程师写 Servlet/Service前端工程师写 JSP/HTML不冲突可测试性Model 可以单独用单元测试不用启动 Web 服务器复用性一个 Model 可以被多个 View 使用比如用户数据既可以在 PC 端展示也可以在手机端展示六、MVC 和其它技术之间的关系技术在 MVC 中的角色说明ServletController控制器处理请求、转发页面JSPView视图展示数据尽量用 EL 和 JSTLJavaBean / Service / DAOModel模型数据和业务逻辑Tomcat运行环境容器不直接属于 MVC 但支撑它们运行七、你后面会遇到的扩展Spring MVC一个框架把 Servlet 封装得更优雅让你写 Controller 更简单不用手动继承 HttpServlet用Controller和RequestMapping。前后端分离View 不再用 JSP而是用 Vue/React 等前端框架后端只返回 JSON 数据。此时 Controller 仍然负责接收请求、调用 Model、返回 JSON不再是 JSP。但 MVC 的思想依然不变分离模型、视图、控制器只是视图换成了前端技术。
MVC 模式:把代码分开,别混在一起
一、什么是 MVCMVC 是一种软件设计模式把一个 Web 应用分成三个核心组件组件全称职责在 Java Web 中用什么实现MModel模型负责数据和业务逻辑比如读取数据库、计算、验证JavaBean / DAO / Service 类VView视图负责展示数据生成 HTML呈现给用户JSP / HTML / ThymeleafCController控制器负责接收请求、调用模型、选择视图Servlet / Spring MVC Controller二、生活类比餐厅点餐Model模型后厨的食材和菜谱真正的“数据”和“怎么做”。View视图服务员递给客人的菜单展示给用户看的样子。Controller控制器前台服务员客人点菜 → 服务员去后厨告诉厨师 → 做完了再端给客人。流程客人浏览器看菜单View。客人告诉服务员Controller要什么菜。服务员去后厨Model通知厨师做菜。厨师按菜谱业务逻辑做好。服务员把菜端给客人Controller 把数据给 View 展示。三、没有 MVC 会怎样你已经见过的反例反例1所有代码都写在 Servlet 里Java // Servlet 里既有业务逻辑又有 HTML 拼接 String name request.getParameter(name); User user userDAO.findByName(name); // 业务逻辑 PrintWriter out response.getWriter(); out.println(htmlbody); out.println(欢迎 user.getName()); // 页面输出 out.println(/body/html);问题改了数据库查询逻辑要改 Servlet改了页面样式也要改 Servlet。高耦合无法分工。反例2所有代码都写在 JSP 里jsp % String name request.getParameter(name); User user userDAO.findByName(name); // 在 JSP 里查数据库 % html...欢迎% user.getName() %.../html问题JSP 本应只管显示结果却混入了业务逻辑和数据库操作。页面设计师没法改Java 程序员维护起来也痛苦。四、MVC 的清晰分工正例假设我们要做一个“显示用户信息”的功能。1. Model模型只负责数据和业务逻辑java // User.java数据载体 public class User { private String name; private int age; // getter/setter } // UserService.java业务逻辑 public class UserService { public User findUser(String id) { // 去数据库查询返回 User 对象 } }2. View视图只负责展示user.jspjsp html body h1用户信息/h1 p姓名${user.name}/p p年龄${user.age}/p /body /html只有 HTML 和 EL 表达式没有任何 Java 业务代码3. Controller控制器负责接收请求、调用 Model、选择 Viewjava WebServlet(/user) public class UserServlet extends HttpServlet { protected void doGet(...) { String id request.getParameter(id); UserService service new UserService(); User user service.findUser(id); // 调用 Model request.setAttribute(user, user); // 存数据 request.getRequestDispatcher(/user.jsp).forward(request, response); // 去 View } }完整请求流程浏览器请求/user?id100ControllerUserServlet接收请求调用 ModelUserService获取数据。Controller 把数据放进 request然后转发给 Viewuser.jsp。View 使用 EL 展示数据生成 HTML。响应返回浏览器。五、MVC 的好处为什么你要学它好处说明分离关注点业务逻辑Model、页面展示View、请求处理Controller各管各的互不影响易于维护改数据库逻辑只改 Model改页面样式只改 View改 URL 路由只改 Controller团队协作后端工程师写 Servlet/Service前端工程师写 JSP/HTML不冲突可测试性Model 可以单独用单元测试不用启动 Web 服务器复用性一个 Model 可以被多个 View 使用比如用户数据既可以在 PC 端展示也可以在手机端展示六、MVC 和其它技术之间的关系技术在 MVC 中的角色说明ServletController控制器处理请求、转发页面JSPView视图展示数据尽量用 EL 和 JSTLJavaBean / Service / DAOModel模型数据和业务逻辑Tomcat运行环境容器不直接属于 MVC 但支撑它们运行七、你后面会遇到的扩展Spring MVC一个框架把 Servlet 封装得更优雅让你写 Controller 更简单不用手动继承 HttpServlet用Controller和RequestMapping。前后端分离View 不再用 JSP而是用 Vue/React 等前端框架后端只返回 JSON 数据。此时 Controller 仍然负责接收请求、调用 Model、返回 JSON不再是 JSP。但 MVC 的思想依然不变分离模型、视图、控制器只是视图换成了前端技术。