自定义mvc框架

                               一.介绍mvc框架

1.什么是mvc框架?

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

MVC结构

  • Model:是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。

  • View:是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。

  • Controller:是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式

  • Model:常用javabean去实现,通过各种类来对数据库的数据进行获取,并封装在对象当中。

  • View:常用JSP来实现,通过可直接观察的JSP页面来展示我们从数据库中获取的数据。

  • Controller:常用servlet来实现,通过servlet来获取经过javabean包装过的对象(已存入数据库中的数据),然后再发送数据传输到JSP界面。

1.不能跨层调用; 2.只能由上往下进行调用:View -> Controller -> Model

2.为什么要在企业中使用?

在企业中使用MVC框架有以下几个主要原因:

1. 分离关注点:MVC框架将应用程序分为模型(Model)、视图(View)和控制器(Controller)。这种分离关注点的设计使得代码的职责清晰明确。模型负责处理业务逻辑和数据操作,视图负责呈现用户界面,控制器处理用户输入和协调模型和视图之间的交互。通过这种分离,不同的开发人员可以专注于各自的领域,提高了代码的可维护性和可理解性。

2. 可重用性:MVC框架鼓励将逻辑和表示分离。这使得模型和视图可以独立于特定的应用需求进行开发,从而提高了代码的可重用性。模型可以在不同的应用程序中使用,视图可以根据需要进行替换或重新设计,同时保持与模型的兼容性。

3. 可扩展性:MVC框架使得应用程序的不同组件可以相对独立地进行开发和扩展。通过这种结构,可以轻松添加新的功能或修改现有的功能,而无需对整个应用程序进行重构。这种可扩展性使得企业能够快速响应变化的需求,并保持代码的可维护性和稳定性。

4. 并行开发:使用MVC框架可以实现并行开发。开发人员可以独立地在模型、视图和控制器之间工作,而无需等待其他人员完成其任务。这种并行开发的方式可以显著提高开发效率,缩短项目的交付时间。

总之,企业中使用MVC框架可以带来分离关注点、可重用性、可扩展性和并行开发的好处。这些优势有助于提高代码质量、开发效率和应用程序的可维护性,使企业能够更好地应对不断变化的业务需求。

3. 三层架构和MVC的区别

三层架构和MVC是常见的软件架构模式,用于组织应用程序的代码。它们的区别如下:

1. 结构不同:
   - 三层架构: 三层架构将应用程序分为表示层、业务逻辑层和数据访问层。表示层处理用户界面和交互,业务逻辑层处理应用程序的逻辑功能,数据访问层处理与数据存储的通信。
   - MVC: MVC将应用程序分为模型、视图和控制器。模型处理数据和业务逻辑,视图负责呈现界面,控制器处理用户输入并协调模型和视图之间的交互。

2. 关注点不同:
   - 三层架构: 三层架构注重层次化和分离关注点的概念。它的目标是将不同层次的代码分开,并使其易于维护和扩展。
   - MVC: MVC注重分离关注点和可重用性。它的重点是通过分离数据、逻辑和显示来实现更好的代码组织和可维护性。

3. 独立性不同:
   - 三层架构: 每个层级在三层架构中相对独立,可以单独开发和部署。业务逻辑层和数据访问层可以独立于表示层进行更改和测试。
   - MVC: MVC模式中,模型、视图和控制器之间存在更紧密的耦合。它们紧密协作,通过事件和消息传递来保持同步。

简而言之,三层架构和MVC在结构、关注点和独立性等方面有所区别。三层架构更注重层次化组织和分离关注点,而MVC更注重分离关注点和可重用性。选择何种架构取决于应用程序的需求和开发团队的偏好。

4.所以你知道他们的区别了吗? 


                               二.分析mvc框架代码和缺陷

1.利用mvc架构的缺点

1. 学习曲线较陡:对于初学者来说,理解和应用MVC架构可能需要一些时间和努力。它的概念和分层结构可能会对初学者造成一些困惑,因此需要一定的学习曲线。

2. 复杂性增加:随着应用程序规模的增大,MVC架构可能会变得复杂。随着功能和模块的增加,控制器的逻辑可能变得庞大,导致代码可读性和维护性降低。此外,为了维持低耦合性,可能需要引入更多的接口和事件处理机制,增加了代码的复杂性。

3. 逻辑交叉问题:在某些情况下,模型、视图和控制器之间的逻辑交叉可能增加。特别是当应用程序的要求变得复杂时,可能会出现需要在多个组件之间共享逻辑或需要跨组件通信的情况。这可能导致模块之间耦合性增加,降低了架构的可扩展性。

4. 视图与模型的依赖:在一些情况下,视图可能会依赖于模型的特定结构或属性。这种依赖关系可能导致模型的更改需要同时更新视图,增加了维护成本和出错的可能性。

5. 可能过于灵活:MVC架构的灵活性也可能成为缺陷。在没有明确规定的情况下,开发人员可能会有多种选择来实现同一个功能,导致代码的风格和结构不一致。

6. 性能问题:由于MVC架构中涉及到多个组件之间的交互,可能会产生额外的开销和延迟。尤其是在大型和复杂的应用程序中,可能需要更多的资源和处理时间来协调模型、视图和控制器之间的通信。

