当初用jsp开发程序时,因为很多东西写在一起混淆的,项目做大或者变更的时候就会很吃力,联动性太大,有时修改视图的东西都可能会影响业务逻辑,分层不明确。

  后来听说了Struts MVC,做过几个示例,层次倒是分清了,每个actionbean或者interceptor都得配置映射,配置弄来弄去很麻烦,当然用配置的方式的话灵活性扩展性会好很多,但做起来实太吃力。再后来看到了Spring MVC 它可以省去很多配置,可以使用注解的方式去直接写在程序了,实现了零配置。

  在dotnet方面原来一直没有mvc这个概念只有webform,webform相对入门简单,但要更高级的入门感觉没那么简单,而且webform不适合做web app。后来看到了MonoRail MVC,于是研究了一翻以后,决定自己弄一个适合自己的MVC框架,于是乎便产生了我自己的MVC,我命名是Stephen.View 其实名字叫Stephen.MVC更好些,但后来一直没改,那就一直保持这个名字了。若干年后微软也出了MVC,现在都已经有好几个版本了。没去研究过这个东东,项目中还是用我自制的这个框架。接下来说说我的框架实现原理:

通过在web.config中

        <httpHandlers>

            <add verb="*" path="*.aspx" type="Stephen.View.TemplateHandle,Stephen.View"/>

            …

        </httpHandlers>

拦截扩展名为.aspx的请求,让Stephen.View.TemplateHandle(实现IhttpHandlerFactory接口的类)处理http请求,处理方式有以下几步:

1.是否有url重写(可在web.config中写入配置),有的话根据配置后执行真实的处理url,没有的话就跳过。

Web.config配置方式为:

<configuration>

    <configSections>

    …

        <section name="RewriterConfig" type="Stephen.View.UrlConfig.RewriterConfigSerializerSectionHandler, Stephen.View"/>

    …

    </configSections>

    <RewriterConfig>

        <Rules>

            <RewriterRule>

                <LookFor>~/article/cat/(\d+).aspx</LookFor>

                <SendTo>~/integration/info/CommonManageList_.aspx?ClassID=$1</SendTo>

            </RewriterRule>

        </Rules>

    </RewriterConfig>

    <connectionStrings>

url重写可参考:http://www.cnblogs.com/netcorner/archive/2009/12/10/2912045.html

2.通过真实的url地址配置需调用哪个控制器(可通过web.config中配置控制组件前缀包名,默认控制层名字为Netcorner.Controllers)

<appSettings>

                   <add key="Controller" value="Netcorner.Controllers"/>

</appSettings>

注:控制层的方法默认是不具有session会话的,如需要会话的话控制层方法必须加入HasSessionAttribute 特性。

在调用控制层方法之前,会向控制层方法传递一个Hashtable对象,该对象存放了分别是当前应用路径(key=applicationPath),当前路径地址(currentFilePath),视图应用处理包(key=Tools,视图处理包可通过配置映射哪个处理包,默认就是Stephen.View.ViewUtility类)

3.调用控制器执行方法

控制器其实就是一个简单的C#类,如:

namespace Netcorner.Controllers.integration

{

    public class User

    {

        public virtual IDictionary ManageList(IDictionary context)

        {

            ...

        }

    }

}

当执行/integration/user/managelist.aspx时就会执行User类中ManageList方法,context参数是从Stephen.View.TemplateHandle得到的。

控制器的写法可有多种方式:

1).采用直接在方法体里面写代码

2).是写插件(我这里把C#特性叫做插件了,这些插件把一些常见的业务封装起来了,直接可以拿来调用)的方式。每个插件必须实现BeforehandCommonAttribute或ProceedPlugin抽象类。工作方式可参见后面章节。

3).通过配置的动态拦截器。拦截器必须实现AspectInterceptor抽象类,工作方式可参见后面章节。

4).控制器方法处理完成返回相应的值.

不同类型调用的方式不一样

(1).返回Hashtable时

调用视图模板。这里我处理的模板引擎用了nvelocity。语法参见:http://www.cnblogs.com/netcorner/archive/2008/07/11/2912125.html

