以文本方式查看主题

-  咿思舞论坛  (http://bbs.145829.com/index.asp)
--  『网站资源』  (http://bbs.145829.com/list.asp?boardid=8)
----  利用ASP开发基于MTS的Web应用软件  (http://bbs.145829.com/dispbbs.asp?boardid=8&id=727)

--  作者:admin
--  发布时间:2010/12/9 13:19:33
--  利用ASP开发基于MTS的Web应用软件
Active Server Pages(ASP)是Microsoft公司推出的Windows NT环境下服务器端的脚本编写语言,利用它可以调用Web服务器上注册的ActiveX组件来执行任务,从而生成功能强大的Web应用程序。由于ASP脚本在Web服务器上运行,用ASP创建的应用可以被跨不同平台运行的多种Web浏览器访问。
  在IIS 4.0中,ASP结构提供了六个内建对象, 内建对象的特殊性在于,它们在 ASP 页内生成且在脚本中使用它们前无须创建。其中,内建对象ObjectContext专门用于支持开发基于Microsoft Transaction Server(MTS)的事务型Web应用软件。
  一、ASP的内建对象
  ASP的六个内建对象介绍如下:
  (1)Application 对象
  可以使用Application对象在Web应用程序的所有用户之间共享信息。基于 ASP 的Web应用程序在一个虚拟目录及其子目录中定义。因为多个用户可以共享 Application 对象,所以必须要用 Lock 和 Unlock 方法以确保多个用户无法同时改变某一属性。
  (2)ObjectContext 对象
  可以使用 ObjectContext 对象提交或放弃一项由MTS管理的事务。具体细节,后面将加以详述。 
  (3)Request 对象
  使用Request 对象可以获得客户端浏览器传递给Web服务器的参数值 。
  (4)Response 对象
  使用 Response 对象可以将输出发送到客户端。
  (5)Server 对象
  Server 对象的CreateObject方法可以在服务器端创建一个ActiveX组件的实例,从而使用ActiveX组件来执行任务,例如对数据库操作等。
  (6)Session 对象
  可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
  二、ASP事务处理基本原理
  ASP 事务处理是以Microsoft Transaction Server(简称MTS)为基础的。MTS 是一个运行于Windows NT环境下的事务处理系统,用于开发、配置和管理高性能、可分级的、有鲁棒性的企业 Internet 和 Intranet 服务器应用程序。MTS为开发分布式的,基于组件的应用程序提供了一个应用程序设计模型,它也为配置和管理这些应用程序提供了一个运行环境。
  创建事务性脚本的功能内置在 Internet Information Server中。如果您安装了 Microsoft Transaction Server,就可以将组件打包,以使组件在事务内部运行。
  事务是整体成功或失败的操作,事务处理常用于对数据库进行可靠地更新。在对数据库进行许多相关更改或同时更新多个数据库时,要保证所有更改都被正确执行。如果这些更改中的任何一个失败,都需要恢复数据库表的原始状态。
  如果没有 MTS,您就需要编写脚本和组件,手工跟踪请求的更改情况,以便在某些更改失败时恢复数据。使用 MTS,您只需简单的将您的脚本和组件声明为“需要事务”并让 MTS 处理事务的一致性。事务处理只适用于数据库访问;MTS 不能对文件系统或其他的非事务性资源的更改进行恢复操作。应用程序所访问的数据库必须为 MTS 所支持。目前,MTS 支持 Microsoft SQL Server 及任何支持 XA 协议(由 X/Open 协会制定)的服务器。MTS 将继续扩展对其他数据库的支持。
  事务不能跨越多个 ASP 页。如果一个事务需要来自多个组件的对象,则须将使用这些对象的操作组合在一个 ASP 页中。例如,假定有一个组件用于更新工资单数据库,还有一个组件用于更新人力资源数据库中的员工记录。为了记录一个员工的新的工资信息,您需要编写这样一个脚本,该脚本在一个事务环境中调用这两个组件,一个用于更新工资单数据库,另一个用于更新人力资源数据库中的员工等级。
  三、在ASP脚本中编写事务型应用
  1. 声明事务性脚本
  在将一个ASP页声明为事务性时,此页中的任何脚本命令和对象都运行在同一个事务环境中,MTS处理生成事务的细节并决定事务成功(提交)或失败(终止)。要将某个页声明为事务性,可在页首添加 @TRANSACTION 指令:
  〈%@ TRANSACTION = value %〉
  value 参数可以是下列之一:
  Requires_New :启动一个新的事务。 
  Required : 启动一个新的事务。 
  Supported: 不启动事务。 
  Not_Supported: 不启动事务。 
  @TRANSACTION 指令必须在一页中的第一行,否则将产生错误。必须将该指令添加到需要在事务下运行的每一页中。当脚本处理结束时,当前事务即告结束。
  如果事务被终止,MTS将恢复对支持事务的资源的任何更改。目前,仅数据库服务器完全支持事务,因为数据库中的数据对于企业应用是最为关键的。MTS不对硬盘上的文件、会话和应用程序的变量、集合等的改变进行恢复,然而您可以如下文所述,通过编写事务事件来编写恢复变量和集合的脚本。在某些时候,您的脚本也可以显式的提交或终止一个事务,如向文件写数据失败时。
  2. 提交或终止脚本
  利用 ObjectContext 对象可以提交或放弃一项由MTS管理的事务,为此,ObjectContext 对象提供了两个方法:
  (1)SetComplete 方法
  声明脚本不了解事务未完成的原因。如果事务中的所有组件都调用 SetComplete,事务将完成。
  (2)SetAbort 方法
  声明被脚本初始化的事务未完成,无法更新源。
  示例:
  这里示范使用 SetAbort 和SetComplete 的方法。假设有一个网上有偿借阅图书馆的主页,其中,BorrowBookData.htm 文件获取处理借阅图书请求所需的数据。第二个文件BorrowVerify.asp 中的脚本使用两个对象Inventory 和 Borrow 来处理借阅(注意,在本文所举的例子中,使用了一些作者自己开发的Web服务器端ActiveX组件对象,如对象Inventory 和 Borrow等,在实际应用中,这些组件对象需由读者自行开发)。如果 Inventory 返回了错误代码表示存书不足,就会调用 SetAbort。如果 Inventory 对象没有返回错误代码,将会调用 SetComplete 处理借阅请求。
  BorrowBookData.htm 源文件:
   〈HTML〉
   〈HEAD〉
   〈TITLE〉借书单〈/TITLE〉
   〈/HEAD〉
   〈BODY〉
   〈H2〉借书单〈/H2〉
   〈FORM METHOD="POST" ACTION="Borrow Verify.asp"〉 
   请输入书号、借阅数量、借阅费用:
   〈INPUT TYPE="TEXT" NAME="Book Code" 〉
   〈INPUT TYPE="TEXT" NAME="QuantityTo Borrow" 〉
   〈INPUT TYPE="TEXT" NAME="Account In" 〉 
   〈INPUT TYPE="SUBMIT" VALUE="提交" 〉 
   〈/FORM〉
   〈/BODY〉
   〈/HTML〉
   BorrowVerify.asp源文件:
   〈%@ Transaction = Required %〉
   〈%
   Set CurrentQOB = Server.CreateObject("Mylib. Inventory") \' 创建Inventory对象
   Set CurrentBorrow = Server.CreateObject ("Mylib.Borrow") \' 创建Borrow对象
   CheckQuantity = Request.Form("QuantityTo Borrow")
   CheckBook = Request.Form("BookCode")
   QuantityStatus = CurrentQOB.CheckQOB (CheckQuantity,CheckBook) \'检查存书量
   If QuantityStatus = None \'如果存书量不足
   ObjectContext.SetAbort \'终止事务
   Response.Write "对不起,存书量不足!"
   Else \'如果存书量充足
   ObjectContext.SetComplete \'继续执行事务
   Account = Request.Form("AccountIn")
   Saleupdate = CurrentBorrow.PostIt(Account)
   End If
   %〉
  3. 编写事务事件
  脚本本身不能决定事务是成功还是失败。但是,可以编写提交或终止事务时被调用的事件。为此,ObjectContext 对象提供了两个事件:
  (1)OnTransactionCommit 事件
  它在一个已处理的脚本事务提交后发生。该事件发生时,如果脚本中有 OnTransactionCommit 子例程,IIS 将处理该子例程。
  (2)OnTransactionAbort 事件
  如果事务异常终止,就会发生该事件。当 OnTransactionAbort 事件发生时,如果脚本中有 OnTransactionAbort 子程序,则 IIS 将执行它。
  例如,假设有一个根据借阅者帐户、密码进行业务处理的脚本,并且您需要针对事务的不同状态将不同的页返回给用户,那么就可以使用 OnTransactionCommit 和 OnTransactionAbort 事件来编写对用户的不同响应。
  示例:
   〈%@ TRANSACTION = Required %〉
   〈%Response.Buffer = True \'缓存输出 %〉
   〈HTML〉
   〈BODY〉
   〈H1〉网上有偿借阅图书馆〈/H1〉
  〈% \' 创建作者自己开发的ActiveX组件对象
   Set LibAction = Server.CreateObject ("MyExample.LibComponent")
   \' 根据借阅者输入的帐户、密码进行业务处理
   LibAction.Borrow(Request.Form("Account Num"),Request.Form("Password")) 
   %〉
   〈/BODY〉
   〈/HTML〉
   〈% \' 如果借阅者帐户有效显示下页
   Sub OnTransactionCommit()
   Response.Write "〈HTML〉"
   Response.Write "〈BODY〉"
   Response.Write "帐户有效!"
   Response.Write "〈/BODY〉"
   Response.Write "〈/HTML〉"
   Response.Flush()
   End sub %〉
   〈% \' 如果借阅者帐户无效显示下页
   Sub OnTransactionAbort()
   Response.Clear()
   Response.Write "〈HTML〉"
   Response.Write "〈BODY〉"
   Response.Write "帐户无效!"
   Response.Write "〈/BODY〉"
   Response.Write "〈/HTML〉"
   Response.Flush()
   End sub %〉
if ($ != jQuery) { $ = jQuery.noConflict(); }