“自定义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
相关文章
|
2月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
93 1
|
2月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
51 1
|
10天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
3天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
22 12
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
103 34
|
1月前
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
80 4
|
2月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
60 4
|
2月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
89 14
|
3月前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
94 1
|
JSON 前端开发 Java
手写一个简单java的mvc框架
最近有人说要帮我介绍对象,让我帮他写一个Javaweb项目
724 0
手写一个简单java的mvc框架

推荐镜像

更多