一,MVC是什么?
MVC(Model-View-Controller)是一种软件架构模式,常用于构建用户界面和应用程序的开发中,MVC三个字母又对应着不同的程序逻辑M 模型-V 视图-c 控制器
1.1 Model模型:
模型代表应用程序的数据和业务逻辑。它负责处理数据的读取、写入、验证、计算和操作等任务。模型通常与数据存储(数据库、文件等)进行交互,以获取和修改数据。
1.2 View 视图
视图是用户界面的可视化部分,负责展示数据给用户。它从模型中获取数据,并以用户友好的方式呈现给用户。视图可以是任何形式的用户界面,如网页、UI窗口、报表等。
1.3 Controller 控制器
控制器充当模型和视图之间的中介,负责协调它们之间的交互和通信。它接收用户的输入请求,并根据请求的类型来调用相应的模型操作或视图呈现。控制器还可以根据应用程序的业务逻辑来处理请求,以及控制流程和逻辑。
二,三层架构与MVC的区别(两点):
2.1 架构层次:
三层架构:
将应用程序分为三个主要层次:展示层/用户界面层(Presentation Layer/UI)、业务逻辑层(Business Logic Layer/BLL)和数据访问层(Data Access Layer/DAL)。
mvc架构:
应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。
2.2 关注点:
三层架构:
强调的是将应用程序的不同职责分离开,使得每个层次关注不同的任务。展示层处理用户交互和呈现数据,业务逻辑层处理应用程序的业务逻辑和工作流程,数据访问层负责与数据存储交互。
mvc:
关注的是应用程序的组织和交互。模型负责数据的处理和业务逻辑,视图负责用户界面的展示,控制器负责协调模型和视图之间的交互以及处理用户的输入请求
三,MVC流程:
在进行对数据的增删改查,每个操作都会去相对应的Servlet中去处理数据,会让类和代码越来越多越来越繁琐,并且在进行User或图书管理等进行处理数据,都会跳到不同的Servlet去处理数据(如下图),到后面的其他功能进行增删改查也要去创建不同的servlet去处理数据,导致更多代码和Servlet,很多代码及流程大致都是一样的但是又不得不这样去操作
接下来就发挥到第四点讲到的自定义mvc
四,自定义MVC的实现原理
用户通过浏览器发送一个地址(*.action),在ActionServlet中它只负责帮用户找到相对应用户想处理的具体数据(如图下Action)Action在其中有一个反射方法去统一的处理业务操作,需要操作业务的类继承Action,进行操作相对应的增删改查,再定义相对应的操作的业务类继承Action将结果返回到客户手中
再jsp页面模拟客户想进行的操作(下图)增删改查
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <p>第四版 最终</p> <a href="Book.action?methodName=add">增加</a> <a href="Book.action?methodName=del">删除</a> <a href="Book.action?methodName=upd">修改</a> <a href="Book.action?methodName=list">查询</a> </body> </html>
接下来就是中央处理器ActionServlet代码:
package com.LiuBing.framework; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletConfig; /** * 中央控制器 */ import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("*.action") public class DispatherServlet extends HttpServlet { //定义一个map集合 public Map<String, Action> actionmap= new HashMap<String, Action>(); @Override public void init(ServletConfig config) throws ServletException { actionmap.put("/Book",new BookAction()); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = req.getRequestURI();//地址方法 //获取到相关的地址信息并过滤 uri= uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf(".")); //将地址保存到action Action action = actionmap.get(uri); action.execut(req, resp); } }
Action处理请求,通过反射获取相对应类对象
如下代码:
package com.LiuBing.framework; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Action { protected void execut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String MethodName = request.getParameter("methodName");// 接受前端请求的值 try { // getDeclaredMethod获取指定类 通过前端nama值获取指定的类 Method m = this.getClass().getDeclaredMethod(MethodName, HttpServletRequest.class, HttpServletResponse.class); m.setAccessible(true);// 打开私有权限 m.invoke(this, request, response);// 将当前类BookServlet 反出去 } catch (Exception e) { e.printStackTrace(); } } }
Bookaction继承相对应操作处理请求(Action)
如下代码:
package com.LiuBing.framework; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BookAction extends Action{ public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("进入的是增加BookaddServlet...."); } public void del(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("进入的是删除BookadelServlet...."); } public void upd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("进入的是修改BookupdServlet...."); } public void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("进入的是查询BooklistServlet...."); } }
最后运行结果: