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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: “自定义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
相关文章
|
5天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
8天前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
54 6
|
5天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
14天前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
19天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
101 60
|
5天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
Java的集合框架中,Set接口以其“无重复”特性著称。本文解析了Set的实现原理,包括HashSet和TreeSet的不同数据结构和算法,以及如何通过示例代码实现最佳实践。选择合适的Set实现类和正确实现自定义对象的hashCode()和equals()方法是关键。
18 4
|
8天前
|
Java 编译器 数据库连接
Java中的异常处理机制深度解析####
本文深入探讨了Java编程语言中异常处理机制的核心原理、类型及其最佳实践,旨在帮助开发者更好地理解和应用这一关键特性。通过实例分析,揭示了try-catch-finally结构的重要性,以及如何利用自定义异常提升代码的健壮性和可读性。文章还讨论了异常处理在大型项目中的最佳实践,为提高软件质量提供指导。 ####
|
12天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
12天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
33 2

推荐镜像

更多