ASP+ASP有什么不同

    在以前的文章中我们认识到ASP+是一个完整的操作系统的一部分。但是为什么ASP+不同于以前版本的ASP?他们之间到底有什么不同?如果你仅仅是运行一些页面或应用程序,那么你可能完全不会注意到他们之前的区别。
  
  
一旦你打开ASP+SDK或者帮助文件,你就会发现这个新产品几乎没有一点像以前的版本。
  
  
当然不必惊慌,我们下一步就会看看一些主要的不同点。我们先看看为什么微软公司会认为我们需要一个新版本的ASP,它能帮助我们干什么。作为一名开发者,我们也得知道它有哪些新的特性来帮助我们建立站点和应用。
  
  
我们真的需要一种新的ASP!?
  
微软公司开发ASP+动机我们在上一篇文章已经讨论了。ASP已经取得了巨大的成功,为什么我们还需要一个新的版本!?我们可以从下面四点考虑:
  
  
现在的ASP的只能使用非结构语言编写,比如VBscriptJScript(如果用其它的语言就还需要单独的解释器)。而且当ASP在第一次执行时,它解析并在cache中储存这些代码,这样的局限性就是不允许其它结构性语言比如VBC++的使用,从而限制了它们的优越性。而ASP+真正提供了中层语言执行结构,允许各种语言的使用。
  
使用HTML,文本,对象混合的ASP很容易建立一个大型的页面。但是很难重复利用这些代码,除非你把一些代码放在一个include文件中.这不是最好的解决方法。在很多的场合中,开发一个网络应用需要广泛的专业技能,比如,你写程序,另外一些人做美工,还有一些人设计网页的内容,如果仅仅使用ASP很难把这些人联系起来来完成同一件事。但是ASP+真正允许了单独的代码与内容共存.
  
  
  
在以前版本中的ASP中,你必须为几乎每件事情写代码。为了保持在form中的数据,写代码。为了确认用户写入的数据,写代码。为了发送一些简单的数据,写代码。而在ASP+中引入了一种真正的组件模式,通过这种服务器端的控制以及事件触发,我们似乎感觉是好像是在操作VB"FORM".这种ASP+中的新组件控制是宣告性质的(也就是说,你如果想使用这些组件控制来作一些事情,你只需要声明一下就行了,其它的不用管了,哈哈,是不是觉得有些傻瓜啊?!?),因此你实际上只需写很少的代码了.实际上,在很多情况下,你完全不用写任何的代码.
  
外面的世界时刻都在变化,已经有相当比例的用户是通过"互联网设备"来访问你的站点了,比如说WAP手机,PDA,置顶盒,以及其它的一些,也许不久的将来使用这些上网的用户比用PC的还多。这就意味着我们可能要在服务器上做更多的事以与不同的设备相适应。我们也不得不在使用不同格式输出,比如WML。同时,新的互联设备和商业应用也需要有能力从网络应用中发送或读取WML.现在使用ASP做这些,需要你使用XML解析器,使用XML转换数据。而ASP+网络服务会用更简单的方式使用你做出的页面能够适应不同的设备。
  
