窗体和功能性的关系与面向对象网络技术
现今的网络技术的发展目标之一就是要达到窗体和功能性的分离
。六七年之前,这并不是一件难事,浏览器会提交一个浏览网页的请求信息,服务器发出需要的网页后,通过浏览器对其进行解析,选取需要的图像文件,这之后,HTML格式的代码就变成了版面形式或网页内容。现在,几乎所有的网页都有一些功能性的行为包含在里面。
在网络从提供静态的内容到成为一个交互式的应用平台的演变过程中,直到我们有了意大利面条式代码之前,窗体和功能性一直被混合在一起。类似于Java Server Page (JSP)和ASP.NET这样的技术可以消除这种混合,但是一个ASP开发者要使网页实现更高的合成化并可以重复使用,还需要做很多工作。
在纪录中,当窗体和功能性注定要在对象(由于没有更恰当的词汇,我们姑且称其为对象)中结合在一起时,将二者混合起来就并不是一件坏事,而且还要尽可能的依赖于以编译的代码。如果在一个网页中存在并不依赖于其内部对象的一些功能时,将他们放置在一个动态连接库(DLL)之中并通过DLL而不是脚本来调用这些功能。如果你在Microsoft Transaction Server或Component Services中建立这个DLL时,确保Retain In Memory这个选项已经设置,这可以保证对象在需要时可以很快地被调用。 如果你在服务器端使用IIS 5,你就要考虑将include指令(<!-- #include . . . -->)用Server.Execute方法代替。这个方法的性能也许并不如include指令,但是当代码路径没有被执行时他可以避免再次加载网页。要指出的是,include指令首先通过Ssinc.dll ISAPI filter进行处理,而且只有在通过处理所有的include指令而得到一个复合型网页之后,这个网页才会被提交到ASP引擎进行脚本指令处理。而Server.Execute也可以达到同样的效果,他可以在代码指令行没有被执行时,避免出现二次调用网页的现象。
同时,设法将网页的一些内容压缩封装入所谓的"pseudo-controls"之中。你可以使用VBscript (Class. . .End Class)或Javascript在服务器上建构快速而简易的道具和方法使用对象。你要考虑使用这些对象将一部分内容进行压缩并提供一个针对HTML的解析方法。例如,我们可以假设一个VBscript Class用下面的方法来定义LoginControl,下面的代码将会在网页上输出一个注册对话框:
燚im ctlLogin
燬et ctlLogin = New LoginControl
營f Not ctlLogin.IsLoggedIn Then
牐燾tlLogin.LoadData Request.Form("Username"),
牐燫equest.Form("Password")
牐燾tlLogin.ProcessData
牐燫equest.ServerVariables("REQUEST_METHOD")
燛nd If
燾tlLogin.Render
燬et ctlLogin = Nothing
最后,不要忽视客户机端的脚本指令控制复杂的动态的功能性函数的能力。现在市售的所有主要的浏览器都支持客户机端的Javascript,但不幸的是,有时不同浏览器的不同执行方式使得他成为一件让人头疼的事,但同时大多数浏览器都给你设置一个将客户机端的Javascript关闭的选项。尽管如此,只要你仔细考虑到诸多因素,他将成为一个有力的工具。
这些技术将会帮助你更好地在ASP.NET进行面向对象的网络开发工作。他使我们看到在大多数网页中,在保留每个个体部分的功能性的同时,有多少部分的内容可以被压缩并与其他部分相隔离。