一.MVC模式
1.1 MVC是什么??
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
通过将应用程序的逻辑分离到不同的组件中,MVC模式提高了代码的可维护性、复用性和可测试性。它也促进了团队的协作和并行开发,因为不同的成员可以独立地开发模型、视图和控制器。许多现代的Web框架和应用程序框架都使用MVC模式作为其设计基础。
1.2 MVC结构
MVC代表模型-视图-控制器,它将应用程序的逻辑划分为三个组件:
- 模型(Model):模型表示应用程序的数据和业务逻辑。它负责管理数据的存储、检索、更新和验证,并提供与数据相关的功能。模型通常是应用程序中最基础的组件。
- 视图(View):视图是用户界面的表示。它负责将模型的数据以合适的方式呈现给用户,例如在屏幕上显示文本、图片、表格等。视图通常是根据用户的输入和模型的数据来动态更新。
- 控制器(Controller):控制器是模型和视图之间的协调者。它接收来自用户的输入,并根据这些输入更新模型和视图。控制器将用户的操作转发给模型进行处理,并根据模型的状态更新视图。控制器还可以处理应用程序中的其他逻辑,例如验证用户输入、处理错误等。
二.MVC与三层架构的区别
- 概念和关注点:
- 三层架构:三层架构将应用程序划分为表示层、业务逻辑层和数据访问层,强调的是应用程序的层次结构和数据流,重点是将业务逻辑和数据操作隔离开来。
- MVC:MVC将应用程序划分为模型、视图和控制器,强调的是在用户界面开发中的分层和逻辑划分,重点是将界面逻辑、业务逻辑和数据操作进行解耦。
- 应用范围:
- 三层架构:三层架构广泛适用于不同类型的应用程序,包括Web应用程序、客户端/服务器应用程序和分布式系统等。
- MVC:MVC主要应用于用户界面的开发,特别是Web应用程序和桌面应用程序等。
- 三层架构是基于业务逻辑来分的,而MVC是基于页面来分的;
- 三层架构模式是体系结构模式,MVC是设计模式;
- 三层架构模式又可归于部署模式,MVC可归于表示模式。
三.自定义MVC工作原理
四.自定义MVC的实现(以User.java为例实现)
4.1 根据上图,我们先定义ActionServlet 也就是中央控制器:负责接受请求,然后安排合适的servlet来执行从浏览器传来的请求
这里的步骤:
1.获取路径
2.截取 User
3.因为要通过截取的/User 去找UserServlet,所以创建一个Map集合
4.进行初始化,将所有的Servlet添加进去
5.获取
package com.yinzi.jar; import java.io.IOException; import java.util.HashMap; import java.util.Map; 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 com.yinzi.Servlet.UserServlet; /** * 中央控制器:负责接受请求,然后安排合适的servlet来执行请求 * @author yinzi * @2023年6月29日 */ @WebServlet("*.servlet") public class ActionServlet extends HttpServlet{ //3.因为要通过截取的/User 去找UserServlet,所以创建一个Map集合 Map<String, Action> actionMap=new HashMap<String, Action>(); //4.进行初始化,将所有的Servlet添加进去 @Override public void init() throws ServletException { actionMap.put("/User", new UserServlet()); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //http://localhost:8080/MVC/User.jsp //获取路径,截取 User 目的是为了知道需要调用哪个servlet里的方法 //1.获取路径 String uri = req.getRequestURI(); //2.截取 User uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));//截取的结果为:/User //5.获取 System.out.println(uri); Action action = actionMap.get(uri); //调取 action.execute(req, resp); } }
4.2 控制器(Controller)
然后建立一个Action类,它是子控制器,负责处理从浏览器传来的请求 ,是其他类增删改查类的父类,它去调浏览器请求的方法,所有这里运用到反射 来处理请求,通过它来调相应Servlet,它需要从获取前端的参数,来判断要调用哪个方法。
package com.yinzi.jar; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 子控制器:是其他类增删改查类的父类,它去调浏览器请求的方法,所有这里运用到反射 * 来处理请求,通过它来调相应Servlet * @author yinzi * @2023年6月29日 * */ public class Action { protected void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取参数methodName String methodName = req.getParameter("methodName"); try { Method m = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class); //打开访问权限 m.setAccessible(true); m.invoke(this, req,resp); } catch (Exception e) { e.printStackTrace(); } } }
4.3 作为演示,我这里没有写具体的方法,这个类就是写增删改查的具体的方法
package com.yinzi.Servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.yinzi.jar.Action; /** * 用户的Servlet,在这个方法里写增删改查 * @author yinzi * @2023年6月29日 * */ public class UserServlet extends Action{ public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是新增"); } public void del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是删除"); } public void upd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是修改"); } public void query(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是查询所有"); } }
4.4 视图(view)
这里我也没有写上面内容,这就是写要展示的内容
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="User.servlet?methodName=add">新增</a> <a href="User.servlet?methodName=del">删除</a> <a href="User.servlet?methodName=upd">修改</a> <a href="User.servlet?methodName=query">查询</a> </body> </html>
效果:
我选择的是删除