管MVC架构有一些缺陷,但它仍然是一种被广泛采用的架构模式,特别适用于中大型的应用程序开发。通过合理的设计和实践,许多缺陷可以被解决或减轻。

2.自我总结

在使用这个模式时,经常回去做很多重复的工作,以及在编码时,会出现很多重复的代码!在实现的时候还要调用各种方法,步骤繁琐,费时间

                 三.利用自定义mvc框架去优化三层架构 

3.1流程图

 3.2思路

在Eclipse中使用MVC架构来优化JSP页面的增删改查操作的流程如下:

1. 创建模型(Model)
   - 在Eclipse中创建一个Java类,例如UserModel,用于管理用户数据。
   - UserModel类可以包含与用户数据相关的方法,例如添加用户、删除用户、更新用户等。

2. 创建控制器(Controller)
   - 在Eclipse中创建一个Java类,例如UserController,作为控制器。
   - UserController类负责接收用户请求,并调用模型中的方法来处理这些请求。
   - 使用@WebServlet注解配置UserController类以便访问该控制器。

3. 创建JSP视图(View)
   - 在Eclipse中创建一个JSP页面,例如user.jsp,用于显示用户界面和接收用户输入。
   - 在user.jsp页面中,使用HTML和JSTL标签来展示用户信息并提供表单用于接收用户输入。

4. 绑定模型和视图
   - 在UserController类中创建一个UserModel对象,与模型进行绑定。
   - 通过调用UserModel对象的方法,从模型中获取用户数据或执行增删改查操作,并将结果传递到JSP视图中进行展示。

5. 实现增删改查功能
   - 在UserController类中实现相应的方法,例如addUser、deleteUser、updateUser等,用于处理增删改查操作。
   - 这些方法中,调用UserModel对象的方法来执行相应的操作,并将结果存储到HttpServletRequest对象中供JSP页面使用。

6. 在JSP页面中展示结果
   - 在user.jsp页面中,通过调用JSTL标签或使用EL表达式,从HttpServletRequest对象中获取控制器传递过来的数据,并将其展示给用户。

通过上述步骤,你可以在Eclipse中使用MVC架构来优化JSP页面的增删改查操作。控制器负责接收用户请求并调用模型处理数据,模型负责处理数据操作,视图负责展示用户界面。这种分离架构使得代码结构更清晰、模块化,提高了代码的复用性和可维护性。

3.2.1老版本 方法

1.(版本1)每次对于一个表格进行(增加,删除,修改,查看)操作,都要写一个servelt

缺点:非常复杂,每一次增加一个功能就要增加一个servelt,代码重复

2.(版本2) 每次对于一个表格进行(增加,删除,修改,查看)操作,只写一个servelt

缺点:但是每次增加一个操作就要改变原有的代码块
就是要增加条件分支
 

package com.lz.servelt;

import java.io.IOException;
import java.lang.reflect.Method;

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("/book.action")
public class BookServelt extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String methodName = request.getParameter("methodName");
		if ("add".equals(methodName)) {
			add(request,response);
		}else if ("del".equals(methodName)) {
			del(request,response);
		}
		else if ("upd".equals(methodName)) {
			upd(request,response);
		}
		else if ("Ck".equals(methodName)) {
			Ck(request,response);
		}


	private void Ck(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("ck....方法");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("upd....方法");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("del....方法");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("add....方法");
		
	}

}
 3.(版本3)通过反射实现

缺点:解决了,增加条件分支,但是在项目中,反射代码也是重复的

package com.lz.servelt;

import java.io.IOException;
import java.lang.reflect.Method;

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("/book.action")
public class BookServelt extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String methodName = request.getParameter("methodName");

		try {
			Method m = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class);
		m.setAccessible(true);
		m.invoke(this, request,response);
		} catch (Exception  e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	private void Ck(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("ck....方法");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("upd....方法");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("del....方法");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("add....方法");
		
	}

}

3.2.2新版本 (通过反射实现)标签有优化

1.建立中央控制器
package com.lz.fraamework;

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.lz.servelt.bookAction;

/**
 * 对应图中的 ActionServelt:中央控制器
 * 
 * @author lzzxq
 *
 */
@WebServlet("*.action")
public class DispathServelt extends HttpServlet {
	public 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 {
		String methodName = request.getParameter("methodName");
		// http:lolaoch/80./s
		// 获取浏览器路径的book
		String uri = request.getRequestURI();
		uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
		Action action = actionMap.get(uri);
		action.ececute(request, response);

	}

}
2.建立子控制器
package com.lz.fraamework;

import java.io.IOException;
import java.lang.reflect.Method;

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

import com.lz.servelt.bookAction;

/**
 * 处理浏览器发出的请求
 * @author lzzxq
 *
 */
public class Action  {
	protected void ececute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String methodName = request.getParameter("methodName");
		try {
			Method m = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class);
		m.setAccessible(true);
		m.invoke(this, request,response);
		} catch (Exception  e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
 3继承action
package com.lz.servelt;

import java.io.IOException;
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.lz.fraamework.Action;

public class bookAction extends  Action{
	private void Ck(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("ck....方法");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("upd....方法");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("del....方法");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("add....方法");
		
	}


}
4.最终效果图

 

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默o。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值