在ASP下使用MVC开发模式

 前言

      MVC是目前使用比较广泛的设计模式.MVC模式对Java程序员而言再熟悉不过了.随着.NET MVC2.0的推出,MVC模式也成了.net程序员的新宠.MVC只是一种设计模式,跟任何语言,任何平台都没有关系的.理论上来说,任何一种语言开发都可以使用MVC模式.从.NET MVC2.0的框架来看,似乎有一种返璞归真的感觉.尤其是在View层面,MVC开发者建议不要使用服务器端控件和后台代码,而是直接使用嵌入式标签.如<%=ViewData["name"]%>这样的写法.当然这样做的目的就是让页面设计着和代码设计者能够更好的进行配合,这也是MVC的精神所在.咋一看,似乎又回归到了原来的ASP上面去了.所以说有点返璞归真的感觉.

 

     现在网上很多程序员都在讨论ASP,PHP,JSP以及ASP.NET程序谁优谁劣的问题.这是一个仁者见仁,智者见智的问题,而且永远也不会有结果.不过,我个人认为,语言本身是没有好坏的,只是一种程序的表现形式.某些公司对于某些平台或者某些语言的宣传更多的是出于商业利益的考虑.有人说Java很强大,可以跨平台,所以好,其实PHP,.NET(+Mono),ASP(+IASP)都是可以跨平台的.有人说ASP,PHP是解释型语言,而java和.NET是编译型语言,所以ASP和PHP效率比较低.当然这种说法我们也不用太计较.如果能够深入了解各种平台的运行原理和机制,那么就会觉得这种说法是站不住脚的.连微软自己都不敢承认C#会比PHP的效率更高,所以在Win2008,IIS7已经算是集成了PHP.还有一些人说ASP,PHP不能用于大型系统的开发.呵呵,当然这种说法就更可笑了.用ASP,和PHP同样可以开发出高效的大型应用系统.只是对于开发人员来说,可能要求比较高一些.原因很简单.系统越大,需要团队协作的地方就越多.对于设计模式,代码管理,版本控制,以及程序编写等要求越来越高.NET和Java之所以很强大.只是因为它们有一个庞大的组件库.可能在ASP里面需要用1000行代码才能完成的事情,在.NET里面只需要两句话就搞定.比如MD5算法的实现,文件上传.所以从本质上讲不管是J2EE也好,还是.Net也好,都是提供了一个大而全的集成环境,以及软件生态圈.有很多人在为它们开发组件,开发框架,也为很多商业公司带来了巨大的利益.如果把J2EE比作飞机大炮,那么ASP相对来说就是一把菜刀.PHP可能更像一把利剑,当然还有其它一些语言,只要使用熟练了,菜刀也能当核武器使用,关键还是看使刀的人对刀用得怎么样.

 

 

MVC设计模式

     言归正传.MVC即模式即模型(Model),视图(View)和控制器(Controller)。其中控制器就像一个指挥官.当收到客户端指令以后,按照规则调用不同的模型,然后讲数据传递给视图显示.从模式上看,我们有3个角色.我们也可以把他当作3个开发人员,一个负责模型及业务逻辑设计,一个负责调度,一个负责显示.这样就跟生产流水线一样,每个人都可以专心做自己的事情.从而提高生产效率.我想这也是MVC模式的设计初衷.

 

 

    我们再看看Web服务器的处理流程是怎样的.

    用户请求(GET,POST)-->服务器分析URL-->读取URL指定的文件-->调用CGI(ISAPI)处理程序-->返回客户信息

 

     我们可以看到,服务器接受到客户的请求后,会读取URL指定的文件,然后再去执行.对于开发人员来说,我们就是需要在这个URL指定的文件里面书写我们的程序.对WEB服务器来说,一个URL就对应了一个文件.而在MVC模式里面,一个URL只是代表了一个命令,而执行该命令的文件应该是分成多个.这中间的转换工作就是有MVC框架来完成的.MVC框架所做的工作就是截获服务器的URL请求,所以的页面请求都指向该文件.然后再分页URL参数,调用不同的控制器,在控制器里面再调用模型处理数据,再讲数据传递给视图显示.

 

     在这里,页面重定向是MVC能够实现的关键.在.NET MVC里面,重定向使用的是routing组件.当然IIS也可以使用ISAPI_Rewrite组件.还有一种方法就是自定义错误404,如果服务器找不到指定页面,就执行我们自定义的页面,从而达到重定向的目的.在本文里,因为我们只有菜刀可用,所以就采用了自定义404错误的方法.在IIS里面如何自定义404错误在网上有很多,在这里就不用赘述.

 

     我们截获IIS的请求以后,接下来我们应该怎么做呢?假设我们自定义的页面叫Director.asp,我们来看一些Director.asp的代码:

 

 在本文里面,我们的ASP采用了javascript来实现.采用javascript实现有很多优点,再以后的内容里我们会说明.

 我们看第一句:eval(_$("script/mvc.js"));

 在这里我们引入了mvc.js文件,对于URL的分析,变量的传递,比如ViewData我们都在mvc.js里面实现.在javascript里面没有像C#那样的  using或者import指令,虽然在ASP里面我们可以使用#include来将一个页面包含进来,但包含进来的文件是ASP文件格式的.里面的代码需写成<%%>这种形式,这样看起来就不是很美观,另外我们也不能像纯js那样可以采用压缩代码工具来压缩,以便保护我们的源代码.当然我们还可以使用<script runat="server src="script/mvc.js"></script>这样的形式来导入.这种方式可以导入函数对象,但是在嵌入的代码里面却不能使用变量,会提示变量没有定义.这主要是执行顺序的问题,有兴趣的朋友可以探讨.同时这种方法还有一个缺点,就是引用的文件只能在IIS的相对路径下,如果用户知道了该目录,就可以直接下载服务器端原代码.当然我们可以修改后缀名来隐藏,比如全改成asa.不过感觉始终有点提心吊胆.为了安全我们还是还是将代码放在IIS的路径以外.然后通过FSO或XMLHttp自己读取该文件来使用.通过eval来执行.这里的_$就是自己定义的一个函数,主要就是将js文件读进来,返回一个字符串._$主要采用了XMLHttp来读取.

 

