自定义 MVC 框架思想

news2024/11/25 8:19:08

目录

一、MVC设计模式

1. 什么是MVC

2. 三层架构与MVC的区别

二、自定义MVC框架

1. 为什么要学习自定义MVC框架

2. 自定义MVC的工作原理

3. 自定义MVC框架的优势

三、自定义MVC实例流程

1. mvc三层架构的弊端

2. 自定义MVC的工作流程     

2.1 子控制器(分发任务)

2.2 子控制器子类(施工员):

2.3 主控制器(门禁):

2.4 请求测试

尾言:


一、MVC设计模式

1. 什么是MVC

        MVC(Model-View-Controller)是一种软件设计模式,用于构建可维护和可扩展的应用程序。

MVC的结构:

  1. 模型(Model):模型表示应用程序的数据和业务逻辑。它负责处理数据操作、数据验证和业务规则。在自定义框架中,开发者需要定义模型来表示应用程序中的数据,并实现相应的操作和规则。

  2. 视图(View):视图负责展示模型的数据给用户,并处理用户界面的交互操作。视图通常是用户可见的部分,例如HTML页面或者移动应用的界面。在自定义框架中,开发者需要定义视图来展示模型的数据,并与用户进行交互。

  3. 控制器(Controller):控制器充当模型和视图之间的中间人,负责处理用户的请求并协调模型和视图之间的交互。它接收用户的输入,并将其转发给相应的模型进行处理,之后再将模型的结果传递给视图进行展示。在自定义框架中,开发者需要定义控制器来处理用户的请求,并根据请求调用相应的模型和视图。

2. 三层架构与MVC的区别

        三层架构(Three-Tier Architecture)和MVC(Model-View-Controller)是两种不同的软件架构模式,它们的主要区别如下:

  1. 结构层次不同:三层架构将应用程序划分为三个主要层次,分别是表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。而MVC将应用程序划分为三个组件,即模型(Model)、视图(View)和控制器(Controller)。

  2. 侧重点不同:三层架构的重点是将应用程序的不同功能和职责分离开来,以实现松耦合和重用性。每个层次负责不同的功能,比如表示层负责用户界面展示、业务逻辑层负责业务处理、数据访问层负责数据存储和检索。而MVC的重点是将应用程序的数据、视图和用户交互分离开来,并通过控制器协调它们之间的交互。

  3. 关注点不同:三层架构关注的是整体的系统架构和分层设计,注重将应用程序拆分为更小的组件并定义其功能和职责。MVC关注的是应用程序的交互和用户界面部分,注重实现数据与视图的分离以及交互逻辑的处理。

  4. 可重用性不同:三层架构的目标是实现组件的高内聚和低耦合,以便于组件的重用和替换。MVC的目标是实现模块化和可复用的代码,以便于视图和控制器的复用和替换。

        总的来说,三层架构是一种更加宏观的架构模式,注重整体的系统设计和分层,而MVC是一种更具体的架构模式,注重应用程序的交互和用户界面设计。它们可以相互结合使用,三层架构可以作为整体架构的基础,而MVC可以作为其中的一部分组件,负责实现视图和控制器的功能。

二、自定义MVC框架

        自定义MVC(Model-View-Controller)框架是一种能够帮助开发者构建和组织应用程序的软件框架,它基于MVC设计模式。

1. 为什么要学习自定义MVC框架

自定义MVC框架的重要性主要体现在以下几个方面:

  1. 结构清晰:MVC框架将应用程序的不同部分进行了划分,使得代码的结构更加清晰和可读性更高。通过明确定义模型、视图和控制器的职责,可以使开发人员更容易理解和维护应用程序的代码。

  2. 可维护性:由于MVC框架使代码结构变得清晰,因此应用程序变得更容易维护。当需要进行修改或者添加新功能时,开发人员可以更加准确地找到和理解相关代码的位置,从而提高代码的可维护性。

  3. 可扩展性:MVC框架将应用程序的不同部分解耦,使得各个部分可以独立进行开发和测试。这意味着当需要添加新功能或者进行需求变更时,只需要修改相应的模型、视图或控制器,而不会对其他部分造成影响,从而提高了代码的可扩展性。

  4. 代码复用:通过合理使用MVC框架,可以将一些通用的代码逻辑封装在模型、视图或控制器中,从而实现代码的复用。例如,多个视图可以共享同一个模型来展示不同的数据,或者多个控制器可以共享同一个模型来处理相同的请求。这样可以减少冗余代码的编写,提高开发效率。

        学习自定义MVC框架也非常重要,因为它是一种常用的软件设计模式,广泛应用于Web开发和其他领域的应用程序开发中。通过学习MVC框架,你将掌握一种思维方式和组织代码的方法,提高自己的编程能力和项目开发能力。同时,理解MVC框架的原理和使用方式,可以让你更好地理解和使用各种现有的MVC框架,如Spring MVC、Ruby on Rails等,从而扩展你的技术栈。

