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

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

4.2.3 Action的子类BootAction的优化

package com.yuan.framework;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Action的子类 主要承载的是Book的增删改查
 * @author yuanh
 *
 */
public class BookAction extends Action {
  public String add(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("增加");
    return "toList";
  }
  public String del(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("删除");
    return "toList";
  }
  public String edit(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("修改");
    return "toList";
  }
  public String sellist(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("查询");
    return "List";
  }
}
• 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

4.3 优化参数的封装

4.3.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 org.apache.commons.beanutils.BeanUtils;
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();
        if(action instanceof ModelDrivern) {
          ModelDrivern md = (ModelDrivern) action;
          Object bean = md.getModel();
          Map<String, String[]> map = req.getParameterMap();
          BeanUtils.populate(bean, map);
        }
        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
• 73
• 74
• 75
• 76
• 77
• 78
• 79
• 80
• 81

六、视图(View)的实现细节

  • 界面设计:视图负责定义和设计用户界面。这包括确定布局、选择合适的控件和组件、设定样式和主题等。视图应该与用户交互舒适,并提供良好的用户体验。
  • 数据展示:视图负责将模型中的数据展示给用户。这可以通过显示文本、图形、表格或其他形式的界面元素来实现。视图应该负责对数据进行格式化和显示,以便用户能够理解和使用。
  • 用户交互:视图应该能够处理用户的输入,如按钮点击、菜单选择、文本输入等。视图可以通过事件监听、回调函数或其他方式来捕获用户交互事件,并将其传递给控制器进行处理。
  • 视图更新:当模型中的数据发生变化时,视图应该能够及时更新展示。这可以通过使用观察者模式、绑定机制或其他方式来实现。视图应该根据数据的变化来更新界面元素,以反映最新的数据状态。
  • 错误处理:视图应该能够处理异常和错误情况,并向用户提供有意义的错误信息。这包括捕获和处理异常、显示错误提示、弹出对话框等操作,以提供良好的用户体验和错误恢复机制。
  • 国际化和本地化:视图应该支持国际化和本地化,在不同的语言和地区提供适当的界面文本、日期时间格式、货币符号等。这可以通过使用资源文件、多语言支持库或其他方式来实现。

七、控制器(Controller)的实现细节

  • 7.1 控制器类的创建:创建一个控制器类来实现控制器接口或继承一个抽象的控制器类。控制器类负责处理用户的输入、调度模型方法和更新视图。
  • 7.2 用户输入处理:控制器需要获取用户的输入以执行相应的操作。这可以通过各种方式实现,如监听用户界面的事件、接收用户的请求或从视图对象中获取输入。
  • 7.3 调度模型方法:控制器通过调用模型的方法对数据和业务逻辑进行处理。可以通过依赖注入或其他方式获取模型对象,并调用合适的方法来操作数据、执行业务逻辑或访问后端服务。
  • 7,4 更新视图:控制器负责将处理结果反馈给视图,以更新用户界面。通过调用视图中的方法,将获取到的数据传递给视图进行展示,或者通知视图进行特定的操作。
  • 7.5 业务逻辑处理:控制器可以执行一些额外的业务逻辑,例如验证用户的输入、处理异常或决定执行哪个模型方法。这样可以将视图和模型之间的复杂细节封装在控制器中,提高代码的可维护性和可复用性。
  • 7.6 控制器与视图交互:控制器需要与视图进行交互来获取用户输入并更新视图。可以通过依赖注入或其他方式获取视图对象,并调用视图的方法来获取用户输入、更新展示内容或触发其他操作。
  • 7.7 错误处理:控制器应该能够处理异常和错误情况,以提供良好的用户体验。可以通过捕获异常、显示错误信息或执行适当的恢复操作来处理错误。
  • 7.8 控制器的生命周期:控制器的生命周期通常与视图的生命周期相关联。在视图创建时创建控制器实例,在视图销毁时销毁控制器实例。这样可以确保控制器始终与视图保持一致,并且资源的管理更加清晰。

八、自定义MVC的设计模式和最佳实现有哪些?

