自定义MVC

 

目录

1.什么是MVC?

2.自定义MVC

3.自定义MVC的作用

4.自定义MVC架构与三层架构的区别

 5.自定义MVC的工作原理

 6.自定义mvc实现

1.中央控制器

2.Action类定义

3.继承子控制器

4.jsp


1.什么是MVC?

MVC是一种软件架构模式,它代表模型-视图-控制器(Model-View-Controller)。MVC模式用于将应用程序的不同组成部分分离,以便更好地管理和组织代码。

  • 模型(Model)表示应用程序的数据和业务逻辑。它处理数据的存储、检索和更新,并提供使用这些数据的方法和接口。
  • 视图(View)负责展示模型中的数据,通常是用户界面的一部分。它负责接收用户的输入,并将数据传递给控制器进行处理。
  • 控制器(Controller)充当模型和视图之间的中介,接收用户的输入并解释其意图。它从视图接收输入,并更新模型的状态,然后将更新后的数据发送回视图进行展示。

通过将应用程序分为模型、视图和控制器三个部分,MVC模式可以实现代码的重用性、可维护性和可扩展性。它使不同的组成部分之间的协作变得更加清晰和简单,并促进了团队的分工合作。许多现代的Web框架和应用程序框架都采用了MVC模式来构建可靠和可伸缩的应用程序。

2.自定义MVC

自定义MVC是指在MVC(Model-View-Controller)架构基础上,根据具体需求和业务需求进行个性化的定制和扩展。通常,自定义MVC会根据特定的应用程序要求重新定义或扩展各个组件的角色和责任,以满足特定的需求。

在自定义MVC中,模型(Model)仍然负责处理数据和业务逻辑,视图(View)仍然负责展示数据。但是,控制器(Controller)可以有一些定制化的变化。控制器可能会根据具体需求进行调整,以适应特定的应用程序逻辑或用户交互。

自定义MVC的目的是根据具体需求对标准的MVC架构进行个性化的调整,以提高开发效率和代码可维护性。通过自定义MVC,可以更好地适应特定的业务流程和用户需求,并提供更好的灵活性和扩展性。

需要注意的是,自定义MVC仍然应该遵循MVC架构的基本原则和设计模式,即分离关注点、实现单一职责等。自定义MVC并不是完全替代MVC,而是在MVC基础上进行定制,以满足更具体的需求。每个自定义MVC实现可能都会有不同的特点和变化,具体的实现方式取决于具体的应用场景和需求。

3.自定义MVC的作用

自定义MVC架构具有以下几个用处:

1. 符合特定需求:通过自定义MVC架构,可以根据具体的应用需求和业务逻辑,定制化地调整模型、视图和控制器的角色和责任,以满足特定的功能和需求。这样可以构建更灵活、更高效的应用程序。

2. 提高可维护性:自定义MVC架构将代码划分为不同的组件,使不同的职责分离。这样可以降低代码之间的耦合度,减少代码的复杂性,使代码更加模块化和可维护。当需要进行修改或新增功能时,只需要关注特定的组件,而不影响其他部分的代码。

3. 增强可扩展性:通过自定义MVC架构,可以设计组件与模块之间的清晰接口,使得各个组件可以独立地进行扩展和升级。这样在应对不断变化的需求和业务逻辑时,可以更方便地进行扩展和调整,而不影响其他部分。

4. 提升代码的重用性:自定义MVC架构将不同的功能和职责分层划分,使得代码可以更好地复用。例如,通过模型和控制器的分离,可以在不同的视图中重复使用相同的模型和业务逻辑,从而提高代码的重用性和开发效率。

5. 支持团队合作:自定义MVC架构定义了清晰的角色和职责,使得团队成员可以在不同的组件上独立工作,降低协同开发的复杂性。每个成员可以专注于自己的任务,减少开发冲突,提高团队协作效率。

