自制MVC框架原理介绍

简介:

  当初用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

 

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



本文转自 netcorner 博客园博客,原文链接:http://www.cnblogs.com/netcorner/p/3757092.html   ,如需转载请自行联系原作者

相关文章
|
2月前
|
前端开发 Java 程序员
从零基础手写Spring MVC框架,准备好进阶程序员了吗?
我们程序员大部分人都是野路子,不懂什么叫代码规范。写了一个月的代码,最后还得其他老司机花3天时间重构,相信大部分老司机都很头疼看新手的代码。
25 1
|
3月前
|
设计模式 前端开发 JavaScript
浅谈MVC、MVP、MVVM框架模式
浅谈MVC、MVP、MVVM框架模式
30 0
|
4月前
|
前端开发 数据库 Python
Python Web 开发: 解释 Django 框架的 MVC 架构是什么?
Python Web 开发: 解释 Django 框架的 MVC 架构是什么?
|
4月前
|
存储 前端开发 Java
Spring基础篇:MVC框架整合
Spring基础篇:MVC框架整合
|
4月前
|
前端开发
MVVM和MVC的原理以及它们的区别
MVVM和MVC的原理以及它们的区别
|
3月前
|
Java 数据库连接 Maven
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
|
21天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
27天前
|
前端开发 JavaScript Java
MVC框架:SpringMVC(三)
MVC框架:SpringMVC
30 0
|
27天前
|
JSON 前端开发 JavaScript
MVC框架:SpringMVC(二)
MVC框架:SpringMVC
37 0
|
27天前
|
前端开发 Java 应用服务中间件
MVC框架:SpringMVC(一)
MVC框架:SpringMVC
60 0