(2).其它类型时,则以字符串形式直接展现不需要模板。

  控制层的访问类是通过url传递的,在根目录的话执行的类名必须是Default,其它的话就会根据包名和类名相匹配找到相应类下面相应方法。比如:/integration/user/login.aspx 它实际是访问Netconer.Controllers.integration(我这里使用默认设定的控制器)包下的login方法

演示示例:http://files.cnblogs.com/netcorner/%E7%A4%BA%E4%BE%8B1.rar

接下来我会讲一下插件及拦截器原理及开发方法。

自制MVC框架原理介绍的更多相关文章

  1. jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门

    一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...

  2. .net Mvc框架原理

    .net Mvc框架原理 本文只是简要说明原理,学习后的总结. 1.当一个Http请求发送后会被URLRoutingModule拦截(这时候也就是正式进入管道,下章会讲管道事件) 2.这时根据Isap ...

  3. Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证

    一.概述 JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下: 1.依赖注入验证 2.方法级别验证 二.依赖注入验证 spring提供BeanValid ...

  4. Spring MVC 使用介绍(十四)文件上传下载

    一.概述 文件上传时,http请求头Content-Type须为multipart/form-data,有两种实现方式: 1.基于FormData对象,该方式简单灵活 2.基于<form> ...

  5. Spring MVC 使用介绍(十三)数据验证 (一)基本介绍

    一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...

  6. ASP.NET MVC 简单介绍①

    ASP.NET  MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...

  7. beego的MVC架构介绍

    beego 的 MVC 架构介绍 beego 是一个典型的 MVC 框架,它的整个执行逻辑如下图所示: 通过文字来描述如下: 在监听的端口接收数据,默认监听在 8080 端口. 用户请求到达 8080 ...

  8. Spring MVC工作原理及源码解析(一) MVC原理介绍、与IOC容器整合原理

    MVC原理介绍 Spring MVC原理图 上图是Spring MVC工作原理图(图片来自网上搜索),根据上图,我们可以得知Spring MVC的工作流程如下: 1.用户(客户端,即浏览器)发送请求至 ...

  9. 自制MVC框架基础插件介绍

    本文介绍的基础插件不是实现BeforehandCommonAttribute或ProceedPlugin的postsharp插件,这些都是自定义的基础性的拦截,而且在项目中经常用到. 1). Comp ...

随机推荐

  1. bzoj 4627: [BeiJing2016]回转寿司

    4627: [BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不 ...

  2. [BZOJ5351]Query on a sequence

    [BZOJ5351]Query on a sequence 题目大意: 给定一个长度为\(n(n\le10^5)\)的数列\(P\),满足\(|P_i|\le10^9\),求满足下列约束的不同的四元组 ...

  3. Problem B: 年龄问题

    #include<stdio.h> int xx(int n,int m,int k) { int a; ) { a=k; } else { a=xx(n-,m,k)+m; } retur ...

  4. PHP手册笔记

    <?php getenv — 获取一个环境变量的值 $ip = getenv ( 'REMOTE_ADDR' ); // 或简单仅使用全局变量($_SERVER 或 $_ENV) $ip = $ ...

  5. 8VC Venture Cup 2016 - Elimination Round E. Simple Skewness 暴力+二分

    E. Simple Skewness 题目连接: http://www.codeforces.com/contest/626/problem/E Description Define the simp ...

  6. 用 Jenkins + .netcore 2.0 构建

    上一篇是关于 .net framework 框架的, 今天是关于 .netcore 2.0 的 这里为大家分享 配置中踩到的坑 cd %WORKSPACE%\"需要还原的项目目录" ...

  7. 翻译:Spring-Framework-Reference Document:11-Transaction Management

    TUESDAY, 07 APRIL Comprehensive transaction support is the most compelling reasons to use the Spring ...

  8. 使用SQL Server 扩展事件来创建死锁的跟踪

    我们通过SQL Server 2014图形界面来部署一个扩展事件跟踪会话.然后可以生成SQL脚本. 步骤如下: 步骤1: 通过“对象资源管理器”连接到实例,展开“管理”.“扩展事件”.“会话”. 步骤 ...

  9. (转)PV、UV、IP之间的区别与联系

    PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量.对于广告主,PV值可预期它可以带来多少广告收入.一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者 ...

  10. 在android中画圆形图片的几种办法

    在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状. 可是往往我们手上的图片或者从server获取到的图片都是方形的.这时候就须要我们自己进行处理, ...