8.1 原理

自定义MVC(Model-View-Controller)是一种软件架构模式,将应用程序分为模型、视图和控制器三个部分,实现数据、展示和用户交互的分离。模型负责处理数据和业务逻辑,视图负责展示数据给用户,控制器负责协调模型和视图之间的交互。

  • 8.1.1 设计模式:在自定义MVC中,可以使用以下设计模式来优化架构和提高灵活性:
  • 8.1.2 观察者模式:模型可以使用观察者模式来通知视图更新,当模型数据发生变化时,视图可以自动更新展示。
  • 8.1.3 策略模式:控制器可以使用策略模式来选择合适的业务处理逻辑,根据用户的操作和需求来决定调用哪个具体的模型方法。
  • 8.1.4 工厂模式:可以使用工厂模式来创建模型和视图的实例,使得代码更具可扩展性和灵活性。
  • 8.1.5 模板方法模式:视图可以使用模板方法模式来定义通用的展示逻辑,而具体的展示细节可以由子类来实现。

8.2 最佳实践

在设计和实现自定义MVC时,可以采用以下最佳实践来提升代码质量和可维护性:

  • 8.2.1 单一职责原则(SRP):每个类、接口和方法应该只负责一个明确的责任,避免功能耦合和责任过重。
  • 8.2.2 依赖倒置原则(DIP):依赖抽象,而不是依赖具体实现。使用接口或抽象类来定义模型、视图和控制器之间的依赖关系,以提高代码的灵活性和可测试性。
  • 8.2.3 松耦合和高内聚:模型、视图和控制器之间应该通过接口或抽象类进行交互,减少彼此的直接依赖,以实现松耦合。同时,每个部分内部的代码应该是高内聚的,只处理与自身相关的逻辑。
  • 8.2.4 适当的分层和模块化:按照职责对代码进行合理的分层和模块化,使得不同部分的代码互相隔离,并且易于理解、修改和维护。
  • 8.2.5 可扩展性和可测试性:通过使用接口、设计模式和最佳实践,使得自定义MVC架构具有良好的可扩展性和可测试性。这样,可以轻松添加新的模型、视图或控制器,并编写单元测试来验证各个部分的功能。

九、架构和扩展性考虑

探讨如何基于自定义MVC架构构建可扩展和易维护的应用程序。讨论接口和抽象的使用,模块化开发的思想,以及如何支持功能扩展和业务变化。

性能和安全性优化

强调性能和安全性在自定义MVC应用程序中的关键,提供一些实践建议,如最小化网络请求、数据缓存、安全的用户认证和授权等。

十、总结

自定义MVC框架就像是一场华丽的舞会,每个成员都有自己的角色:

  • 模型(Model)就像是舞会中的舞者,负责展示自己的独特技巧和美丽外表,让人们眼前一亮。
  • 视图(View)就像是舞会的舞台,为舞者们提供一个展现自己的舞台,让观众们赞叹不已。
  • 控制器(Controller)就像是舞会的舞曲,它通过指挥舞者和音乐的节奏,使整个舞会变得有序而有魅力。
    而框架配置和路由,就像是舞会的礼宾部门,负责引导每个舞者的角色和方向,让整个舞会充满喜悦和欢乐。

总之,自定义MVC原理就是让舞者们在舞台上翩翩起舞,让观众们目不转睛,留下美好的回忆。记住,用代码来编排这场华丽的舞蹈吧!


相关文章
|
12天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
51 13
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
80 10
|
6天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
3天前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
4天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
6天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
43 1
|
24天前
|
机器学习/深度学习 搜索推荐 API
淘宝/天猫按图搜索(拍立淘)API的深度解析与应用实践
在数字化时代,电商行业迅速发展,个性化、便捷性和高效性成为消费者新需求。淘宝/天猫推出的拍立淘API,利用图像识别技术,提供精准的购物搜索体验。本文深入探讨其原理、优势、应用场景及实现方法,助力电商技术和用户体验提升。
|
26天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
26天前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2

推荐镜像

更多