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架构和三层架构是两种不同的架构模式,它们在组织方式、层次结构和关注的重点上存在一些区别。
组织方式:
自定义MVC架构:自定义MVC强调的是在模型、视图和控制器之间进行定制化的调整,根据具体需求和业务逻辑重组各个组件的角色和责任,以满足特定的需求。
三层架构:三层架构将应用程序分为表示层、业务逻辑层和数据访问层,每个层次专注于不同的功能和职责。
层次结构:
自定义MVC架构:自定义MVC架构通常包括模型、视图和控制器三个主要组件,控制器负责协调视图和模型之间的交互。
三层架构:三层架构是按照功能和职责进行划分的,包括表示层、业务逻辑层和数据访问层。
关注重点:
自定义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>