自定义MVC框架优化

目录

一、前言

二、优化问题

1.子控制器的初始化配置问题

2.页面跳转优化代码冗余问题

3.优化参数封装问题

三、进行优化

1.解决子控制器初始化配置

2.解决页面跳转的代码冗余问题 

3.解决优化参数封装问题

4.中央控制器 


一、前言

在自定义MVC框架原理中讲述了什么是MVC架构,以及它和三层架构的区别,在其简单的代码演示中,还存有一定的缺陷,今天将带大家继续进行优化。

二、优化问题

1.子控制器的初始化配置问题

//用于保存path与action子控制器的映射public Map<String, Action> actionMap=new HashMap<String, Action>();@Overridepublic void init() throws ServletException {actionMap.put("/book", new BookAction());actionMap.put("/goods", new GoodsAction());}

在初始化方法中初始化子配置器的值,当我们每新增一张表,那我们都得在初始化方法中新增一个子配置器的值,我们既然要自定义MVC,最后肯定是要封装成jar包的,封装成jar包后是不能修改的,所以我们要让它变成自动化的。

2.页面跳转优化代码冗余问题

public  void detail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到查看详情💕💕💕");resp.sendRedirect("far.jsp");}public  void del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到删除💕💕💕");	resp.sendRedirect("far.jsp");	}public  void upd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到修改💕💕💕");		resp.sendRedirect("far.jsp");}public  void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到新增💕💕💕");		resp.sendRedirect("far.jsp");}public  void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到主页面💕💕💕");		req.getRequestDispatcher("far.jsp").forward(req, resp);}

我们在子控制器中无论是什么操作都是要进行页面回显的,需要进行重定向response.sendRedirect();或者转发request.getRequestDispatcher().forward();操作(ajax方式除外)这些代码是冗余

3.优化参数封装问题

Book book=new Book();public  String detail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到查看详情💕💕💕");String bid = req.getParameter("bid");String bname = req.getParameter("bname");String price = req.getParameter("price");book.setBid(Integer.valueOf(bid));book.setBname(bname);book.setPrice(Integer.valueOf(price));}

当我们对每张表进行操作时,都要获取参数以及封装对象等,如果一张表有十几个参数,那对我们来说无疑是繁琐的,而且容易出错。

三、进行优化

1.解决子控制器初始化配置

        我们可以利用XML文件来定义和验证MVC配置文件的结构和内容。XML文件可以描述MVC中的模型(Model)、视图(View)和控制器(Controller)之间的关系和行为。拿到配置文件中的信息后,进行反射实例化动态处理。

这个xml文件存放在根目录下,先建立一个Source Folder文件夹将我们的config.xml文件放入即可。

<?xml version="1.0" encoding="UTF-8"?>
<config><action path="/registerAction" type="test.action.RegisterAction"><forward name="success" path="/index.jsp" redirect="true" /><forward name="failed" path="/register.jsp" redirect="false" /></action><action path="/book" type="com.ctb.servlet.BookAction"><forward name="list" path="/far.jsp" redirect="false" /><forward name="exit" path="/far.jsp" redirect="true" /></action>
</config>

action标签中的path:是DispatchServlet类截取到的uri路径。

action标签中的type:是子控制器的全路径名。

forward标签中的name:是重定向还是转发,是否携带数据

forward标签中的path:是跳转的页面。

forward标签中的redirect:判断为true则重定向跳转页面,为false则转发跳转页面

:增删改用重定向,查询用转发

接下来我们将进行xml解析并建模,大家可以翻阅xml解析和xml建模这两篇博客

xml建模过程在里面都有,就不进行代码展示了

2.解决页面跳转的代码冗余问题 

我们可以利用xml配置文件进行优化,在forward标签中的name属性可以给它设置最终方法所返回的值从而进行判断是重定向还是转发

<forward name="list" path="/far.jsp" redirect="false" /><forward name="exit" path="/far.jsp" redirect="true" />

BookAction

package com.ctb.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.ctb.entity.Book;
import com.ctb.framework.Action;
import com.ctb.framework.ModelDriver;
/*** * @author biao** 2023年6月29日:下午6:41:01*/
public class BookAction extends Action {  Book book=new Book();public  String detail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到查看详情💕💕💕");return "list";}public  String del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到删除💕💕💕");return "exit";		}public  String upd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到修改💕💕💕");return "exit";		}public  String add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到新增💕💕💕");return "exit";		}public  String list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到主页面💕💕💕");return "list";		}}