2. 自定义MVC的工作原理

       

一个自定义MVC框架的基本工作流程如下:

  1. 用户通过视图与应用程序交互,视图将用户的请求传递给控制器。
  2. 控制器接收用户请求,根据请求的类型和内容决定调用哪个模型处理请求,并根据处理结果决定需要更新哪个视图。
  3. 模型处理请求的过程中可能需要与数据库或其他数据源进行交互,获取所需数据并进行相应的处理。处理完成后,将结果返回给控制器。
  4. 控制器根据模型的处理结果,决定更新哪个视图以展示结果给用户。
  5. 视图接收到控制器的指令后,根据要展示的内容进行相应的处理和渲染,最终将结果呈现给用户。

3. 自定义MVC框架的优势

  • 分离关注点:MVC框架能够帮助开发者清晰地分离应用程序的不同组件,提高代码的可读性、可维护性和可重用性。
  • 灵活性:开发者可以根据具体需求自由扩展和定制各个组件,以适应不同的应用场景。
  • 易于测试:由于MVC框架的模型、视图和控制器各自独立,开发者可以方便地对每个组件进行单独的单元测试和集成测试。

        根据具体的编程语言和需求,开发者可以根据MVC模式自定义属于自己的MVC框架,并根据实际情况进行相应的优化和扩展。

三、自定义MVC实例流程

1. mvc三层架构的弊端

你是否还在用之前的mvc架构方法🤷‍♂️ 还在写这么多的包来进行分类!😯

或者这样🤔?不得不承认你是有点聪明在身上的👍

总结弊端:每一个操作都要写一个servlet来处理,每张表都要写相应的增删改改查方法

🫵今天看了我这篇自定义MVC框架!头也不疼了,脚也不酸了👨‍💻、代码也少了🤏

准备好上车了吗👴!!!

2. 自定义MVC的工作流程     

       👨‍💻 首先我给大家讲一个生活中的案例,假如我是一个施工人员,只有施工证才能进行施工。那么我要进行施工,每次都要经过施工点的门禁,门禁则根据施工证进行存档,通过了才能到达施工点,听从安排进行具体任务施工。

        那么这里的的施工人员就是一个个子控制器子类,必须要继承实现父类子控制器的执行方法,才有资格进行操作,而我们子控制器子类真正要实现功能,要每次都经过主控制器的控制过滤,才能到指定子类进行施工,分发任务的就是子控制器了。

2.1 子控制器(分发任务)

package com.ycxw.framework;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 子控制器(action) 处理浏览器请求的类
 * 
 * @author 云村小威
 *
 * 2023年6月29日 下午8:30:32
 */
public class Action {

	public void execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 获取methodName值,这里指前端点击功能传来的方法名
		String methodName = request.getParameter("methodName");

		/**
		 * this--->BookAction/BlogAction/PermissionAction...可能是很多对象
		 * 所以需要通过反射找到对象带request,response参数的methidName方法
		 */
		Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
		m.setAccessible(true);
		// 动态调用其方法
		m.invoke(this, request, response);
	}

}

2.2 子控制器子类(施工员):

package com.ycxw.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ycxw.framework.Action;

/**
 * 施工类
 * 继承子控制器
 * @author 云村小威
 *
 * 2023年6月29日 下午8:32:59
 */
public class BookAction extends Action {

	public void query(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("查询的业务逻辑");
	}

	public void edit(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("修改的业务逻辑");
	}

	public void delete(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("删除的业务逻辑");
	}

	public void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("新增的业务逻辑");
	}

}

施工证就是 : public class BookAction extends Action如果我没有继承Action父类子控制器,我是没有这个方法的,那么就不能进行施工操作…

2.3 主控制器(门禁):

package com.ycxw.framework;

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.ycxw.servlet.BookAction;

/**
 * 中央控制器(ActionServlet)
 * 
 * @author 云村小威
 *
 * 2023年6月29日 下午8:14:38
 */
