首页 > 代码库 > 030.自定义的MVC框架
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="http://www.mamicode.com/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=http://www.mamicode.com/对象
*.abc ABCHandlerFactory对象
存入键值对 key=路径 value=http://www.mamicode.com/对象
当一个/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
030.自定义的MVC框架