030.自定义的MVC框架

.LOG
自定义的MVC框架

M: Model模型
V: View 视图
C: Controller 控制器

ASP.Net
1. Web窗体编程
2. Mvc编程

IHttpHandler
任何处理web请求的类必须实现此接口
void ProcessRequest(HttpContext context)
bool IsReuseable{get;}

使用IHttpHandler实现登录与注册
1.新建UserHandelr:IHttpHandler接口
2.web.config配置,处理 /user.do请求
3.新建Login.aspx,使用html元素与表单, 向/user.do提交请求

规则
1. /xxx/yyy.do 表示调用xxxHandler的 yyy操作方法
2. 请求提交的表单变量名或者查询字符串的参数名
必须与操作方法的参数名(或者参数的属性名)基于不区分大小写的一致
3. 所有需要呈现Model数据的视图页面类 必须继承自BaseViewPage<T>
4. /xxx/yyy.do所对应的视图页面的路径必须是
~/views/xxx/yyy.aspx
5. 所有的操作方法的返回类型是ActionResult类型

实现
1. 定义MvcHandlerFactory:IHttpHandlerFactory接口
根据请求路径定位特定的XXXHandler

2. 定义BaseHandler实现 IHttpHandler接口
实现ProcessRequest接口方法
a.根据请求路径,请求类型, 定位特定的操作方法
b.反射方法的参数列表,根据参数名从请求数据中检索值,
作为方法的参数值,通过反射调用方法
c.获取方法的返回值,统一调用Executing方法

3. 特定的XXXHandler必须继承自BaseHandler,类名以Handler结尾
处理GET的操作方法,必须添加HttpGet特性
处理POST的操作方法,必须添加HttpPost特性
POST,GET都处理的操作方法,不需要标注特性

4. 定义HttpAttribute类及其子类,作为操作方法的特性使用

5. 定义BaseViewPage<T>:Page,提供 T Model属性

6.定义ActionResult及其若干子类
操作方法返回ActionResult类型,内部return ActionResult子类对象

7. 修改BaseHandler代码,将IsReuseable提升为virtual属性
允许子类决定是否可以重用

8. 在MvcHandlerFactory中,
根据XXXHandler的IsReuseable属性的值,管理特定XXXHandler对象的生命周期

9. 修改BaseHandler代码,对操作方法进行缓存
使用ThreadLocal存储HttpContext对象

10.为BaseHandler提供若干帮助器方法
View(..);
File(...);
Redirect(....);
RedirectToAction(....)
Json(...)
Content(...)

11. 在BaseViewPage中添加泛型方法
a public string TextBoxFor<P>(Expression<Func<T,P> exp)
返回表示text元素的html字符串
b public string PasswordFor<P>(Expression<Func<T,P> exp)
返回表示password元素的html字符串
c. 在视图页面使用如下方式调用
<%=this.TextBoxFor<string>(m=>m.Id) %>

12. 在BaseHandler中添加代码
如果操作方法的参数是数组类型,
根据参数名获取请求数据中的数据,通过反射创建数组对象,作为操作方法的参数值

----------------------------------------------------------------------
实现产品分页
1. 定义ProductHandler:BaseHandler
操作方法List(int p=1,int c=-1)

2. PagingModel 模型数据包括当前页号,总页数, 产品集合

3. ProductList.aspx视图 继承BaseViewPage<PagingModel>

4. 实现ajax分页
a. 定义JsonResult:ActionResult
b. 添加操作方法Ajax 返回JsonResult对象
c. 添加html页面,对/product/ajax.do发起ajax请求,
获取json数据,动态创建table与分页导航
5. 验证码
a. 定义FileResult :ActionResult
b. 定义操作方法Code()返回FileResult对象
c. 在操作方法内部绘图
d. 页面中 img src="/user/code.do"
6. JS验证码
a.定义操作方法 JSCode(string code) 返回FileResult对象
b.页面中使用JS创建验证码,向/user/jscode发送请求,显示图片
c.将用户输入的验证码与浏览器内存中的验证码变量进行匹配

web应用程序启动,ASP.Net引擎读取web.config
*.do MvcHandlerFactory对象
通过反射,动态创建XXXHandlerFactory对象
Object obj1=动态创建XXXHandlerFactory对象
存入键值对 key=路径 value=对象

*.abc ABCHandlerFactory对象
存入键值对 key=路径 value=对象

当一个/user/login.do请求到达服务器的时候
*.do后缀
根据请求路径,获取特定的factory对象
IHttpHandlerFactory f=特定的factory对象
IHttpHandler h=f.GetHandler(.......);
h.ProcessRequeset(.....)

----------------------------------------------------------
1. MvcHandlerFactroy
根据请求路径定位特定的XXXHandler
2. BaseHandler
根据请求路径,定位特定的操作方法
3 AtionResult及其子类
作为所有操作方法的返回类型,请求的流程控制都是在Executing中实现
4. BaseViewPage<T>
所有需要呈现Model数据的 视图页面类的 基类

