“自定义MVC原理解析与示例:打造优雅、可定制化的Java应用程序”(上)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: “自定义MVC原理解析与示例:打造优雅、可定制化的Java应用程序”


引言

一、MVC是什么?它的核心理念是什么?

MVC将应用程序分为三个核心组件:模型、视图和控制器。模型负责管理数据和业务逻辑,视图负责展示数据给用户,控制器作为中介协调模型和视图之间的交互。

二、自定义MVC的优势有哪些?

相较于传统MVC框架,自定义MVC具有以下优势:

  • 灵活性:自定义MVC允许开发人员根据具体需求灵活定义和组织模型、视图和控制器。
  • 可扩展性:自定义MVC框架可以根据应用程序的变化进行扩展和定制。
  • 可定制性:自定义MVC允许开发人员根据业务需求进行定制,以满足特定的应用程序要求。

三、自定义MVC的实现步骤

  • 模型的实现:定义模型类和接口,处理数据的存储和操作,包括业务逻辑的处理。
  • 视图的实现:创建视图类和接口,展示模型中的数据给用户,处理用户的操作和输入。
  • 控制器的实现:定义控制器类和接口,接收视图和用户的输入,调度模型的处理逻辑和数据更新,更新视图以反映新的状态。

五、模型(Model)的实现细节

模型(Model)的实现细节:

  • 数据存储和管理:模型负责处理数据的存储和管理。这可以通过使用数据库、文件系统或内存等持久化手段来实现。模型类应该包含读取、写入、更新和删除数据的方法。
  • 业务逻辑处理:模型类应该包含处理业务逻辑的方法。这些方法可以根据具体的需求来实现,例如数据验证、计算统计数据、执行复杂的业务规则等。
  • 数据访问:模型类可以通过数据访问对象(如DAO、Repository)来访问底层数据存储。数据访问层应该提供标准的CRUD(创建、读取、更新、删除)操作,并处理与数据存储相关的细节,如连接数据库、执行SQL语句等。
  • 业务领域的封装:模型类可以通过聚合关系、继承或其他方式来封装业务领域的相关概念。这样可以将业务逻辑和数据操作组织成更具可读性和可维护性的代码结构。
  • 事件和通知:模型类可以使用事件和通知机制来通知其他组件(如控制器或观察者)关于数据的变化。这样可以实现松耦合和即时的数据更新。

四、案例

4.1 利用xml建模反射优化

利用xml建模反射的博客连接

package com.yuan.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.yuan.framework.model.ActionModel;
import com.yuan.framework.model.ConfigModel;
import com.yuan.framework.model.ConfigModelFactory;
@WebServlet("*.action")
public class DispathServlet extends HttpServlet{
  public Map<String, Action> map = new HashMap<>();
  private ConfigModel configModel;
  @Override
  public void init() throws ServletException {
    try {
      configModel = ConfigModelFactory.build("mvc.xml");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  @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 {
      //http://localhost:8080/Y1_J2EE_Web/book.action
      String uri = req.getRequestURI(); 
      uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
      ActionModel actionModel = configModel.pop(uri);
      if(actionModel==null)
        throw new RuntimeException("action not config");
      Action action;
      try {
        action = (Action) Class.forName(actionModel.getType()).newInstance();
        action.execute(req, resp);
      } catch (Exception e) {
        e.printStackTrace();
      } 
  }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
• 28
• 29
• 30
• 31
• 32
• 33
• 34
• 35
• 36
• 37
• 38
• 39
• 40
• 41
• 42
• 43
• 44
• 45
• 46
• 47
• 48
• 49
• 50
• 51
• 52
• 53
• 54
• 55
• 56
• 57
• 58
• 59

4.2 优化方法调用结果集跳转问题

4.2.1 中央控制器优化

package com.yuan.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.yuan.framework.model.ActionModel;
import com.yuan.framework.model.ConfigModel;
import com.yuan.framework.model.ConfigModelFactory;
import com.yuan.framework.model.ForwardModel;
@WebServlet("*.action")
public class DispathServlet extends HttpServlet{
  public Map<String, Action> map = new HashMap<>();
  private ConfigModel configModel;
  @Override
  public void init() throws ServletException {
    try {
      configModel = ConfigModelFactory.build("/mvc.xml");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  @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 {
      //http://localhost:8080/Y1_J2EE_Web/book.action
      String uri = req.getRequestURI(); 
      uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
      ActionModel actionModel = configModel.pop(uri);
      if(actionModel==null)
        throw new RuntimeException("action not config");
      Action action;
      try {
        action = (Action) Class.forName(actionModel.getType()).newInstance();
        String execute = action.execute(req, resp);
        ForwardModel forwardModel = actionModel.pop(execute);
        if(forwardModel!=null) {
          boolean redirect = forwardModel.isRedirect();
          String path = forwardModel.getPath();
          if(redirect) {
            resp.sendRedirect(req.getContextPath()+"/"+path);
          }else {
            req.getRequestDispatcher(path).forward(req, resp);
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      } 
  }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
• 28
• 29
• 30
• 31
• 32
• 33
• 34
• 35
• 36
• 37
• 38
• 39
• 40
• 41
• 42
• 43
• 44
• 45
• 46
• 47
• 48
• 49
• 50
• 51
• 52
• 53
• 54
• 55
• 56
• 57
• 58
• 59
• 60
• 61
• 62
• 63
• 64
• 65
• 66
• 67
• 68
• 69
• 70
• 71
• 72

4.2.2 Action父类优化

package com.yuan.framework;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 子控制区
 * @author yuanh
 *
 */
public class Action {
  public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String methodName = req.getParameter("methodName");
    String res = "";
    try {
      //拿到方法名
      Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
      method.setAccessible(true);//打开方法权限
      res = (String) method.invoke(this, req,resp);//设置属性和值
    } catch (Exception e) {
      e.printStackTrace();
    }
    return res;
  }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
• 28
• 29
• 30
• 31
• 32
• 33
• 34
相关文章
|
14天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
74 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
21天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
19天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
21天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
56 2
|
1月前
|
Java 编译器
Java 泛型详细解析
本文将带你详细解析 Java 泛型,了解泛型的原理、常见的使用方法以及泛型的局限性,让你对泛型有更深入的了解。
56 2
Java 泛型详细解析
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
61 12
|
2月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
203 6
|
1月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
1月前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
43 2

推荐镜像

更多