自定义mvc框架

简介: 自定义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.最终效果图

 

相关文章
|
11天前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
15天前
|
前端开发 Java
【案例+源码】详解MVC框架模式及其应用
【案例+源码】详解MVC框架模式及其应用
17 0
|
2月前
|
设计模式 存储 前端开发
MVC 框架的主要问题是什么?
【8月更文挑战第30天】
46 0
|
4月前
|
安全 前端开发 测试技术
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
|
5月前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
53 1
|
5月前
|
前端开发 Java 应用服务中间件
Spring MVC框架概述
Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。
77 1
|
5月前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
335 1
使用Java Web框架:Spring MVC的全面指南
|
5月前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
44 0
|
5月前
|
前端开发 JavaScript Java
MVC框架:SpringMVC(三)
MVC框架:SpringMVC
58 0
|
5月前
|
JSON 前端开发 JavaScript
MVC框架:SpringMVC(二)
MVC框架:SpringMVC
63 0