自定义mvc原理

45 篇文章 0 订阅
订阅专栏
1 篇文章 0 订阅
订阅专栏

目录

一:自定义mvc框架工作原理图:

二. 什么是MVC:

三.具体实现:

1.编写中央处理器的servlet

2.Action接口定义

3.实现Action的接口定义:

4.实现子控制器:

 5.请求分发功能

6.运行结果:

7.代码完善:

7.1使用配置文件配置action

7.2.晚上中央处理器:


一:自定义mvc框架工作原理图:


 ActionSevlet:中央控制器(主要作用于控制一个或者多个子控制器Action去处理请求)

核心组件说明:

  • 中央控制器(ActionServlet): 负责接收所有的请求,并分别给控制器具体处理。
  • 子控制器(Action):负责处理中央处理器分配的请求
  • 视图(view): jsp页面,负责显示
  • 模型(Model): 负责业务处理逻辑

二. 什么是MVC:


MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。 它是一种软件设计典范。

用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。

  • 模型(model): 它是应用程序的主体部分,主要包括业务逻辑模块(web项目中的dao类)和数据模块(pojo类)。pojo一般可以叫做实体域模型,dao和service称为过程域模型。
  • 视图(view): 用户与之交互的界面、在web中视图一般由jsp,html组成,其他的还包括android,ios等等。
  • 控制器(controller): 接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用。

不足的地方:

  • 增加系统结构和实现的复杂性。对于简单的界面,严格遵守MVC,需要使模型、视图与控制器分离,增加系统复杂性
  • 视图和控制器之间的关系太过紧密了

三.具体实现:

1.编写中央处理器的servlet

/**
 * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求
 * @author Administrator
 */
public interface Action {
	
	/**
	 * 处理请求
	 * @param request  请求
	 * @param response 响应
	 * @return String 返回转发或重定向的jsp页面名称
	 */
	String exeute(HttpServletRequest request, HttpServletResponse response);

}

2.Action接口定义

/**
 * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求
 * @author Administrator
 */
public interface Action {
	
	/**
	 * 处理请求
	 * @param request  请求
	 * @param response 响应
	 * @return String 返回转发或重定向的jsp页面名称
	 */
	String exeute(HttpServletRequest request, HttpServletResponse response);

}/**
 * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求
 * @author Administrator
 */
public interface Action {
	
	/**
	 * 处理请求
	 * @param request  请求
	 * @param response 响应
	 * @return String 返回转发或重定向的jsp页面名称
	 */
	String exeute(HttpServletRequest request, HttpServletResponse response);

}

3.实现Action的接口定义:

/**
 * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求
 * @author Administrator
 */
public interface Action {
	
	/**
	 * 处理请求
	 * @param request  请求
	 * @param response 响应
	 * @return String 返回转发或重定向的jsp页面名称
	 */
	String exeute(HttpServletRequest request, HttpServletResponse response);

}

4.实现子控制器:

public class BookAction implements Action {

	@Override
	public String exeute(HttpServletRequest request, HttpServletResponse response) {
		
		return "bookList";
	}

}
public class StudentAction implements Action {

	@Override
	public String exeute(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		return "students";
	}

}

 5.请求分发功能

**
 * 中央控制器,负责接收所有的请求并分别给控制器具体处理
 * @author Administrator
 */
@WebServlet("*.action")
public class ActionDispatchServlet extends HttpServlet {
	
	//用于保存path与action子控制器的映射
	public static Map<String, Action> actionMap = new HashMap<>();
	
	static {
		actionMap.put("/studentAction", new StudentAction());
		actionMap.put("/bookAction", new BookAction());
	}
	
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		doPost(request, response);
	}
	
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
		String servletPath = request.getServletPath();
		String path = servletPath.split("\\.")[0];
		
		Action action = actionMap.get(path);
		
		String rpath = action.exeute(request, response);
		
		System.out.println(rpath);
	}

}

6.运行结果:

7.代码完善:


7.1使用配置文件配置action

studentAction是在上面定义的,如图所示:

type是全新命名,如图所示:、

 