在mvc.js里面,我们主要通过分析URL,将对于的URL路径转换成Controller/action,然后判断该Controller对应的文件是否存在.路径是

"Controllers/"+_controllerName+"Controller.js";如果存在就通过eval函数执行XXXController.js,返回一个Controller对象.当然,javascript是弱类型的语言.所以这个对象你可以叫任意名字.

假如我们的URL请求是http://localhost/Home/Index,那么对应的Controller文件就是Controllers/HomeController.js,(为了跟.NET MVC有点像而已,这个命名规则我们也可以自己规定).

我们再看看HomeController.js的代码:

 

 

当然,这里采用了Json格式的语法,这样执行eval以后就可以返回一个静态对象.比如返回叫obj.那么我们就可以直接使调用obj.About()方法.

呵呵,看上去是不是跟.NET的MVC有点像?HomeController.js里面的代码很简单,当然我们还可以处理更复杂的Model.这里我们使用了ViewData对象以及View方法,ViewData在文件里面并没有定义,那么它是从哪儿来的呢?因为使用了eval来执行该对象,当然ViewData是从上下文继承下来的.ViewData和View函数都是在mvc.js里面定义的.我们看看mvc.js的代码

 

我们可以看到ViewData对象在mvc.js里面的定义.因为ViewData要跨页面传递.我们在View里面使用了Server.Execute方法,Server.Execute是不能继承当前的javascript上下文的,因此ViewData不能传递过去,只能通过Application来传递.当然,如果不使用Application来传递是不是可以呢?答案也是可以的,只不过这样实现起来比较困难.需要对View页面进行预处理.

比如:<div><%=ViewData["name"]%></div>,预处理以后就是"<div>"+ViewData["name"]+"</div>",这样就可以直接用javascript输出了.

 

在mvc.js里面,我们定义了自己的ViewEngine叫AspPageView,主要是使用Server.Execute将页面执行结果显示出来.路径的规则跟.NET MVC一样,"Views/"+_controller+"/"+ActionName+".asp";如URLhttp://localhost/Home/Index对应的ViewPage就是Views/Home/Index.asp,Index.asp的代码如下:

 

上面的头部代码不用看,所有的View都是一样的,我们看下面的BODY之间,是不是跟.NET的有点像.当然我们看到,我们输出的是ViewData["name"].name,因为我们在HomeController.js里面传递的是一个对象ViewData["name"] = {name:"lidc"};所有这里的ViewData["name"] 是一个对像,可以直接引用的.我们看看执行后的结果

 

 

 

这样,我们一个精简的MVC框架就完成了,对于开发人员来说,只需编辑Controller下面的xxxControll.js和Views下面的XXX/xxx.asp就行了.

 

小结

      所以,MVC设计模式并不是某一种语言或某一种平台的专利,在任意一种开发语言里面都是可以实现的.只不过我们使用菜刀的时候,我们的刀必须得先磨好.从上面我们还可以看出,使用javascript作为服务器端的开发语言有诸多的好处,具体有什么好处.且听下回分解.

 

 

 

   

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值