除了上面的这些,快速发展的分布是应用也需要开发地更加快速,更加模块化,重复利用性更强,更容易操作,让更多的平台支持。像SOAPSimple Object Access Protocol)这样的新标准以及B2B的商业需要,需要一种新的技术来适应不同的系统。网络应用和网站需要提供一种更加强大的可升级的服务,ASP+能够适应上面的要求,并且能够在发生错误、缓冲区溢出时重新启动应用程序。
  
  
因此为了适应这些需要,ASP已经对基础甚至是开发环境进行了修补。Visual Studio 7.0将会对ASP+应用进行完成的支持(包括ASPASP+,尽管现在还只有很少的工具能够获得其支持。这种丰富的,组件模式程序开发模块被设计得相当友好,同时它也支持所有Visual Studio 语言,包括VB,C++以及C#,特别注意一下第三种语言,它流行的日子离我们不太遥远了。
  
  ASP+
怎样让你的生活更加简单?
  
对于今天的WEB程序员来说最大的挑战就是不断变化地浏览器的兼容性,以及它们不断升级的复杂性。在保证页面能在所有流行浏览器下工作的同时又得尽量地使用每个浏览器最新属性来建立更加具有交互式的页面,这简直就是一场恶梦。
  
  
更加可怕的就是对于不同的用户设备建立不同的网页。当然,在WAP手机和传统的浏览器上建立同等水平的页面是不可能,因为由于带宽的原因,在很多WAP手机中一次只能显示123行的文本信息。
  
  
一个最简单的解决办法就是动态地对不同的用户生成不同的输出,或者就是对不同的用户写多个页面。第二种方法没有效率,我想大多数地开发者都会选择第一种方法。但是这就意味着用户的每次点击都会让服务器判断应该向用户显示什么.
  
  
如果这一切可能,为什么不把这些过程自动化!?为了结束这一切,ASP+引入了一个新的服务控制的概念,它封装了一些普通的任务,提供了一种清晰的编程模块。他们同样帮助管理处理不同的用户类型。
  
  
服务器端HTML控制使得我们减少了不少的代码
  ASP
已经提供了一种在服务器上执行组件的能力,这些组件能够产生一些代码用以返回给用户。ASP+通过服务控制继承了这一概念。转换HTML元素到服务控制的需要仅仅是一个附加的属性:runat="server"(这个我们在ASP也见到过)
  
  
页面中的任何HTML元素都能使用这种方法标注,ASP+会在服务器上执行这些元素,并且对不同的用户产生不同的代码。
  
  
  
这种让HTML元素在服务器上执行的概念第一次看来有些奇怪,但是当你发现在它在这个页面变得完全功能化,你还有什么好想的了。
  
  
保持状态的问题
  
在我们建立交互页面和应用时最烦人的一个问题就是处理从客户端传来的数据,然后保持这些数据加以控制。ASP+的一个核心目标就是简化这一过程。这不会给程序员带来任何的困惑,而且能在大多数的浏览器上工作正常。
  
  
我们先来看看下面的代码。这段代码制作了一个简单的页面让用户输入电脑的名字和选择操作系统。OK,它本身不是个很烦人也不是令人兴奋的例子,但是它反映了我们常常做的一些事。当这个页面提交后,使用request.form集来取得相应的数据,然后用request.write显示它们.
  
  <HTML>
   <BODY>
   <%
   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
   %>
   <FORM action="pageone.asp" method="post">
   Machine Name:
   <INPUT type="text" name="txtName">
   <P />
   Operating System:
   <SELECT name="selOpSys" size="1">
   <OPTION>Windows 95</OPTION>
   <OPTION>Windows 98</OPTION>
   <OPTION>Windows NT4</OPTION>
   <OPTION>Windows 2000</OPTION>
   </SELECT>
   <P />
   <INPUT type="submit" value="Submit">
   </FORM>
   </BODY>
  </HTML>
  
  
  
  
尽管这是一个ASP文件(后缀名是.asp不是.aspx,但是如果我们把它的文件后缀改为.aspx,它同样能够在ASP+工作正常。请记住,这两个系统能够在一个机器上很好的共存,这个后缀名只是在判断,这个解析工作是ASP来做,还是ASP+来做。
  
  
下面的快照中我们看到了在IE5中执行的结果,当用户点击这个提交按钮,将会把数据传向服务器,这个页面将会被刷新,同时显示我们选择的结果。当然,在真正的应用中我们可以将这些数据存入数据,或者做一些其它的事,这里为了简便,我们只是让它显示出来。
  
  
  
  
这个页面的问题便是它不能保持状态,换句话说就是它只能返回默认值,用户在重新此页时不得不重新输入数据。如下图:
  
  
  
  
为了实现上面的要求,我们不得不在这个代码中加入一些数据,如下:
  
   <FORM action="pageone.asp" method="post">
   Machine Name:
   <INPUT type="text" name="txtName"
   value="<% = Server.HTMLEncode(Request("txtName")) %>">
   <P />
   Operating System:
   <select name="selOpSys" size="1">
   <OPTION
   <% If strOpSys = "Windows 95" Then Response.Write " selected" %>>
   Windows 95</OPTION>
   <OPTION
   <% If strOpSys = "Windows 98" Then Response.Write " selected" %>>
   Windows 98</OPTION>
   <OPTION
   <% If strOpSys = "Windows NT4" Then Response.Write " selected" %>>
   Windows NT4</OPTION>
   <OPTION
   <% If strOpSys = "Windows 2000" Then Response.Write " selected" %>>
   Windows 2000</OPTION>
   </SELECT>
   <P />
   <INPUT type="submit" value="Submit">
   </FORM>
  
  
看看上面的代码,那么多的if .....then ,很烦人吧(其实在ASP中这一些是可以简化,可能是原作者想突出ASP+ASP更简洁,故意把这个代码写得很长)下面的图是我们修改后的代码结果:
  
  
  
  
自动保持状态的控制
  
那么ASP+是怎样处理这个问题的了!?下面的代码让我们看到了ASP+的优点给我们带来的变化。我们来仔细看看下面的代码吧。这次这个页面中的一些元素加上了runat="server"的属性。当ASP+看到这些元素,它将会在服务器上执行这些代码,并且产生正确的输出:
  
   <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+如何比ASP简单了。下面是执行的结果,和ASP编写的没有区别:
  
  
  
  
服务器是怎样工作的?!?
  
这些数据是怎样获得的呢!?这里的关键是runat="server" 属性.为了有一个感性认识,我们先看看这个页面的HTML源代码:
  
  <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>
  
  
你现在看到ASP+自动加上了actionmethod方法,因此这个页面将会以post方式进行提交。ASP+同时也给form加上了一个唯一值的idname值,而这些我们根本就没有指定(不过你也可以指定,指定后以你指定的为准)
  
  
如果你在加了"GET"属性,这个form就会以querystring方式被接收,就和以前的ASP一样,这个自动状态也不会工作的。
  
  
在这个页面中我们使用下面的代码建立text:
  
  <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+
因为在<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.
  
  ASP+
的服务器代码
  
为了在页面中显示这些值,我们使用和上面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属性,因此服务控制(也就是说有runat="server"的元素)必须依赖原始代码。这也就是说我们不需要使用request集合去访问客户端传来的值,只要使用唯一的id就行了.
  
   ...
   If Len(selOpSys.value) > 0 Then
   Response.Write("You selected '" & selOpSys.value _
   & "' for machine '" & txtName.value & "'.")
   End If
   ...
  
  ASP+
中的VB代码
  
在我们刚才看到的ASP页面中,脚本语言是使用的vbscript(它不是唯一的,但是如果没有别的设定,那么它就是被默认的语言).ASP+中,它再也不支持VBscript了,它的默认语言是Visual Basic(VB),因此我们的代码会被编译成为IL(Intermediate Language).
  
  
在新的VB7.0vb的编译器已经包括了ASP+(哈哈,是不是一个好消息了,我们不需要重新买东东了)。在这个新版本中,一个最值得注意的就是在VB7中所有方法都必须有以圆括号包含的参数列表。而这个要求在VBscript和以前的VB版本中是不需要的。
  
  
服务器事件的执行。
  
当然,如果你想让一些HTML元素在服务器上执行,那么为什么不把这个概念再扩展一下?!ASP+已经将每一个页面变成了一个服务器对象,同时提供了很多属性,方法和事件,这一切能够在你的页面中很好的利用。每个页面变成了COM+对象上的一个节点,当它们被请求时能够独立的运行和编写。
  
  
使用服务器端的控制事件
  
好好看一下下面的代码,看看,我们是如何利用ASP+的优点来完美地结构化我们的页面。
  
  <HTML>
   <BODY>
   <SCRIPT language="VB" runat="server">
   Sub ShowValues(Sender As Object, Args As EventArgs)
   divResult.innerText = "You selected '" _
   & selOpSys.value & "' for machine '" _
   & txtName.value & "'."
   End Sub
   </SCRIPT>
   <DIV id="divResult" runat="server"></DIV>
   <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"
   runat="server" onserverclick="ShowValues">
   </FORM>
   </BODY>
  </HTML>
  
  
首先请注意我们在<script>中指定VB是当前语言,并且有一个runat="server"的属性.在里面我们写了一个名叫showValuesVB的函数(在ASP+中,函数和子程序必须得放在<script>中,并不是<% ....%>之间)
  
  
我们也添加了一个有着runat="server"HTML标签<div>。因此这个元素会在服务器上创建。当这个VB子程序被执行时,它将使用<div>元素的innerText属性.
  
  
同样我们也得注意一下它是如果取得请求值的。因为这个text box以及<select>列表也是在服务器上执行的,我们的程序能够直接通过访问这些控制的value属性获取它们的值,这个<div>元素执行后的代码会是下面的样子:
  
  <DIV id="divResult">You selected 'Windows NT4' for machine 'lewis'.</DIV>
  
  
联接服务控制事件
  
到目前为此,你可能会问这个VB子程序是怎样执行的!?很简单,我们在<input>元素中建立了一个submit按钮,并且加上了两个新的属性:
  
  <INPUT type="submit" value="Submit"
   runat="server" onserverclick="ShowValues">
  
  
这个runat="server"属性转换HTML成服务控制,它是"可见的"。这个onserverclick="showValue"属性告诉runtime它将会在被点击后执行ShowValues子程序.
  
  
这个代码执行的结果和前面的例子没有什么两样,但是ASP+的代码便比以前更结构化了,这样就增加了文件的可读性。