MVC框架的实现
现在web开发基本都是MVC的架构了,struts、springMvc 等等。其中一个重要的功能就是将客户发起的请求,分发至我们定义的Action里面的方法之中。
闲暇之余,我也做了一个类似于spring的方式,在Action中配置注解RequestMapping,将前端的请求分发至action的方法中。实现的过程还是比较简单的。
1. 实现url映射的注解
2. 在servlet容器启动时,解析配置当中所有的模块。解析模块中的所有方法。将对应的URL以及处理方法保存起来。
3. 在servlet处理请求时,取得请求的servlet容器,然后从保存的URL映射中取处理的类和方法。如果没有则404,如果有则调用该方法处理。
4.然后根据方法的返回值,返回响应的jsp页面。
代码非常简陋,只是为了弄懂如何通过注解实现URL映射。源码:YMvc
demo的效果如下:
Action中配置:
/**
*
* @author yingzi.zhu
*/
@RequestMapping("/my")
public class MyAction {
@RequestMapping("/sayHello")
public String add(HttpServletRequest request, HttpServletResponse response){
request.setAttribute("param", "Hello, everyone");
return "hello";
}
}
web.xml中的配置如下:
<servlet>
<servlet-name>yservlet</servlet-name>
<servlet-class>org.yz.mvc.action.YServlet</servlet-class>
<init-param>
<param-name>entrance</param-name>
<param-value>org.yz.mvc.MainModule</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>yservlet</servlet-name>
<url-pattern>*.test</url-pattern>
</servlet-mapping>
其中 org.yz.mvc.MainModule 为主入口,作用是通过@YMvc注解,标记模块。
/**
*
* @author yingzi.zhu
*/
@YMvc(MyAction.class)
public class MainModule { }
hello.jsp。测试Action中的返回,从Request中取值。在页面显示。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1><%= request.getAttribute("param") %></h1>
</body>
</html>
最后的显示结果。


整个映射过程还是比较简单的。只需要在web.xml中进行servlet配置,然后在入口中配置要加载的Action。然后在Action中配置匹配的路径。
实现的思路是:
1. 在servlet类中,获取web.xml中配置的入口模块
2. 在入口模块中解析注解 @YMvc 的内容。
3. 根据解析的内容继续解析 配置了URL映射的模块,分别解析类名的注解以及方法的注解
4. 将注解以及处理类存放在map里面。如 前面demo中的 (/my/sayHello, MyAction, add)
5. 在servlet有请求时,解析请求的路径,从map中取匹配
6. 配置到了,则调用Java类的反射机制,来执行配置的方法。获取方法的返回值
7. 将使用请求转发,将请求转发至 方法的返回值。
MVC框架的实现的更多相关文章
- 开源:Taurus.MVC 框架
为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...
- 编写自己的PHP MVC框架笔记
1.MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). ...
- 转 10 个最佳的 Node.js 的 MVC 框架
10 个最佳的 Node.js 的 MVC 框架 oschina 发布于: 2014年02月24日 (33评) 分享到: 收藏 +322 Node.js 是一个基于Chrome JavaScri ...
- 制作自己的MVC框架(一)——简单粗暴的实现
现在市面上有很多成熟的MVC框架,可以拿来直接用,但自己造一下轮子其实也挺有意思的. 下面先来看个最简单粗暴的MVC实现. 5个文件就能实现最简单的MVC,在Apache中设置一个虚拟目录,配置个简单 ...
- 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>
一.引子 开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...
- 产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...
- 请求如何进入ASP.NET MVC框架
一.前言 对于WebForm开发,请求通常是一个以.aspx结尾的url,对应一个物理文件,从代码的角度来说它其实是一个控件(Page).而在MVC中,一个请求对应的是一个Controller里的Ac ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)
前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...
随机推荐
- vue.js组件之j间的通讯四,通过单一事件来管理组件通讯
总结; 首先需要创建是一个空实例: var vm = new Vue(); vm.$emit(事件,数据); vm.$on(事件,function(data){ }bind(this))
- 2-28 switch
- 解决SharePoint2013产品过期问题
作者:huangtao2011 引用:http://blog.csdn.net/huangtao2011/article/details/27528101 今天使用SharePoint 2013创建页 ...
- POJ2886Who Gets the Most Candies?(线段树之约瑟夫)
约瑟夫问题的升级版,每次出去的是前一个出去的人位置+手上的数字(正往前,负往后).第i个出去的人拿的糖是i的约数的个数.求拿糖最多的人和他的糖果数. 这里用到了反素数的知识,在这直接打表 题目 AC代 ...
- HDU计算机学院大学生程序设计竞赛(2015’12)The Magic Tower
Problem Description Like most of the RPG (role play game), “The Magic Tower” is a game about how a w ...
- 事务背书 ACID, CAP, BASE
A atomicity 原子性 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成, C consistency 一致性 在事务开始之前和事务结束以后,数据库的完整性没有被破 ...
- hadoop "startdfs.sh" WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
这个waring 信息是可以忽略的.下面是解决方案 在hadoop-env.sh中添加 export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.pat ...
- Vue.js-----轻量高效的MVVM框架(一、初识Vue.js)
1.什么是Vue.js? 众所周知,最近几年前端发展非常的迅猛,除各种框架如:backbone.angular.reactjs外,还有模块化开发思想的实现库:sea.js .require.js .w ...
- 手工安装XDB 组件in oracle 11g
#############. sample 1 install guide below step is only for oracle 11g database installation, 10g d ...
- eclipse_project
转!java web项目 build path 导入jar包,tomcat启动报错 找不到该类 在eclipse集成tomcat开发java web项目时,引入的外部jar包,编译通过,但启动tomc ...