name是jsp的名字:

后面的path就是jsp的权限命名

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config[
	<!ELEMENT config (action*)>
	<!ELEMENT action (forward*)>
	<!ELEMENT forward EMPTY>
	<!ATTLIST action
	  path CDATA #REQUIRED
	  type CDATA #REQUIRED
	>
	<!ATTLIST forward
	  name CDATA #REQUIRED
	  path CDATA #REQUIRED
	  redirect (true|false) "false"
	>
]>
<config>
	<action path="/studentAction" type="org.lisen.mvc.action.StudentAction">
		<forward name="students" path="/students/studentList.jsp" redirect="false"/>
	</action>
</config>

7.2.晚上中央处理器:

@WebServlet("*.action")
public class ActionDispatchServlet extends HttpServlet {
	
	//用于保存path与action子控制器的映射
	//public static Map<String, Action> actionMap = new HashMap<>();
	
	private static ConfigModel configModel;
	
	static {
		//actionMap.put("/students", new StudentAction());
		//actionMap.put("/books", new BookAction());
		configModel  = ConfigModelFactory.getConfigModel();
	}
	
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws IOException, ServletException {
		doPost(request, response);
	}
	
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws IOException, ServletException {
		
		String servletPath = request.getServletPath();
		String path = servletPath.split("\\.")[0];
		
		Action action = getActionByPath(path);
		String name = action.exeute(request, response);
		
		ForwardModel forwardModel = getForwardModel(path, name);
		if (forwardModel.isRedirect()) {
			response.sendRedirect(request.getContextPath() + "/" + forwardModel.getPath());
		} else {
			request.getRequestDispatcher(forwardModel.getPath()).forward(request, response);
		}
	}
	
	//通过请求路径获取对应的action实例
	private Action getActionByPath(final String path) {
		ActionModel action = configModel.find(path);
		try {
			Class<?> clazz = Class.forName(action.getType());
			return (Action)clazz.newInstance();
		} catch (Exception e) {
			throw new RuntimeException("创建Action实例异常"+e.getMessage(), e);
		}
	}
	
	public ForwardModel getForwardModel(String path, String name) {
		return configModel.find(path).find(name);
	}

}

 