3.解决优化参数封装问题

我们定义一个模型驱动接口,让子控制通用

package com.ctb.framework;
/*** 定义方法,减少代码冗余* 避免了表多和重复代码* @author biao** 2023年6月30日:下午4:48:27*/
public interface ModelDriver<T> {T getModel();}

接下来实现接口即可

package com.ctb.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.ctb.entity.Book;
import com.ctb.framework.Action;
import com.ctb.framework.ModelDriver;
/*** * @author biao** 2023年6月29日:下午6:41:01*/
public class BookAction extends Action implements ModelDriver<Book>{  Book book=new Book();public  String detail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到查看详情💕💕💕");return "list";}public  String del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到删除💕💕💕");return "exit";		}public  String upd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到修改💕💕💕");return "exit";		}public  String add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到新增💕💕💕");return "exit";		}public  String list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎来到主页面💕💕💕");return "list";		}/*** 因为实现类必须重写这个方法以及传递泛型,到时候谁用就是谁*/@Overridepublic Book getModel() {// TODO Auto-generated method stubreturn book;}
}

4.中央控制器 

        最后,优化我们的中央控制器,在解决上述三个问题的同时,我们的DispathServlet类自然也会改变

package com.ctb.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.ctb.model.ActionModel;
import com.ctb.model.ConfigModel;
import com.ctb.model.ConfigModelFactory;
import com.ctb.model.ForwordModel;
import com.ctb.servlet.BookAction;
/*** 请求分发功能* @author biao** 2023年6月29日:下午6:45:13*/
@WebServlet("*.action")
public class DispathServlet extends HttpServlet{//获取文件配置器中的子控制器private ConfigModel configModel;@Overridepublic void init() throws ServletException {try {configModel=ConfigModelFactory.build("/config.xml");} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取uri地址String uri = req.getRequestURI();//截取uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));// 根据path也就是路径(uri)找到配置的type(子控制器)ActionModel ActionModel = configModel.pop(uri);// 防止配置没写完善这里做一个非空判断如果请求路径未配置就抛出一个自定义异常给他if (ActionModel == null)throw new RuntimeException("Config is not configured yet.");// 拿到ActionModel里面的type值(type值就是子控制器的全路径名)String type = ActionModel.getType();try {//根据全路径名获取类类并反射实例化Action action = (Action) Class.forName(type).newInstance();//查看该类是否实现ModelDriver接口if(action instanceof ModelDriver) {ModelDriver md=(ModelDriver)action;//获取泛型传递的实体对象Object model = md.getModel();//获取请求参数的所有的属性及参数Map<String, String[]> parameterMap = req.getParameterMap();//使用工具类将参数值封装到表对应的对象中BeanUtils.populate(model, parameterMap);}//调用子控制器String execute =action.excute(req, resp);//判断是重定向还是转发-根据返回值找到指定ForwardModelForwordModel pop = ActionModel.pop(execute);//如果是ajax不需要配置xml,所以ForwardModel有值的时候才进行跳转判断if(pop!=null) {//拿到redirect进行相对应的判断boolean redirect = pop.isRedirect(); //拿到path进行相对应的页面跳转String path = pop.getPath();if(redirect) {//true重定向//注意这里会丢失项目路径所以要request.getContextPath()resp.sendRedirect(req.getContextPath()+path);}else {//false转发req.getRequestDispatcher(path).forward(req, resp);}		}			} catch (Exception e) {e.printStackTrace();}}}

结果就不演示了,与自定义MVC框架原理中输出结果差不多,重在代码逻辑

✨原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5946.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于matlab使用点特征匹配稳定从抖动平台捕获的视频(附源码)

一、前言 此示例演示如何稳定从抖动平台捕获的视频。稳定视频的一种方法是跟踪图像中的显著特征&#xff0c;并将其用作锚点以消除与其相关的所有扰动。但是&#xff0c;此过程必须了解第一个视频帧中这种显着特征的位置。在此示例中&#xff0c;我们探索了一种无需任何此类先…

亚马逊云科技中国峰会聚焦生成式AI等前沿科技,探讨当下时代的挑战与机遇

6月27日&#xff0c;“2023亚马逊云科技中国峰会”在上海世博中心盛大启幕&#xff01; 亚马逊全球副总裁、亚马逊云科技大中华区执行董事张文翊全面阐述了在当下这个挑战与机遇并存的时代&#xff0c;面对生成式AI等前沿科技带来的新挑战和新机遇&#xff0c;企业需要“面向未…

使用 Docker 高效搭建本地开发环境(详细教程)

Docker本地开发环境的好处 试错 对开发者而言&#xff0c;每天会催生出的各式各样的新技术都需要尝试&#xff0c;然而开发者却不太可能为他们一一搭建好环境并进行测试。时间非常宝贵&#xff0c;正是得益于 Docker&#xff0c;让我们有可能在一条或者几条命令内就搭建完环境…

阿里巴巴开源Chat2DB v1.0.11 初体验

阿里巴巴开源Chat2DB v1.0.11 初体验 前言什么是Chat2DB下载安装安装配置Chat2DB初体验配置数据源准备测试数据认识几个功能菜单开始测试自然语言转SQLSQL解释SQL优化 使用总结后续功能结语 前言 作为一名阿里巴巴开源项目的拥护者&#xff0c;从Chat2DB开源至今都有关注这个开…

Spring 项目过程及如何使用 Spring

文章目录 1.创建 Spring 项目步骤1.1 创建 Maven 项目1.2添加 Spring 框架支持1.3 添加启动项2.如何使用 Spring2.1 存储 Bean 对象2.1.1 创建 Bean对象2.1.2 将 Bean对象注册到容器中 2.2 获取并使用 Bean对象2.2.1 使用 ApplicationContext 获取对象2.2.2 使用 BeanFactory 获…

【裸机开发】GPT 定时器(三) —— 使用GPT实现高精度延时

延时最简单粗暴的方式就是使用空循环来延时&#xff0c;依赖的是时钟主频&#xff08;默认是396M&#xff09;来计数&#xff0c;一旦修改了 6ull 的时钟主频&#xff0c;延时效果就会存在偏差。 因此我们可以使用 EPIT 或者 GPT 的计数功能实现高精度延时&#xff0c;EPIT 是…

探索MediaPipe的人像分割

MediaPipe是Google开源的计算机视觉处理框架&#xff0c;基于TensorFlow来训练模型。图像分割模块提供人像分割、头发分割、多类分割。本文主要探索如何实现人像分割&#xff0c;当然在人像分割基础上&#xff0c;我们可以做背景替换、背景模糊。 目录 一、配置参数与模型 1…

【AIGC】BaiChuan7B开源大模型介绍、部署以及创建接口服务

模型介绍 baichuan-7B是由百川智能开发的一个开源的大规模预训练模型。基于Transformer结构&#xff0c;在大约1.2万亿tokens上训练的70亿参数模型&#xff0c;支持中英双语&#xff0c;上下文窗口长度为4096。在标准的中文和英文权威benchmark&#xff08;C-EVAL/MMLU&#x…

探索思维导图:提升思维能力与效率的利器

思维导图作为一种强大的思考工具&#xff0c;已经被广泛应用于各个领域&#xff0c;从学习、工作到创意思维和项目管理。 本文将为您介绍思维导图的基本概念、使用方法以及它对思维能力和效率提升的价值。通过学习和掌握思维导图&#xff0c;您将能够更系统地组织和表达您的思…

M3 architecure

using one picture from arm document . 1. 3级别流水线哈弗架构 采用三级流水线&#xff0c;为了简单&#xff0c;常见的流水线5级&#xff0c;对于带有OOOB的12级较为常见&#xff0c;足可见M3的架构简化了很多 2. thumb 加ARMV7-M ISA 指令集就是硬件和软件的中间交互规则…

群载波应急广播主机的应用

一、 概述 群载波主机是专为山洪灾害预警、气象预警、地质灾害预警设计的一款智能IP群载波主机。该群载波主机可通过网络实现与控制中心通讯&#xff0c;用户可实时远程控制功放的开关机状态以及检测设备的主要信息。群载波主机主要用于接收网络信号&#xff0c;与控制中心通讯…

剑指 Offer 33. 二叉搜索树的后序遍历序列

输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 观察数组我们可以得到一些初始数据。 数组的最后一位元素为根。根的左子树小于根数据&#xff0c;右子树…