规则
1. 所有*.do的请求皆由MvcHandlerFactory拦截
2. /xxx/yyy.do表示调用xxxHandler的yyy操作方法
3. 请求提交的变量名称必须与操作方法的参数名(参数的属性名)基于不区分大小写的一致
4. 所有需要呈现Model的视图页面类 必须继承自BaseViewPage<T>
5. 针对/xxx/yyy.do请求的视图页面路径 必须是 ~/views/xxx/yyy.aspx

--------------------------------------------------------------------------
实现Mvc类库项目
1. 新建类库项目,添加System.Web,System.Web.Extendtions引用
2. 将MvcHandlerFactory,BaseHandler.ActionResult及其子类,BaseViewPage<T>,
HttpAttribute及其子类,CacheHelper 移入项目
3. 修改namespace
4. 将MvcHandlerFactory声明为抽象类
修改反射创建Handler对象的代码

5. web项目移除相关类型,添加MvcLib的引用
添加MvcHandlerFactoryImpl:抽象类MvcHandlerFactory
修改web.config配置

-----------------------------------------------------------------------------
web应用程序启动
ASP.Net引擎读取web.config中的配置
1.动态创建xxxModule对象,存储在模块工厂中
Dictionary<string,IHttpModule>
key: name value:模块对象
2.动态创建XXXHandlerFactory对象,并且存储
Dictionary<string,IHttpHandlerFactory>
key: path value:HandlerFactory对象

请求到达ASP.Net引擎
将请求封装为HttpApplication对象ha
1. 遍历 Dictionary<string,IHttpModule>中的每个模块对象
IHttpModule m=......
m.Init(ha);
2. ha引发事件
3. 根据请求路径,在 Dictionary<string,IHttpHandlerFactory>获取
IHttpHandlerFactory f=........
IHttpHandler h=f.GetHandler(....)
h.ProcessRequest(.....)

--------------------------------------
单一登录原理
帐号:aaa

张三使用aaa登录
服务端创建cookie, 输出到客户端
id:aaa
token: 794F1C1D-EA89-4A04-9D20-21DB3811FA93

服务端键值对存储
key:aaa value:794F1C1D-EA89-4A04-9D20-21DB3811FA93

李四使用aaa登录
服务端创建cookie, 输出到客户端
id: aaa
token: 5B4BD517-8F0B-4C1D-9BA3-8B5075B0F019

上午 11:19 2016/12/28 星期三

20:55 2017/1/20

时间: 2024-08-26 02:39:30

030.自定义的MVC框架的相关文章

Java Web自定义MVC框架详解 (转)

转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架.但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有 代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码,也有原理和探讨.内容会比 较长,因为我打算用递增的方式讲解如何写一个自定义MVC框架,重点是前

使用Intellij Idea自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

简单封装自定义MVC框架

自定义Mvc框架结构及其使用方法 一,什么是MVC框架 MVC框架全名是model(模型)controller(控制器)view(视图文件)所构成的一种开发框架,是一种典型的软件设计典范,用一种业务逻辑,数据,显示相分离的方法组织代码,其好处是将业务逻辑聚集到一个部件里面,在改进和指定个性化页面的同时不需要重新编写业务逻辑,MVC被独特的发展起来用于映射传统的输入,处理,显示在一个业务逻辑的图形化业务界面中. 二,组成 ①,model(模型):主要负责具体功能的实现,一个模型对应一种功能 ②,v

自定义MVC框架

一.实现自定义MVC的体系结构图 1.Model I模式开发Web应用时,分两种情况: *纯JSP技术方式开发 *JSP+JavaBean方式开发 2.Model I模式开发的不足: *JSP页面中嵌入大量的Java代码,可读性差. *大量代码在JSP中难以复用. *后期维护及扩展的难度大. 3.为了克服Model I模式的缺陷,引入了Model II的模式开发 *Model II模式体现了基于MVC(Model-View-Controller,模型-视图-控制器)的设计模式,简单的说,Mode

MVC系列——MVC源码学习:打造自己的MVC框架(四:自定义视图)

前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾.对于这个系列,通过学习源码,博主也学到了很多东西,在此还是把博主知道的先发出来,供大家参考. 本文原创地址:http://www.cnblogs.com/landeanfen/p/6019719.html MVC源码学习系列文章目录: MVC系列——MVC源码学习:打造自己的MVC框架(一) MVC

Struts2 自定义MVC框架

一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发 二.MVC设计模式: 由3个部分组成,各部分作用如下: Model:模型,主要用于数据和业务的处理 View:视图,用于数据的显示 Controller:控制器,用于进行流程控制 MVC设计模式的特点: ①一个模型可以对应多个视图 ②显示与逻辑控

自定义MVC框架之工具类-图像处理类

截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( 支持任意位置与九宫格位置 ) 2,图片缩放处理( 等比缩放,不变形裁剪 ) 1 <?php 2 3 class Image{ 4 //文件路径 5 protected $path; 6 //是否允许随机文件名称 7 protected $enableRandName; 8 //文件类型 9 pro

ideat使用struts2之自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

自定义MVC框架之工具类-模型类

截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理类 这个模型类支持以下功能: >连贯操作,js叫链式操作,连贯操作的函数可以打乱顺序,最后一个函数必须是执行语句的那个函数,如select, delete, update, add等 如 $db->table( 'user' )->where( 'id=1' )->select() 等