总的来说,自定义MVC架构能够根据具体需求和业务逻辑定制化地调整模型、视图和控制器的角色和责任,以提供更灵活、可维护、可扩展和可复用的代码结构。这样可以更好地适应应用程序的需求,并提高开发效率和代码质量。

4.自定义MVC架构与三层架构的区别

自定义MVC架构和三层架构是两种不同的架构模式,它们在组织方式、层次结构和关注的重点上存在一些区别。

  1. 组织方式:

    • 自定义MVC架构:自定义MVC强调的是在模型、视图和控制器之间进行定制化的调整,根据具体需求和业务逻辑重组各个组件的角色和责任,以满足特定的需求。
    • 三层架构:三层架构将应用程序分为表示层、业务逻辑层和数据访问层,每个层次专注于不同的功能和职责。
  2. 层次结构:

    • 自定义MVC架构:自定义MVC架构通常包括模型、视图和控制器三个主要组件,控制器负责协调视图和模型之间的交互。
    • 三层架构:三层架构是按照功能和职责进行划分的,包括表示层、业务逻辑层和数据访问层。
  3. 关注重点:

    • 自定义MVC架构:自定义MVC架构更关注于用户界面、用户交互和业务逻辑的定制化调整,重点在于满足特定的需求和业务流程。
    • 三层架构:三层架构注重业务逻辑和数据访问的分离,重点在于将不同的功能和职责分层,以提高可维护性和重用性。

总体来说,自定义MVC架构与三层架构在组织方式、层次结构和关注的重点上存在一些差异。自定义MVC架构更注重定制和调整MVC的组件,满足特定的需求和业务逻辑。而三层架构更注重功能的分层和职责的划分,以实现业务逻辑和数据访问的分离。选择哪种架构模式应根据具体的应用场景、需求和团队的技术实践来确定。

 

 5.自定义MVC的工作原理

 

 6.自定义mvc实现

1.中央控制器

package com.liao.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.liao.web.BookAction;



/**
 * 中央控制器
 * 
 */
@WebServlet("*.action")
public class DispathServlet extends HttpServlet{

	public Map<String, Action> actionMap =new HashMap<String, Action>();
	
	@Override
	public void init() throws ServletException {
		actionMap.put("/book", new BookAction());
	}
	@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 {
 
		String uri = req.getRequestURI();
		uri =uri.substring(uri.lastIndexOf("/"),
				uri.lastIndexOf("."));
		Action action = actionMap.get(uri);
		action.execut(req, resp);
	}
	
	}

2.Action类定义

package com.liao.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 req, HttpServletResponse resp) throws ServletException, IOException {
		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();
		}
	}
}

3.继承子控制器

package com.liao.web;

import java.io.IOException;

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

import com.liao.framework.Action;



public class BookAction extends Action{

	public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookAddServlet.add");
	}
	public void del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookAddServlet.del");
	}
	public void upd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookAddServlet.upd");
	}
	public void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookAddServlet.list");
	}
}

4.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>版本1:Servlet多,并且流程繁琐,代码可维护性差</p>
弊端:每一张表对应的每一个操作,都要写一个servlet类来处理<hr>
<a href="bookAdd.action">增加</a>
<a href="bookDel.action">删除</a>
<a href="bookUpd.action">修改</a>
<a href="bookList.action">查询</a>


<p>版本2:虽然是一个servlet,但是代码维护性差,代码冗余</p>
弊端:虽然每一张表对应的每一个操作,只要写一个servlet类来处理,但是每增加一个操作都需要改变原有的代码块,换句话说要增加条件分支<hr>
<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>

<p>版本3:使用反射方法代码,虽然能解决代码冗余问题但是在项目应用中代码重复</p>
弊端:虽然解决了if条件分支代码冗余的问题,但是放到项目的范围内,反射的代码是重复的<hr>
<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>

<p>版本4:使用MVC方法,流程简化,还有优化空间</p>
解决反射的代码重复的问题<hr>
<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>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值