为什么我们需要一个新版本的ASP?
作 者 : 青苹果电脑工作室
在前一篇文章中已经讨论过Microsoft 在设计和开发ASP+时的主要动机。ASP非常成功,为什么
还要一个新版本?有4个问题需要考虑:
● 目前,ASP脚本主要是用基本的non-typed 语言,例如VBScript 和JScript来写的(除非你安装了一
个独立的语言解释程序)。尽管ASP第一次执行页面代码时确实进行分解和缓存,这一局限导致即使
在有优势的时候,也不能使用那些strongly-typed 的语言,例如Visual Basic 和C++。而ASP+为
Web 应用程序提供了真正中立于语言的执行框架。
● 创建包含着一长串各种代码、HTML、文本、对象声明混合在一起的大型ASP页也是非常容易的。
要再利用这些代码是很困难的,除非你将其放在独立的'include' 文件中,这也不是个很好的办法。
在许多环境下,开发一个web 应用程序需要各方面的专业人员,例如,需要程序员来写代码,需要
设计师来使HTML看起来漂亮。让代码和内容混杂在一个双方都需要在其上进行操作的文件中使它们
很难在一起工作。而ASP+ 提供代码和内容的真正分离。
● 在以前版本的ASP中,大多数事情都要靠写代码来完成。想维护表单域的状态吗?写代码。想
确认客户输入的数据吗?写代码。想发出一些简单的数据值吗?写代码。想缓存页面区优化性能吗?
写代码。而ASP+ 用基于服务器的控制和从概念上来说同Visual Basic 表单工作的方式相同的事件
驱动运行范例介绍了一种真正的组件模型。新的ASP+ 服务器控制是声明式的(需要它们做一些事情
时才需要声明它们),所以你就可以少写一些代码,实际上,大多数情况下根本就不用写任何代码。
● 世界是变化的。通过'Internet device' ,例如移动电话、PDA、电视机顶盒、游戏控制台或
其他东西访问你的网站的用户比例很快就会超过使用PC和传统浏览器的用户。这就意味着我们不得
不在服务器上做更多的工作,来使我们的网页与这些不同的设备相兼容。我们不得不以全新的格式
创建输出,例如Wireless Markup Language (WML)。另外,除了要为运行创建WML,新的Internet
设备和商业应用程序还要求能够从Web应用程序发送和接收XML数据。现在用ASP做这些需要你手工
使用XML 分解,从XML 计划转换数据,或将数据转换成XML 。ASP+ Web 服务使将页面剪裁得适应
特定设备变得很简单。
除此之外,分布式应用程序迅速变化的特性要求更快地开发、更加组件化、可再利用、更易于
展开和更广泛的平台支持。新的标准例如简单对象访问协议Simple Object Access Protocol
(SOAP), 新的商业需求例如business-to-business (B2B) 数据交换,要求用新技术产生输出和与
其它系统通讯。Web 应用程序和Web 站点也需要更加灵活和可升级的服务,这些ASP+ 通过倾向于
积极的监控和应用程序失败时的自动重新启动,内存释放等等都提供了。
所以,要想满足这些要求,ASP必须要进行全面的修改来变成一个全新的编程环境。尽管目前
很少有可用于此的工具,Visual Studio 7.0 可以提供全面支持使创建ASP+ 应用程序简单(包括
ASP+ 页面和ASP+ 服务)。丰富的、基于组件的、事件驱动的编程模型特意设计成“工具友好”,
而这种支持对于所有的Visual Studio 语言,包括VB, C++和C#. 都可用。而你也可以确信第三方
的工具制造商也不会落后太多。
在前一篇文章中已经讨论过Microsoft 在设计和开发ASP+时的主要动机。ASP非常成功,为什么
还要一个新版本?有4个问题需要考虑:
● 目前,ASP脚本主要是用基本的non-typed 语言,例如VBScript 和JScript来写的(除非你安装了一
个独立的语言解释程序)。尽管ASP第一次执行页面代码时确实进行分解和缓存,这一局限导致即使
在有优势的时候,也不能使用那些strongly-typed 的语言,例如Visual Basic 和C++。而ASP+为
Web 应用程序提供了真正中立于语言的执行框架。
● 创建包含着一长串各种代码、HTML、文本、对象声明混合在一起的大型ASP页也是非常容易的。
要再利用这些代码是很困难的,除非你将其放在独立的'include' 文件中,这也不是个很好的办法。
在许多环境下,开发一个web 应用程序需要各方面的专业人员,例如,需要程序员来写代码,需要
设计师来使HTML看起来漂亮。让代码和内容混杂在一个双方都需要在其上进行操作的文件中使它们
很难在一起工作。而ASP+ 提供代码和内容的真正分离。
● 在以前版本的ASP中,大多数事情都要靠写代码来完成。想维护表单域的状态吗?写代码。想
确认客户输入的数据吗?写代码。想发出一些简单的数据值吗?写代码。想缓存页面区优化性能吗?
写代码。而ASP+ 用基于服务器的控制和从概念上来说同Visual Basic 表单工作的方式相同的事件
驱动运行范例介绍了一种真正的组件模型。新的ASP+ 服务器控制是声明式的(需要它们做一些事情
时才需要声明它们),所以你就可以少写一些代码,实际上,大多数情况下根本就不用写任何代码。
● 世界是变化的。通过'Internet device' ,例如移动电话、PDA、电视机顶盒、游戏控制台或
其他东西访问你的网站的用户比例很快就会超过使用PC和传统浏览器的用户。这就意味着我们不得
不在服务器上做更多的工作,来使我们的网页与这些不同的设备相兼容。我们不得不以全新的格式
创建输出,例如Wireless Markup Language (WML)。另外,除了要为运行创建WML,新的Internet
设备和商业应用程序还要求能够从Web应用程序发送和接收XML数据。现在用ASP做这些需要你手工
使用XML 分解,从XML 计划转换数据,或将数据转换成XML 。ASP+ Web 服务使将页面剪裁得适应
特定设备变得很简单。
除此之外,分布式应用程序迅速变化的特性要求更快地开发、更加组件化、可再利用、更易于
展开和更广泛的平台支持。新的标准例如简单对象访问协议Simple Object Access Protocol
(SOAP), 新的商业需求例如business-to-business (B2B) 数据交换,要求用新技术产生输出和与
其它系统通讯。Web 应用程序和Web 站点也需要更加灵活和可升级的服务,这些ASP+ 通过倾向于
积极的监控和应用程序失败时的自动重新启动,内存释放等等都提供了。
所以,要想满足这些要求,ASP必须要进行全面的修改来变成一个全新的编程环境。尽管目前
很少有可用于此的工具,Visual Studio 7.0 可以提供全面支持使创建ASP+ 应用程序简单(包括
ASP+ 页面和ASP+ 服务)。丰富的、基于组件的、事件驱动的编程模型特意设计成“工具友好”,
而这种支持对于所有的Visual Studio 语言,包括VB, C++和C#. 都可用。而你也可以确信第三方
的工具制造商也不会落后太多。
ASP已经提供了在服务器上运行组件的机会,这些组件产生返回给用户的页面部分。ASP+ 通过
服务器控制扩展了这一概念。将任何HTML元素转换成服务器控制所需要做的只是增加一个额外的
属性: runat="server"。
一页中的任何HTML元素都可以用这种方法做标记,然后ASP+ 就在服务器上处理这些元素,然后
产生适合这一特定服务器的输出。另外作为副产品,我们还可以特别创造一个额外的小窍门,用
HTML 〈 FORM 〉 和控制元素相关联的表单创建代码,在到服务器的往返旅行中维护状态。这就使编程
的过程不那么单调,更具有创造性。
让HTML元素在服务器上执行的概念开始看来有点奇怪,你会发现它为页面的功能增加了一个全
新的层面,同时又更加容易编写。一个程序员还会再要求什么呢?
在通常遇到的情况下,ASP+ 如何帮助我们?下面的清单显示利用ASP+ 服务器控制自动状态
所需要的改变。还是使用Response.Write 方法显示选中的值。但是这次页面上的有些元素要增加
一个特殊的runat="server" 属性。ASP+ 看到这些元素,就在服务器上处理它们并且为客户创建
适当的HTML输出。
〈 FORM runat="server" 〉
Machine Name:
〈 INPUT type="text" id="txtName" runat="server" 〉
〈 P / 〉
Operating System:
〈 select id="selOpSys" size="1" runat="server" 〉
〈 OPTION 〉Windows 95〈 /OPTION 〉
〈 OPTION 〉Windows 98〈 /OPTION 〉
〈 OPTION 〉Windows NT4〈 /OPTION 〉
〈 OPTION 〉Windows 2000〈 /OPTION 〉
〈 /SELECT 〉
〈 P / 〉
〈 INPUT type="submit" value="Submit" 〉
〈 /FORM 〉
你可以清楚地看出这个ASP+ 页比上一个例子要简单。当载入Internet Explorer 5 并将值提交
给服务器时,出现的结果是一样的。
这是如何实现的?关键是runat="server" 属性。要了解这是如何进行的,看看浏览器内页面
的源代码。是这样的:
〈 HTML 〉
〈 BODY 〉
You selected 'Windows 98' for machine 'tizzy'.
〈 FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0" 〉
〈 INPUT type="hidden" name="__VIEWSTATE" value="a0z1741688109__x" 〉
Machine Name:
〈 INPUT type="text" id="txtName" name="txtName" value="tizzy" 〉
〈 P / 〉
Operating System:
〈 SELECT id="selOpSys" size="1" name="selOpSys" 〉
〈 OPTION value="Windows 95" 〉Windows 95〈 /OPTION 〉
〈 OPTION selected value="Windows 98" 〉Windows 98〈 /OPTION 〉
〈 OPTION value="Windows NT4" 〉Windows NT4〈 /OPTION 〉
〈 OPTION value="Windows 2000" 〉Windows 2000〈 /OPTION 〉
〈 /SELECT 〉
〈 P / 〉
〈 INPUT type="submit" value="Submit" 〉
〈 /FORM 〉
〈 /BODY 〉
〈 /HTML 〉
用这个ASP+ 代码创建 〈 FORM 〉 :
〈 FORM runat="server" 〉
...
〈 /FORM 〉
当页面被ASP+执行时,到浏览器的输出是:
〈 FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0" 〉
...
〈 /FORM 〉
可以看到action 和 method 属性是ASP+自动创建的,所以表单中控制的值就会被邮递回同一页。
ASP+还为表单增加唯一的id 和 name 属性,因为我们没有提供。但是如果你确实指定了这些属性,
就会使用你所指定的值。
如果包含了method="GET" 属性,表单的内容就作为查询字符串的一部分被发送给服务器,同
以前版本的ASP一样,自动状态管理就不再有效。
在表单内,用这样的ASP+ 代码创建文本框:
〈 INPUT type="text" id="txtName" runat="server" 〉
浏览器的结果是这样的:
〈 INPUT type="text" id="txtName" name="txtName" value="tizzy" 〉
可以看到当表单被提交时,ASP+以控制中的文本值自动增加了value 属性。它还保留了我们
提供的name 属性,还以同样的值增加了一个id属性。
我们为〈 SELECT 〉 列表写了以下代码:
〈 SELECT id="selOpSys" size="1" runat="server" 〉
〈 OPTION 〉Windows 95〈 /OPTION 〉
〈 OPTION 〉Windows 98〈 /OPTION 〉
〈 OPTION 〉Windows NT4〈 /OPTION 〉
〈 OPTION 〉Windows 2000〈 /OPTION 〉
〈 /SELECT 〉
ASP+ 被迫输出这个HTML,适当的〈 OPTION 〉元素 有一个selected属性:
〈 SELECT name="selOpSys" id="selOpSys" size="1" 〉
〈 OPTION value="Windows 95" 〉Windows 95〈 /OPTION 〉
〈 OPTION selected value="Windows 98" 〉Windows 98〈 /OPTION 〉
〈 OPTION value="Windows NT4" 〉Windows NT4〈 /OPTION 〉
〈 OPTION value="Windows 2000" 〉Windows 2000〈 /OPTION 〉
〈 /SELECT 〉
同样创建一个唯一的id 属性,并自动给〈 OPTION 〉元素增加相匹配的 value 属性。(如果我们
在页面中提供了自己的value属性,将被保留)。
所以你可以看到,并没有使用什么神奇的手段。都是标准的HTML,没有客户机侧脚本库,也
没有ActiveX 控制或 Java applets。同样重要的一点是在服务器上根本没有存储任何状态。相反,
只是用标准的方法将值简单地邮递给服务器。在页面发送给客户之前,通过请求,值由修改服务器
控制的HTML保存并维护。
要在页面上显示值,我们使用与早先的ASP 例子中相同的代码:
...
If Len(Request.Form("selOpSys")) 〉 0 Then
strOpSys = Request.Form("selOpSys")
strName = Request.Form("txtName")
Response.Write("You selected '" & strOpSys _
& "' for machine '" & strName & "'.")
End If
...
但是ASP+ 和服务器控制的一个很大的特色是正在服务器上运行并产生页面输出的代码都可以
使用它们。ASP+解释程序强调都要有唯一的id 属性,这样所有的服务器控制(例如那些有
the runat="server" 属性的元素)都可以被代码重新使用。这就意味着我们不再使用Request 集合
来获取从我们的表单控制邮递回服务器的那些值。相反,可以直接使用它们唯一的id来引用它们:
...
If Len(selOpSys.value) 〉 0 Then
Response.Write("You selected '" & selOpSys.value _
& "' for machine '" & txtName.value & "'.")
End If
