自定义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表进行增删改查操作

①配置子控制器

image

 ②编写子控制器

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");
        
    }
    
}

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

image

image

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

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

相关文章
|
23天前
|
前端开发 Java API
什么是RESTful API,Spring MVC如何支持RESTful架构
RESTful API(Representational State Transfer)是一种基于HTTP协议的软件架构风格,用于设计网络应用程序的API。它强调使用标准的HTTP方法(GET、POST、PUT、DELETE等)来进行资源的操作,以及使用URI来标识资源。RESTful API的设计目标是简单、可扩展、易于理解和使用。
|
1月前
|
JavaScript 前端开发 容器
ExtJs 4.x MVC 架构
ExtJs 4.x MVC 架构
|
2月前
|
设计模式 存储 前端开发
MVC-架构
MVC-架构
40 0
|
3月前
|
XML 前端开发 数据格式
自定义MVC架构【下】(二)
自定义MVC架构【下】(二)
21 0
|
3月前
|
XML 前端开发 Java
自定义MVC架构【下】(一)
自定义MVC架构【下】
23 0
|
3月前
|
XML 存储 前端开发
自定义MVC架构【中】
自定义MVC架构【中】
16 0
|
3月前
|
设计模式 前端开发 Java
自定义MVC架构【上】(一)
自定义MVC架构【上】
24 0
|
5月前
|
前端开发
架构——MVC的升华
结合上篇说到 架构——MVC的理解 ,本次又被彻底洗礼了一次,通过量子化的思考方式、学习方式将mvc又重新做了梳理,又岂止是上了一个层次。
|
5月前
|
存储 设计模式 开发框架
架构——MVC的理解
我一直以为我理解的MVC就是springMVC这些呢;前段时间和高人针对于MVC交流了一下,具体一点应该是请教了一下;结果完全超乎我的理解,没想到springmvc、mvp、后端mvc、mvvm都只是它的一个运用。
|
6月前
|
前端开发 Java 调度
《Spring MVC》 第十一章 单体架构任务调度
《Spring MVC》 第十一章 单体架构任务调度
81 0
相关产品
云迁移中心
推荐文章
更多