springMVC学习笔记,springMVC的组件及执行流程
weixin_33856370的博客
08-20 283
springMVC的组件:1、前端控制器DispatcherServlet(不需要程序员开发)作用:接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。2、处理器映射器HandlerMapping(不需要程序员开发)作用:根据请求的url查找Handler3、处理器适配器HandlerAdapter作用:按照特定...
SpringMVC框架工作流程图及工作原理
辉哥的博客
07-10 3万+
SpringMVC框架工作原理图SpringMVC的具体工作原理1、客户端用户发送请求至前端控制器DispatcherServlet。2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、HandlerMapping处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给Dispatc...
SpringMVC工作原理(含案例图解)
热门推荐
阿顾的博客
07-05 4万+
SpimgMVC工作原理 第1步:浏览器发送指定的请求都会交给DispatcherServlet,他会委托其他模块进行真正的业务和数据处理 第2步:DispatcherServlet会查找到HandleMapping,根据浏览器的请求找到对应的Controller,并将请求交给目标Controller 第3步:目标Controller处理完业务后,返回一个ModelAndView给Dispa...
MVC框架基本工作原理
pk5478的博客
04-15 6253
MVC工作原理 Model 模型层,一般对数据的处理会放在这层 View 视图层,渲染html页面,展示给用户 Controller 控制器层,处理逻辑,调用Model和view的相关方法 单一入口的工作原理 用一个处理程序文件处理所有HTTP请求,根据请求时的参数的不同区分不同模块和操作请求 模板引擎的理解 ...
MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理
weixin_34055787的博客
10-24 2226
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎。这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之处,还希望大家斧正,博主感激不尽! 本文原创地址:http://www.cnblogs.com/landeanfen/p/5989092.html MVC源码学习系列文章目录: MVC系列—...
自定义MVC原理
weixin_65808248的博客
06-24 205
自定义mvc原理
自定义MVC框架
01-11
自己写的MVC框架源码,实现了几乎所有Struts的功能,利用此代码可以很好的了解市面上的MVC框架,包括Spring MVC和Struts。
第二课:通过MVC原理自定义MVC框架实现1
08-08
分别是:RequestMappingHandlerMapping与BeanNameUrlHandlerMapping实现组成结构:RequestMappingH
Struts 2 自定义MVC 框架
07-27
为更好的了解struts2的框架原理 自定义框架 去更好的理解和认识struts
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx
12-25
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
mvc自定义框架
11-21
通过自定义mvc框架,帮助初学者更好的去理解struts1,2的原理
Spring MVC框架原理图
y1991024的博客
07-18 1350
1.SpringMVC框架原理图: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler 可以根据xml配置、注解进行查找 第三步:处理器映射器HandlerMapping向前端控制器返回Handler 第四步:前端控制器调用处理器适配器去执行Handler 第五步:处理
MVC框架原理
phper_的博客
07-06 2605
MVC概述        MVC全程是Model View Controller        模型(model) ---用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。       视图(view)---是用于处理数据显示的部分。通常视图是依据模型数据创建的。       控制器(Controller)---是处理用户交互的部分,向模型发送数据,向视图赋值。特点    有助于...
Spring MVC原理
07-02 169
初探Spring MVC 我们首先引用《Spring in Action》上的一张图来了解Spring MVC的核心组件和大致处理流程: 从上图可以看出: ① DispatcherServlet是个前台控制器,负责接收request并将request转发给对象的处理组件。 ② HandlerMapping是完成url到Controller映射的组件。DispatcherS...
【仿真建模-anylogic】FlowchartPort原理解析
zhaoyaxuan001的博客
06-14 323
FlowchartPort是流图组件端口的基类,一般不会直接使用;如果需要自行封装组件库时会用到;FlowchartPort继承Port类,并定义了一系列抽象函数;用于输入端口判定此刻是否不能接收Agent。用于输出端口判定是否有Agent准备离开。判定端口是否发生错误。
Java02】Java中数组的定义与初始化
饮冰室
06-10 605
推荐第一种方式。这种方式容易让人理解,数据类型是type[],对象名称是arrayName。第二种方式有些老旧了。由于数组是一种引用变量(也就是一个指针),所以定义的时候还没有指向任何有效的内存空间,因此在定义数组的时候不能指定数组的长度,也不能直接使用。必须进行初始化。可以使用var让系统自动推断变量类型,既可以用于静态初始化,也可以用于动态初始化。
盲盒App开发时有哪些技术框架可以借鉴
最新发布
bytekj的博客
06-14 547
在开发盲盒App时,可以根据项目需求和团队技术栈选择合适的技术框架。前端可以选择微信小程序框架、React Native或Vue.js等;后端可以选择Node.js或Spring Boot等;数据库可以选择MySQL或MongoDB等。同时,还需要考虑缓存、消息队列、支付和物流接口等其他技术来完善应用的功能和性能。
【2024最新华为OD-C/D卷试题汇总】[支持在线评测] CPU算力分配(100分) - 三语言AC题解(Python/Java/Cpp)
清隆学长的博客
06-11 413
### 问题描述 K小姐是某公司运营部门的主管,最近她需要对公司的两组服务器进行算力分配。每组服务器有多个算力不同的 $CPU$,其中 $A$ 组第 $i$ 个 $CPU$ 的运算能力为 $A[i]$,而 $B$ 组第 $i$ 个 $CPU$ 的运算能力为 $B[i]$。一组服务器的总算力是各 $CPU$ 的算力之和。 为了让两组服务器的算力相等,K小姐允许从每组各选出一个 $CPU$ 进行一次交换。她希望从 $A$ 组服务器中选出算力尽可能小的 $CPU$ 来交换,你能帮她计算出应该选择哪两个 $CP
微型操作系统内核源码详解系列四(3):操作系统调度算法(FreeRTOS内核篇上)
2301_77061352的博客
06-12 839
-uxTopPriority,被设定为是代表最大优先级的数字,自减操作代表从就绪列表最后一个链表(优先级最高的链表)开始查找,直到找到任务链表不为空的优先级任务,那么这个任务肯定也是所有任务中优先级最大的任务,然后获取这个任务的TCB并更新pxCurrentTCB(切换的具体函数),最后更新uxTopReadyPriority的值。容笔者说一下个人看法,从c语言和数据结构算法的层面学习,只能说是舍本逐末,透过Freertos这个小型系统,窥见庞大的操作系统架构的一角,这才是我们学习的重点。
WebMvcAutoConfiguration原理
08-26
原理可以简单描述为以下几个步骤: 1. Spring Boot启动时,会自动扫描项目中的类路径,寻找所有的@Configuration注解标注的配置类。 2. 在找到@Configuration注解的配置类后,Spring Boot会解析其中的@Bean注解...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 解决eclipse创建jsp文件后的报错 7829
  • XML中的转义字符 7215
  • css超链接样式+雪碧图实现导航 5368
  • idea断点调试如何设置条件和在dubug模式下动态改变变量的值 4770
  • vue搭建项目、创建登录页面和后台交互之引入axios 4545

