自定义MVC实现

简介: 自定义MVC实现

一.MVC模式

       1.1 MVC是什么??

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

           通过将应用程序的逻辑分离到不同的组件中,MVC模式提高了代码的可维护性、复用性和可测试性。它也促进了团队的协作和并行开发,因为不同的成员可以独立地开发模型、视图和控制器。许多现代的Web框架和应用程序框架都使用MVC模式作为其设计基础。

       1.2 MVC结构

       MVC代表模型-视图-控制器,它将应用程序的逻辑划分为三个组件:

  1. 模型(Model):模型表示应用程序的数据和业务逻辑。它负责管理数据的存储、检索、更新和验证,并提供与数据相关的功能。模型通常是应用程序中最基础的组件。
  2. 视图(View):视图是用户界面的表示。它负责将模型的数据以合适的方式呈现给用户,例如在屏幕上显示文本、图片、表格等。视图通常是根据用户的输入和模型的数据来动态更新。
  3. 控制器(Controller):控制器是模型和视图之间的协调者。它接收来自用户的输入,并根据这些输入更新模型和视图。控制器将用户的操作转发给模型进行处理,并根据模型的状态更新视图。控制器还可以处理应用程序中的其他逻辑,例如验证用户输入、处理错误等。

二.MVC与三层架构的区别

  1. 概念和关注点:
  • 三层架构:三层架构将应用程序划分为表示层、业务逻辑层和数据访问层,强调的是应用程序的层次结构和数据流,重点是将业务逻辑和数据操作隔离开来。
  • MVC:MVC将应用程序划分为模型、视图和控制器,强调的是在用户界面开发中的分层和逻辑划分,重点是将界面逻辑、业务逻辑和数据操作进行解耦。
  1. 应用范围:
  • 三层架构:三层架构广泛适用于不同类型的应用程序,包括Web应用程序、客户端/服务器应用程序和分布式系统等。
  • MVC:MVC主要应用于用户界面的开发,特别是Web应用程序和桌面应用程序等。
  • 三层架构是基于业务逻辑来分的,而MVC是基于页面来分的;
  • 三层架构模式是体系结构模式,MVC是设计模式;
  • 三层架构模式又可归于部署模式,MVC可归于表示模式。

三.自定义MVC工作原理

四.自定义MVC的实现(以User.java为例实现)

      4.1  根据上图,我们先定义ActionServlet 也就是中央控制器:负责接受请求,然后安排合适的servlet来执行从浏览器传来的请求

       这里的步骤

               1.获取路径

               2.截取 User

               3.因为要通过截取的/User 去找UserServlet,所以创建一个Map集合

               4.进行初始化,将所有的Servlet添加进去

               5.获取

package com.yinzi.jar;
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.yinzi.Servlet.UserServlet;
/**
 * 中央控制器:负责接受请求,然后安排合适的servlet来执行请求
 * @author yinzi
 * @2023年6月29日
 */
@WebServlet("*.servlet")
public class ActionServlet extends HttpServlet{
  //3.因为要通过截取的/User 去找UserServlet,所以创建一个Map集合
  Map<String, Action> actionMap=new HashMap<String, Action>();
  //4.进行初始化,将所有的Servlet添加进去
  @Override
  public void init() throws ServletException {
    actionMap.put("/User", new UserServlet());
  }
  @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 {
    //http://localhost:8080/MVC/User.jsp
    //获取路径,截取 User 目的是为了知道需要调用哪个servlet里的方法
    //1.获取路径
    String uri = req.getRequestURI();
    //2.截取 User
    uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));//截取的结果为:/User
    //5.获取
    System.out.println(uri);
    Action action = actionMap.get(uri);
    //调取
    action.execute(req, resp);
  }
}

4.2  控制器(Controller)

然后建立一个Action类,它是子控制器,负责处理从浏览器传来的请求 ,是其他类增删改查类的父类,它去调浏览器请求的方法,所有这里运用到反射 来处理请求,通过它来调相应Servlet,它需要从获取前端的参数,来判断要调用哪个方法。

package com.yinzi.jar;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 子控制器:是其他类增删改查类的父类,它去调浏览器请求的方法,所有这里运用到反射
 * 来处理请求,通过它来调相应Servlet
 * @author yinzi
 * @2023年6月29日
 *
 */
public class Action {
  protected void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获取参数methodName
    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();
    }
  }
}

4.3  作为演示,我这里没有写具体的方法,这个类就是写增删改查的具体的方法

package com.yinzi.Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.yinzi.jar.Action;
/**
 * 用户的Servlet,在这个方法里写增删改查
 * @author yinzi
 * @2023年6月29日
 *
 */
public class UserServlet extends Action{
  public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("我是新增");
  }
  public void del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("我是删除");
  }
  public void upd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("我是修改");
  }
  public void query(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("我是查询所有");
  }
}

4.4 视图(view)

这里我也没有写上面内容,这就是写要展示的内容

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="User.servlet?methodName=add">新增</a>
<a href="User.servlet?methodName=del">删除</a>
<a href="User.servlet?methodName=upd">修改</a>
<a href="User.servlet?methodName=query">查询</a>
</body>
</html>

效果:

我选择的是删除

相关文章
|
5月前
|
XML 开发框架 前端开发
J2EE之自定义MVC框架知识(中篇)
J2EE之自定义MVC框架知识(中篇)
59 0
|
5月前
|
存储 前端开发 数据可视化
自定义MVC(上)
自定义MVC(上)
48 1
|
25天前
|
前端开发 Java
自定义mvc的增删改查
自定义mvc的增删改查
38 0
|
4月前
|
XML 前端开发 数据格式
自定义MVC引用XML配置文件实现
自定义MVC引用XML配置文件实现
41 0
|
4月前
|
设计模式 前端开发 搜索推荐
自定义mvc框架
自定义mvc框架
39 0
|
4月前
|
设计模式 前端开发
自定义mvc
自定义mvc
29 0
|
4月前
|
XML 前端开发 数据格式
自定义MVC超详细易懂----增删改查
自定义MVC超详细易懂----增删改查
|
4月前
|
存储 前端开发 架构师
自定义MVC实现 很详细(下)---优化版
自定义MVC实现 很详细(下)---优化版
|
4月前
|
安全 Java
自定义mvc----增删改查终极篇
自定义mvc----增删改查终极篇
23 0
|
4月前
|
XML 设计模式 前端开发
自定义MVC---引用XML
自定义MVC---引用XML
36 0