本文摘自2001年的文章,在当时,ASP.NET刚刚从襁褓中走出来,带着他的稚嫩向世人招手。
概 述
ASP现在被从头到脚地重建了,结果就是ASP.NET。它并不只是ASP 4.0,它是一个用于 Web开发的全新框架,其中包含了许多新的特性。ASP.NET提供了更易于编写、结构更清晰的代码,这些代码很容易进行再利用和共享;ASP.NET使用编译后的语言,从而提升性能和伸缩性;ASP.NET使用Web表单使开发更直观,利用面向对象技术促进组件的再利用。另外,ASP.NET中还包括有页面事件、Web控件、缓冲技术以及服务器控件和对数据捆绑的改进。供 ASP.NET使用的库以及在Microsoft.NET框架中允许通过Web 使用客户商用函数,为程序员提供了更多新的开发机会。
ASP.NET的优势
ASP.NET使代码更加干净。现有的ASP 应用程序中,不管你将它们写得怎么样,结构总是充满了长长短短的代码。而ASP.NET的代码不仅更容易编写,而且更加干净整洁,比ASP代码更易于阅读。同时,ASP.NET代码的结构方式提高了其再利用性和共享性。
ASP.NET 改进了配置、伸缩性、安全性和可靠性。对于简单的ASP应用程序,配置其实并不算什么问题,但是当你移植到一个利用组件的N层结构中时就会遇到问题。当你对这些应用程序进行配置和维护时,DLL 陷阱问题(组件注册、版本、锁定的DLL等等)就会出现。ASP.NET中则取消了组件注册以及DLL锁定,全面使用了XML配置文件,从而解决了这个问题。这样你只需要执行复制文件的工作就能配置一个Web应用程序。
ASP.NET对各种不同的浏览器提供了更好的支持。对于ASP开发人员来说,浏览器兼容问题好象是一个永恒的问题。你或者为低一级的浏览器编写代码,例如用HTML 3.2,或者限制页面的浏览范围。无线应用程序协议WAP设备的引入还会深化这个问题。本文中Web表单这部分描述了ASP.NET是如何解决浏览器兼容性问题的。
ASP.NET 造就了一类新的Web应用程序。目前的Web应用程序通常都是同一种模式:一套线性应用程序,然后将逻辑植入其中之一。ASP.NET允许开发人员打破这种单一模式,创造出更加动态而且伸缩性更强的应用程序,这种应用程序能够更好地满足公司的商业需求,并提供一个更加丰富的开发环境。
到这里你可能会想,虽然这些目标都很高尚,但是它们会使编写应用程序变得困难。然后恰恰相反,用ASP.NET 进行开发要简单得多!
下面我们就来细细品味一下ASP.NET的强大特征,包括:
●对编译语言的支持
●Web表单
●跟随页面对象的页面事件
●Web控件
●Web Services
●缓冲技术
●调试和跟踪
●代码和内容隔离
●名称空间的通用库
●配置
使用经过编译的语言
现有的ASP版本是基于脚本语言的,如VBScript和JScript 。脚本语言本身并没有什么错,但是它们有两大缺陷:它们是解释型的,并且分类不严格。ASP.NET并没有完全抛弃脚本语言的概念,它引入了对全编译语言的支持,使你能够用Visual Basic编写自己的服务器端代码,例如:
<script language=“vb” runat=“server”>
Visual Basic的一大优势是其对严格分类变量的支持,因此以下的代码在ASP.NET中是成立的:
Dim FirstName As String
除了Visual Basic和C++,你还可以使用最新的Microsoft语言 C#来编写服务器端代码。C# 将C++ 中不实用的部分都去掉了,它更容易理解。用ASP.NET,编译动作在页面第一次装载时发生。即便代码是脚本语言,它也会在执行前被编译,因此 Jscript代码页面的性能也会得到提高。实际上,这是 .NET 框架的一个基本的新特征。以前版本的语言编译器对数据类型和对象是区别对待的,这就意味着唯一可以进行跨语言开发的就是创建COM对象。Microsoft .NET框架中的通用语言运行时间环境CLR允许对已经用通用运行时间支持编译过的任何代码进行紧密的交互作用,这就是新的Visual Basic和C# 编译器将要做的:创建能在运行时间中被管理的代码。
这样做最大的优点是使得真正的跨语言开发成为可能。有了通用运行时间环境CLR,你可以用C#创建对象,并在 Visual Basic中通过继承功能对它们进行扩展。现在的 Visual Basic .NET支持继承功能,这样你就可以在C# 中编写组件,然后在Visual Basic中将它们设置成子集。虽然 Visual Basic、C#和脚本语言是在开始的框架结构中被支持的语言,但是稍后其它语言,如Smalltalk、Eiffel、Pascal等等,也将会被支持。Microsoft .NET框架的一个优势就是扩展非常得容易,因此使用一种新的语言仅仅需要为运行时间环境兼容的输出提供编译器支持。
Web表单
ASP.NET Web Forms就是Web页面,同现在你用 ASP编写代码所做的工作是一样的。但是还不仅仅如此,ASP.NET Web Forms是在一个面向对象的编程模型上设计的,这样代码就能够再利用,并且使应用程序代码与页面内容分隔开。在Visual Basic中,你将一个控件拖曳到一个表单上,然后执行其下的事件程序。在传统的 ASP中,这是不可能的,因为在用户界面控件和它们的服务器端代码之间没有链接存在。但是在ASP.NET中,这样的一个链接是存在的。所以,你可以编写下面表1所示的代码,而不用手动从变量表中拖出值:
表1 简单ASP.NET Web Form例程
<html>
<script language=“vb” runat=“server”>
Sub SubmitButton_Click(Source As Object, E As EventArgs)
Response.Write (ÒYou entered Ò & Name.text)
End Sub
</script>
<body>
<form method=“post” runat=“server”>
Name: <asp:textbox id=“Name” runat=“server” /><br>
<asp:Button text=“Enter”
OnClick=“SubmitButton_Click” runat=“server” />
</form>
</body>
</html>
在表1中有两点值得注意。第一是在表单上 runat=“server” 属性和 asp:textbox控件的使用,这可以告诉 ASP.NET 服务器和客户都可以使用这些控件。如此使用的控件叫做服务器控件。asp: 用做控件名的前缀,它本身就识别了控件是从哪来的。稍后我将讨论这一点。第二个需要注意的细节是OnClick事件。开发DHTML 代码时,你经常要用到 OnClick事件,这是为了在浏览器中激活一个事件。因为为控件设置了runat=“server” 属性,所以事件只在服务器上被激活。要对这个例子进行扩展,可以去掉 Response.Write,然后用一个基于服务器的控件来代替它,比如下面的表2代码:
表2 使用基于服务器的控件
<html>
<script language=“vb” runat=“server”>
Sub SubmitButton_Click(Source As Object, E As EventArgs)
YouEntered.Text = ÒYou entered Ò & txtName.text
End Sub
</script>
<body>
<form method=“post” runat=“server”>
Name: <asp:textbox id=“txtName” runat=“server” /><br>
<asp:Button text=“Enter”
OnClick=“SubmitButton_Click” runat=“server” />
<br>
<asp:label id=“YouEntered” runat=“server”></span>
</form>
</body>
</html>
这个代码运行相当好,很象一个传统的客户或Visual Basic表单,代码也直观多了。你可以用服务器控件来连接事件过程和基于服务器的代码。这些基于服务器的控件向浏览器发送纯 HTML内容,其中不再含有客户端脚本。实际上,这其中一个重要的设计目的就是要坚持使用固有的 HTML 3.2元素代码以提供最大可能的浏览器兼容性。比如说,表2中的代码生成了以下HTML:
<html>
<body>
<FORM name=“HtmlForm2" method=“post” action=“Test.aspx” id=“HtmlForm2">
<INPUT type=“hidden” name=“__VIEWSTATE” value=“a0z664351470__x”>
Name: <input name=“txtName” type=“text” id=“txtName”><br>
<input type=“submit” name=“Button5" value=“Enter”>
<br>
<span id=“lblYouEntered”></span>
</FORM>
</body>
</html>
生成的代码是符合 HTML 3.2标准的。它执行一个标准投递,将用户输入发送回同一个文件。这里没有对服务器状态进行维护,也没有客户端脚本对状态进行维护。隐含的域执行对控件状态的维护,这意味着在页面的“提交-返回”之间,控件能自动恢复状态,而不需要任何编程干预。虽然 ASP.NET Web控件的默认输出是符合HTML 3.2标准的内容,但是对于更高级的浏览器如Microsoft Internet Explorer 5.0,也可以输出为DHTML格式。这样你就能只使用一套服务器控件来编写页面,允许控件根据浏览器决定发送哪种类型的输出,从而允许你将发送 DHTML的控件和客户端脚本用到最新版本的Internet Explorer中,将纯 HTML 3.2内容发送到其它浏览器中。
页面事件
在此前我提到 ASP.NET已经被从头到脚地重写了,但是我并没有指出它是按照面向对象的思路重建的。在对象树的顶部是Page对象,即页面对象,ASP.NET的每个控件、应用程序和页面都是从这个对象中继承来的,也就是说每个页面都是页面对象的一个例示。页面的Load (装载)事件是一个非常重要的事件,如下面的表3代码所示:
表3 使用页面事件
<html>
<script language=“VB” runat=“server”>
Sub Page_Load(Source As Object, E As EventArgs)
‘ code to run when page loads
End Sub
Sub SubmitButton_Click(Source As Object, E As EventArgs)
‘ code to run when button is clicked
End Sub
Sub Page_Unload(Source As Object, E As EventArgs)
‘ code to run when page unloads
End Sub
</script>
<form runat=“server”>
<asp:Button text=“Enter” OnClick=“SubmitButton_Click” runat=“server” />
<asp:label id=“YouEntered”/>
</form>
</html>
在这里你看到了以前在Visual Basic中经常见到的同样的 Load/Unload (装载/卸载)过程。 当页面被装载时,Load事件被激活,这时所有基于服务器的控件都可用。在与用户的交互作用过程中会生成其它事件。最后,当页面被卸载时激活 Unload事件。
新闻热点
疑难解答
图片精选