自定义MVC(上)

简介: 自定义MVC(上)

一,MVC是什么?

   MVC(Model-View-Controller)是一种软件架构模式,常用于构建用户界面和应用程序的开发中,MVC三个字母又对应着不同的程序逻辑M 模型-V 视图-c 控制器

1.1 Model模型:

   模型代表应用程序的数据和业务逻辑。它负责处理数据的读取、写入、验证、计算和操作等任务。模型通常与数据存储(数据库、文件等)进行交互,以获取和修改数据。

1.2 View 视图

   视图是用户界面的可视化部分,负责展示数据给用户。它从模型中获取数据,并以用户友好的方式呈现给用户。视图可以是任何形式的用户界面,如网页、UI窗口、报表等。

1.3 Controller 控制器

   控制器充当模型和视图之间的中介,负责协调它们之间的交互和通信。它接收用户的输入请求,并根据请求的类型来调用相应的模型操作或视图呈现。控制器还可以根据应用程序的业务逻辑来处理请求,以及控制流程和逻辑。

二,三层架构与MVC的区别(两点):

2.1 架构层次:

   三层架构:

       将应用程序分为三个主要层次:展示层/用户界面层(Presentation Layer/UI)、业务逻辑层(Business Logic Layer/BLL)和数据访问层(Data Access Layer/DAL)。

  mvc架构:

应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。

2.2 关注点:

三层架构:

     强调的是将应用程序的不同职责分离开,使得每个层次关注不同的任务。展示层处理用户交互和呈现数据,业务逻辑层处理应用程序的业务逻辑和工作流程,数据访问层负责与数据存储交互。

mvc:

    关注的是应用程序的组织和交互。模型负责数据的处理和业务逻辑,视图负责用户界面的展示,控制器负责协调模型和视图之间的交互以及处理用户的输入请求

三,MVC流程:

     在进行对数据的增删改查,每个操作都会去相对应的Servlet中去处理数据,会让类和代码越来越多越来越繁琐,并且在进行User或图书管理等进行处理数据,都会跳到不同的Servlet去处理数据(如下图),到后面的其他功能进行增删改查也要去创建不同的servlet去处理数据,导致更多代码和Servlet,很多代码及流程大致都是一样的但是又不得不这样去操作

接下来就发挥到第四点讲到的自定义mvc

 

四,自定义MVC的实现原理

   用户通过浏览器发送一个地址(*.action),在ActionServlet中它只负责帮用户找到相对应用户想处理的具体数据(如图下Action)Action在其中有一个反射方法去统一的处理业务操作,需要操作业务的类继承Action,进行操作相对应的增删改查,再定义相对应的操作的业务类继承Action将结果返回到客户手中

再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>第四版 最终</p>
<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>

接下来就是中央处理器ActionServlet代码:

package com.LiuBing.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
/**
 * 中央控制器
 */
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("*.action")
public class DispatherServlet extends HttpServlet {
  //定义一个map集合   
  public Map<String, Action> actionmap= new HashMap<String, Action>();
  @Override
  public void init(ServletConfig config) throws ServletException {
    actionmap.put("/Book",new BookAction());
  }
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    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 action = actionmap.get(uri);
       action.execut(req, resp);
  }
}

Action处理请求,通过反射获取相对应类对象

如下代码:

package com.LiuBing.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 request, HttpServletResponse response)
     throws ServletException, IOException {
    String MethodName = request.getParameter("methodName");// 接受前端请求的值
    try {
      // getDeclaredMethod获取指定类 通过前端nama值获取指定的类
      Method m = this.getClass().getDeclaredMethod(MethodName, HttpServletRequest.class,
          HttpServletResponse.class);
      m.setAccessible(true);// 打开私有权限
      m.invoke(this, request, response);// 将当前类BookServlet 反出去
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Bookaction继承相对应操作处理请求(Action)

如下代码:

package com.LiuBing.framework;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BookAction extends Action{
  public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         System.out.println("进入的是增加BookaddServlet....");
    }
  public void del(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         System.out.println("进入的是删除BookadelServlet....");
    }
  public void upd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         System.out.println("进入的是修改BookupdServlet....");
    }
  public void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         System.out.println("进入的是查询BooklistServlet....");
    }
}

最后运行结果:

 

目录
相关文章
|
2月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
7月前
|
前端开发 Java
自定义mvc的增删改查
自定义mvc的增删改查
71 0
|
7月前
|
XML 前端开发 数据格式
自定义MVC引用XML配置文件实现
自定义MVC引用XML配置文件实现
71 0
|
7月前
|
设计模式 前端开发 搜索推荐
自定义mvc框架
自定义mvc框架
77 0
|
设计模式 前端开发
自定义mvc
自定义mvc
56 0
|
XML 前端开发 数据格式
自定义MVC超详细易懂----增删改查
自定义MVC超详细易懂----增删改查
115 0
|
存储 前端开发 架构师
自定义MVC实现 很详细(下)---优化版
自定义MVC实现 很详细(下)---优化版
|
存储 设计模式 前端开发
自定义MVC实现
自定义MVC实现
|
安全 Java
自定义mvc----增删改查终极篇
自定义mvc----增删改查终极篇
50 0
|
XML 设计模式 前端开发
自定义MVC---引用XML
自定义MVC---引用XML
54 0