@WebServlet("*.action")
public class DisPathServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//实例化集合作为储存
	private Map<String, Action> actionMap = new HashMap<String, Action>();

	@Override
	public void init() throws ServletException {
		/**
		 * 初始化存值就是给每个施工员根据施工证进行存档:
		 */
		actionMap.put("book", new BookAction());
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// http://localhost:8080/MVC_project/book.action?methodName=delete...
		/**
		 * 获取请求路径
		 */
		String uri = request.getRequestURI();
		// 截取book
		uri = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));
		// 通过截取后的key(url)在map集合中找到指定的类进行处理
		Action action = actionMap.get(uri);
		try {
			action.execute(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

2.4 请求测试

<%@ 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="${pageContext.request.contextPath }/book.action?methodName=add">增加</a>
	<a href="${pageContext.request.contextPath }/book.action?methodName=delete">删除</a>
	<a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
	<a href="${pageContext.request.contextPath }/book.action?methodName=query">查询</a>
	<a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
</body>
</html>

当我点击删除连接 就会进到主控制器进行筛选处理

 

 通过子控制器动态调用传来的方法名指定的方法


尾言:

        学好编程先学会编程思想,分析流程才能提高效率,本篇只是简单的介绍及流程,自定义MVC框架主要是促进了代码的重用性、可维护性和可扩展性。将代码进行分离,明确定义它们的职责。因此可以更容易地进行单元测试和集成测试。此外,当某个组件需要变更时,也只需要修改该组件而不影响其他组件。

下篇我会讲到如何将自定义MVC框架运用到实际开发中,加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【flutter滑动拼图验证码】

Java后台使用aj_captcha插件&#xff0c;提供/captcha/get&#xff08;获取captcha底图和拼块图片&#xff09;、/captcha/check&#xff08;验证拼图偏移量&#xff09;这两个接口。并且这个插件在GitHub上有源码。 1.先准备好aj_captcha的工具类&#xff1a; import dart:co…

Linux指令与权限

本期我们来学习Linux的权限内容 目录 Linux权限 1.认识Linux下用户的分类 2.什么是权限 3.没有权限是什么现象 4.权限的修改问题 chmod chown chgrp umask 粘滞位 file指令 我们在使用xshell登录后&#xff0c;会有下面的东西 我们来介绍一下&#xff0c;以我的登录…

19. WebGPU —计算着色器(compute shader)

WebGPU 是即将推出的 Web API&#xff0c;可提供对GPU的底层控制并用于通用目的计算任务 。 我对计算机图形不是很有经验。我通过阅读有关如何使用 OpenGL 构建游戏引擎的教程了解了 WebGL 的点点滴滴&#xff0c;并通过观看 Inigo Quilez 在 ShaderToy 上仅使用着色器而不使用…

最长连续序列

题目链接 最长连续序列 题目描述 注意点 0 < nums.length < 100000不要求序列元素在原数组中连续 解答思路 要想实现时间复杂度为 O(n) 的算法解决此问题&#xff0c;关键是数字不能多次遍历&#xff0c;所以首先要对数组进行去重&#xff1b;然后为什么防止某个元素…

NSS [HNCTF 2022 WEEK2]ez_ssrf

NSS [HNCTF 2022 WEEK2]ez_ssrf 先拿dirsearch扫一下。 访问/flag.php 访问/index.php 应该是从index.php传参,ssrf然后访问到flag.php。 因此构造poc.php: <?php $out "GET /flag.php HTTP/1.1\r\n"; $out . "Host: 127.0.0.1\r\n"; $out . "…

网络关键设备和网络安全专用产品目录-2023年7月

2023年7月3日&#xff0c;网络关键设备和网络安全专用产品目录&#xff08;一级&#xff09;终于更新了&#xff0c;增加到38类&#xff0c;大家想了解每类产品对应哪家检测机构、以及涉及相关的标准、分解的二级产品目录&#xff0c;可以联系龙域认证客服。 一、网络关键设备…

01_面向对象的设计原则

面向对象的设计原则 参考资料&#xff1a; 视频书籍 《设计模式&#xff1a;可复用面向对象软件的基础》 简介 面对复杂问题如何解决&#xff1f; 分解&#xff1a;分而治之&#xff0c;大问题分解成小问题。抽象&#xff1a;忽视非本质的细节&#xff0c;处理泛化和理想化…

交换排序--冒泡排序和快速排序

交换&#xff0c;是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置 一&#xff0c;冒泡排序 1.基本思想&#xff1a;从后往前&#xff08;或从前往后&#xff09;两两比较相邻元素的值&#xff0c;若为逆序&#xff08;A[i-1] > A[i]&#xff09;&a…

Vivado创建IP核步骤

0、创建一个LED IP核 1、打开Vivado&#xff0c;点击Tasks栏的Manage IP&#xff0c;在弹出的选项框中选中New IP Location... 2、在弹出的界面选择Next 3、在弹出的界面中进行IP核的属性配置&#xff0c;修改系所属的器件和保存路径&#xff0c;其他的保持默认就行&#xff0…

Java(117):读取properties配置文件中文乱码问题解决

1、Edit展示properties后缀文件时乱码 2、读取properties配置文件中文乱码问题解决 2.1、文件存储为UTF-8格式 2.2、读取时设置为UTF-8格式 String enconding "UTF-8"; BufferedReader br new BufferedReader(new InputStreamReader(new FileInputStream(fileP…

VMware安装win10系统(超详细)

目录 一、创建虚拟机 二、选择自定义安装 三、根据自己的主机选择虚拟机的配置 四、光盘映像可以选择稍后安装​编辑 五、 根据自己的光盘映像选择操作系统和版本&#xff0c;因为我的装的是win10 x64&#xff0c;所以安装如下图所示 六、选择存放路径 七、 选择BIOS&#x…

java阻塞队列/kafka/spring整合kafka

queue增加删除元素 增加元素 add方法在添加元素的时候&#xff0c;若超出了度列的长度会直接抛出异常&#xff1a;put方法&#xff0c;若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间&#xff0c;以加入元素offer方法在添加元素时&#xff0c;如果发现队列已满…

FPGA实验三:状态机的设计

目录 一、实验目的 二、实验要求 三、实验代码 1.design source文件部分代码 2.测试文件代码 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 &#xff08;1&#xff09;设计好序列检测器 &#xff08;2&#xff09;仿真波形&#xff08;检测11010&#xff09; 3…

Linux-vim与gdb与make/makefile

三个模式&#xff1a;命令模式 文本模式 底行模式 yum :instell 安装 remove 卸载 gcc -o执行后生成文件命名 gcc 1.c -o fst.out -E预编译 -S汇编 -c生成机器码 Linux 中 静态库&#xff1a;.a&#xff1b;动态库&#xff1a;.so Linux默认动态库&#xff0c;…

Redis的安装,启动,关闭

一&#xff0c;redis安装linux 1&#xff0c;安装gcc环境 yum -y install gcc-c2,上传压缩包到/usr/soft目录&#xff0c;并解压 cd /soft tar -xvf redis-3.2.11.tar.gz3&#xff0c;进入redis-5.0.7目录&#xff0c;使用make命令编译redis [rootlocalhost soft]# cd re…

【DBA课程-笔记】第1章:MongoDB数据库入门

一、MongoDB 概览及新特性 1. MongoDB 简介 目前最流行的NoSQL数据库&#xff08;NO.1&#xff09;MongoDB是一个基于分布式文件存储的数据库&#xff0c;由C语言编写&#xff0c;特点是高性能、易部署、易使用、存储数据非常方便&#xff0c;旨在为Web应用提供可扩展的高性能…

企业该如何防止数据泄漏问题

关键词&#xff1a;企业网盘、知识文档管理系统、群晖NAS、数据安全 根据Verizon《2022 数据泄露调查报告》显示&#xff0c;2022年数据泄露事件中82%的违规行为涉及人为因素&#xff0c;勒索软件泄露事件增加了13%&#xff0c;超过过去五年的总和&#xff0c;数据安全已变成关…

【JUC-7】ReentrantLock (可重入锁)基础

ReentrantLock (可重入锁) ReentrantLock实现了Lock接口, 内部通过继承AQS, 实现了一个同步器. 可以通过同步器来创建Condition条件变量, 可以用作容器, 存放不同条件的等待线程. 说明ReentrantLock与AQS的关系 类图: 相对于synchronized, 都支持可重入. 它还具备如下特点: …

【算法练习】24:凯撒密码

一、凯撒密码介绍&#xff1a; 采用替换的方式对英文字母进行处理&#xff0c;将每一个英文字符循环替换为字母表序列中该字符的后面的第三个字符&#xff0c;即循环右移3位。 明文字母表&#xff1a;ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表&#xff1a;DEFGHIJKLMNOPQRSTUV…

微信小程序如何读取本地云存储txt数据,避免乱码

第一步 找到你的txt文件&#xff0c;重命名为json文件 第二步 上传到云存储中&#xff0c;获取File ID 第三步 编写js代码 相关技术文档&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readFile.html onShow(){wx.cloud.d…