自定义MVC架构【上】(二)

简介: 自定义MVC架构【上】(二)

3.反射优化版

版本三:反射机制优化if条件判断

package com.xw.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 模拟版本三mvc增删改查反射机制优化if条件判断
 */
@WebServlet("/BookClass.do")
public class BookClassCRUDServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
  }
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //接收请求参数
    String CrudName = request.getParameter("CrudName");
    try {
      //获取该servlet的所有方法
      Method m = this.getClass().getDeclaredMethod(CrudName, HttpServletRequest.class, HttpServletResponse.class);
      //打开访问权限
      m.setAccessible(true);
      //调用该类的方法
      m.invoke(this,request,response );
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } 
  }
  private void list(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本三反射机制优化的查询");
  }
  private void del(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本三反射机制优化的删除");
  }
  private void upd(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本三反射机制优化的修改");
  }
  private void add(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本三反射机制优化的新增");
  }
}

不足之处:虽然只需要写一个servlet,也不需要写if条件判断,但是放到项目目中来看,我们不止只有一个book可能还有Goods,Student等 也是需要写多个Servlet,一个Servlet对应一张表。

4.反射增强版

创建DispatchServlet中央控制器接收请求并将请求发送到对应的子控制器并完成init方法中的请求路径与子控制器类的对应配置与doPost方法的请求处理。

package com.xw.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.xw.servlet.BookAction;
import com.xw.servlet.GoodsAction;
/**
 * 中央控制器拦截请求根据请求找到子控制器
 */
@WebServlet("*.do")
public class DispatchServlet extends HttpServlet {
  //保存子控制器
  private Map<String, ActionSupport> actionMap = new HashMap<String, ActionSupport>();
  @Override
  public void init() throws ServletException {
    //初始化子控制值
    actionMap.put("/book", new BookAction());
  }
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取到url请求
     String url = request.getRequestURI();
    //截取指定需要操作的表
    url=url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
    //根据请求截取到key找到对应的子控制器
    ActionSupport actionSupport = actionMap.get(url);
    //调用子控制器处理业务逻辑
    actionSupport.execute(request, response);
  }
}

创建Action抽象子控制器并定义execute方法,用于处理具体的核心业务逻辑处理。

package com.xw.framework;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**子控制器并定义execute方法,用于处理具体的核心业务逻辑处理
 * @author Java方文山
 *
 */
public interface Action {
    public String execute(HttpServletRequest req, HttpServletResponse resp);
}

创建ActionSupport并继承抽象类Action,重写execute方法,通过反射找到对应的Map集合保存的Servlet子控制器实现业务逻辑层处理。

package com.xw.framework;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.corba.se.spi.orbutil.fsm.FSM;
import com.sun.corba.se.spi.orbutil.fsm.Input;
/**重写execute方法,实现业务逻辑处理
 * @author Java方文山
 *
 */
public  class ActionSupport implements Action {
  public String execute(HttpServletRequest req, HttpServletResponse resp) {
    String invoke = null;
    try {
      //接收请求参数
      String CrudName = req.getParameter("CrudName");
      //获取该servlet的所有方法
      Method m = this.getClass().getDeclaredMethod(CrudName, HttpServletRequest.class, HttpServletResponse.class);
      //打开访问权限
      m.setAccessible(true);
      //调用该类的方法
      invoke = (String) m.invoke(this, req, resp);
    } catch (Exception e) {
      e.printStackTrace();
  }
    return invoke;
  }
}

创建BookAction继承ActionSuppor,实现业务逻辑处理。

package com.xw.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xw.framework.ActionSupport;
public class BookAction extends ActionSupport {
  private void list(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的查询——book");
  }
  private void del(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的删除——book");
  }
  private void upd(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的修改——book");
  }
  private void add(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的新增——book");
  }
}

到这里我们就完成我们第四代MVC架构啦!!

当我们需要对另一个表进行操作的时候我们只需要在DispatchServlet中央控制器进行子控制器的配置以及最后子控制器的业务逻辑层编写即可。

例如

我还需要对Goods表进行增删改查操作

①配置子控制器

编写子控制器

package com.xw.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xw.framework.ActionSupport;
public class GoodsAction extends ActionSupport {
  private void list(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的查询——goods");
  }
  private void del(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的删除——goods");
  }
  private void upd(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的修改——goods");
  }
  private void add(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("我是版本四反射机制优化的新增——goods");
  }
}

接下来测试一下看看打印结果

是不是相对前三代更为简单了呢?看完过后你对MVC的用途有没有更为理解?

至此我的首篇自定义MVC就分享到这里啦!!!

相关文章
|
1月前
|
存储 前端开发 调度
Flux 与传统的 MVC 架构模式区别
Flux是一种用于构建用户界面的架构模式,与传统的MVC架构不同,它采用单向数据流,通过Dispatcher统一管理数据的分发,Store负责存储数据和业务逻辑,View只负责展示数据,使得应用状态更加可预测和易于维护。
|
4月前
|
设计模式 前端开发 数据库
哇塞!Rails 的 MVC 架构也太牛了吧!快来看看这令人惊叹的编程魔法,开启新世界大门!
【8月更文挑战第31天】《Rails中的MVC架构解析》介绍了Ruby on Rails框架核心的MVC设计模式,通过模型(Model)、视图(View)和控制器(Controller)三部分分离应用逻辑,利用Active Record进行数据库操作,ERB模板渲染视图,以及控制器处理用户请求与业务逻辑,使代码更易维护和扩展,提升团队开发效率。
81 0
|
1月前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
2月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
3月前
|
设计模式 前端开发 数据库
理解mvc架构
mvc架构
33 4
|
4月前
|
设计模式 存储 前端开发
MVC革命:如何用一个设计模式重塑你的应用架构,让代码重构变得戏剧性地简单!
【8月更文挑战第22天】自定义MVC(Model-View-Controller)设计模式将应用分为模型、视图和控制器三个核心组件,实现关注点分离,提升代码可维护性和扩展性。模型管理数据和业务逻辑,视图负责数据显示与用户交互,控制器处理用户输入并协调模型与视图。通过示例代码展示了基本的MVC框架实现,可根据需求扩展定制。MVC模式灵活性强,支持单元测试与多人协作,但需注意避免控制器过度复杂化。
47 1
|
4月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
49 0
|
4月前
|
存储 前端开发 数据库
神秘编程世界惊现强大架构!Web2py 的 MVC 究竟隐藏着怎样的神奇魔力?带你探索实际应用之谜!
【8月更文挑战第31天】在现代 Web 开发中,MVC(Model-View-Controller)架构被广泛应用,将应用程序分为模型、视图和控制器三个部分,有助于提高代码的可维护性、可扩展性和可测试性。Web2py 是一个采用 MVC 架构的 Python Web 框架,其中模型处理数据和业务逻辑,视图负责呈现数据给用户,控制器则协调模型和视图之间的交互。
41 0
|
5月前
|
存储 前端开发 算法
MVC(Model-View-Controller)架构
MVC架构帮助开发者构建清晰、可维护和可扩展的Web应用程序。
42 2
|
4月前
|
中间件 API 网络架构
Django后端架构开发:从匿名用户API节流到REST自定义认证
Django后端架构开发:从匿名用户API节流到REST自定义认证
46 0