分类专栏

  • java 45篇
  • mysql 1篇
  • 数据库 3篇
  • navicat 1篇
  • mybatis-puls 1篇
  • swagger 1篇
  • xml 8篇
  • 自定义mvc 1篇
  • 自定义标签 4篇
  • tld 4篇
  • java反射 1篇
  • map 2篇
  • nodes 1篇
  • 集合框架 2篇
  • list 1篇
  • 笔记 1篇
  • tomcat 5篇
  • web 24篇
  • servlet 2篇
  • JS 31篇
  • css 12篇
  • jQuery 6篇
  • html 13篇
  • File 2篇
  • javaswing 4篇
  • java窗体 1篇
  • sqlserver 复习 1篇

最新评论

  • nginx集群的介绍、虚拟机安装nginx和nginx集群

    ~ 小团子: 博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文,同时也希望可以来我博客指导我一番!

  • nginx集群的介绍、虚拟机安装nginx和nginx集群

    ~ 小团子: 亲爱的博主,我必须说,您的博客内容真是太棒了!您的深入见解和详尽的解释使得复杂的主题变得简单易懂。您的文章对于我这样的读者来说,无疑是一份宝贵的学习资料。您的写作风格非常吸引人,每一篇文章都充满了热情和活力。您的用词准确,表达清晰,让人一读难忘。我非常喜欢您在博客中分享的实用技巧和经验,这些对我在工作中遇到的问题提供了很大的帮助。

  • 为什么需要使用Docker

    CSDN-Ada助手: AI 写作助手上线啦!限免 4 天,快来创作试试功能吧~https://editor.csdn.net/md/?not_checkout=1&utm_source=blog_comment_recall

  • vue搭建项目、创建登录页面和后台交互之引入axios

    Kyle Charlton: 这个fliter是什么

  • git入门

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/613653252。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • nginx集群的介绍、虚拟机安装nginx和nginx集群
  • springmvc的简单理解
  • vm安装使用centos-7安装linux
2023年16篇
2022年123篇
2021年31篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司荆门网站推广系统公司太原网站推广方案哪家好通化企业网站建设哪家好郴州营销网站价格保山网站搜索优化公司昌都百度seo长沙英文网站建设多少钱周口优化多少钱吉祥网站建设设计公司洛阳企业网站建设报价韶关至尊标王报价苏州网站seo优化公司松原品牌网站设计价格随州网站建设多少钱梧州seo横岗关键词按天计费公司阳泉百度竞价包年推广报价孝感关键词排名包年推广报价新乡网站搜索优化鸡西网站优化按天计费多少钱罗湖企业网站建设推荐兴安盟SEO按天计费哪家好海西关键词按天扣费推荐德州关键词排名包年推广推荐永湖网站推广系统报价文山网站优化推广烟台SEO按天收费报价深圳网站关键词优化哪家好木棉湾网站搜索优化多少钱黔东南seo网站推广价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化