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有一个 ...
随机推荐
- .net mvc 框架实现后台管理系统 3
左侧菜单实现 默认html <div class="layui-side layui-bg-black h-slide"> <div class="la ...
- [AH2017/HNOI2017]礼物(FFT)
[Luogu3723] [DarkBZOJ4827] 题解 首先,有一个结论:两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负) 设增加亮度为x.求\(\sum_{i=1}^{n}(a ...
- N - 嘤嘤嘤 (并查集+枚举)
Our lovely KK has a difficult Social problem. A big earthquake happened in his area. N(2≤N≤2000)N(2≤ ...
- P4159 [SCOI2009]迷路
传送门 先考虑只有 01 边权的情况 显然可以DP+矩阵加速 但是现在边权不止 1 然鹅最大也只有 9 所以从这里入手,把点拆成 9 个,然后点之间的边权也就可以变成 1 了 同样的转移和矩阵加速 注 ...
- hdu1166 敌兵布阵 线段树(区间更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu2068 RPG的错排
RPG的错排 时间限制:1000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others)总提交内容:16421接受的提交内容:6670 问题描述 ...
- node js linux / OS 安装
rm -rf 删除文件夹名字rm -rf 软连接名称 1.安装taryum install -y tar 3. 下载node https://nodejs.org/en/download/ 4. 拷贝 ...
- 5月 28日css前端知识
a:link {color : #FF0000} #未访问连接时设置颜色 a:visited {color: #FF0000} #访问过得连接设置颜色 a:hover {color: #F ...
- hive参数设置
-- 设置hive的计算引擎为spark set hive.execution.engine=spark; -- 修复分区 set hive.msck.path.validation=ignore; ...
- grep常用选项记录
grep: 一.常用选项: -i 不区分大小写针对单个字符 -v 显示不包括查找字符的所有行 -o 只打印出匹配到的字符 -c 显示有多少行被匹配到 -e 可以使用多个表 ...