QQ网名大全

如何实现asp三层架构

ASP具有良好的扩充性,我们访问数据库时,采用的时ADO对象,访问文件时,采用的是文件系统对象(FSO),其实这时程序已经是三层结构的应用程序了,只不过由于是利用内置的对象而为意识到罢了。这些对象都遵循COM/ActiveX接口,因此我们自己开发的对象也要遵循这个接口。下面,我们就以上文提到的"合格"标准为例,演示如何创建自己的三层结构的ASP应用。
1、在数据库系统中建立如下数据库表:
    Employee: EMPLID char (5) not null,
             Name  char (10) not null,
             Gender char (1) not null,
             Score   int not null
此表存储员工信息和考试成绩,为简单起见,这里只包含工号,姓名和性别三项,并且只有一门考试,EMPLID为主键。

2、建立动态链接库

启动VB(这里以VB为例,你可以用你喜欢的任何支持ActiveX接口的开发工具开发),新建一工程,工程类型为ActiveX
DLL。在工程中新建一个类,取名为Employee。你可以Class
Builder可视化的向类中填加属性和方法,也可以直接手工编辑。首先填加EMPLID属性如下:
  Private msEMPLID as string
  Property Let EMPLID(sEMPLID as string)
   msEMPLID=sEMPLID
  End Property
  Property Get EMPLID() as string
   EMPLID=msEMPLID
  End Property
一般地讲,每一个属性都应该有Property
Let和Property
Get两个方法,它们分别当向属性赋值和读取属性值时被调用。如果某个属性只被赋值而从不被读取(这种情况多发生在对应数据库表的主键的属性上),则Property
Get方法可以省略。Property
Let方法不能省略。你可以仿照上面的程序再建立Name,Gender和Score三个属性。然后创建如下方法:
  Public Sub Create(EMPLID as string)
  dim conn as new Connection
  dim rs as new Recordset
  dim sql as string
  'Suppose that you create a DSN in the control panel, the connectionstring property
  'can also be dsn-less string
  conn.ConnectionString="dsn=dsnname;uid=username;password=pwd"
  conn.open
  sql="select * from Employee where EMPLID='" & EMPLID & "'"
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     msEMPLID=trim(.Fields("EMPLID"))
     msName=trim(.Fields("Name"))
     msGender=trim(.Fields("Gender"))
     msScore=.Fields("Score")
   end if
   .close
  end with
  set rs=nothing
  conn.close
  set conn=nothing
  End Sub
这里根据EMPLID创建Employee对象,注意数据库中的值是赋给三个私有变量,而不是直接赋值给属性,如果你单步调试就会发现,给msEMPLID赋值会调用Property Let EMPLID,也就是给属性赋值。
  下面我们再创建一个类Employees,并填加如下方法:
  private colQualifiedList as new Collection
  private mnCurrentIndex as integer
  Public Sub GetQualifiedList()
  dim conn as new Connection
  dim rs as new Recordset
  dim sql as string
  'Suppose that you create a DSN in the control panel, the connectionstring property
  'can also be dsn-less string
  conn.ConnectionString="dsn=dsnname;uid=username;password=pwd"
  conn.open
  sql="select EMPLID from Employee where Score>=60 order by Score desc"
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     do while not .eof
       dim oEmployee as new Employee
       oEmployee.Create trim(.Fields("EMPLID"))
       colQualifiedList.Add oEmployee
       set oEmployee=nothing
     loop
   end if
   .close
  end with
  set rs=nothing
  conn.close
  set conn=nothing
  End Sub
首先请注意VB中创建类实例的语法dim
oEmployee as new
Employee,后面会看到,在ASP中创建类实例的语法是不同的。这个方法检索成绩大于等于60的员工工号,并据此创建一个Employee对象,再将此对象加入私有的集合对象中。下面两个函数遍历集合中的元素:
  Public Function GetFirst() as Employee
   if colQualifiedList.count>0 then
    mnCurrentIndex=1
     set GetFirst=colQualifiedList.Item(1)
   else
     set GetFirst=nothing
   end if
  End Function
  Public Function GetNext() as Employee
   mnCurrentIndex=mnCurrentIndex+1
   if mnCurrentIndex>colQualifiedList.count then
     set GetNext=nothing
   else
     set GetNext=colQualifiedList.Item(mnCurrentIndex)
   End if
  End Function
也许你会说,为何不把集合声明Public,这样在ASP中不是可以直接引用吗?确实,这样也行得通,编程实现起来也更简单些,但是,这样做破坏了封装性原则。因为数据以何格式存储完全是商业逻辑层的事,与用户界面层无关,假设有一天你因为每种原因放弃了用集合来存储数据的设计,而改用数组或记录集(Recordset)来存储,那你只需要修改GetFirst和GetNext两个函数,用户界面层完全无需修改。
至此类文件创建完毕,将工程文件存为 test.vbp,选File菜单下的Make test.dll选项将其编译。

3、注册动态链接库

启动Web
Server 上的Microsoft Transaction Server (Start--Windows NT
Optionpack4--Internet Information Server--Internet Service
Manager),展开Microsoft Transaction Server--Computer--My Computer--Package
Installed,点鼠标右键选New--Package--Create Empty
Package,输入包名Test(这里Test是任选的名字,不一定要与DLL同名),OK-Interactive User-the
current Logon
user--Finish。双击Test--Component,右键选Component-New-Component-Install New
component(s)-- Add
File,选择你刚编译好的DLL文件,MTS会发现DLL中有两个类Employee和Employees。至此DLL注册完毕。

4、编写ASP程序
  <HTML><Body>
  <p>Qualified Employee List</p>
  <table border=1 cellspacing=0 cellpadding=0>
  <tr>
   <td>Employee ID</td>
   <td>Name</td>
   <td>Gender</td>
   <td>Score</td>
  </tr>
  <%
   set oEmployees=server.createobject("Test.Employees")
   oEmployees.GetQualifiedList
   set oEmployee=oEmployees.GetFirst()
   do while not oEmployee is nothing
  %>
  <tr>
   <td><%=oEmployee.EMPLID%></td>
   <td><%=oEmployee.Name%></td>
   <td><%=oEmployee.Gender%></td>
   <td><%=oEmployee.Score%></td>
  </tr>
  <%
     set oEmployee=oEmployees.GetNext()
   loop
  %>
  </table>
  </body></html>
注意在ASP中创建类实例的语法set

oEmployees=server.createobject("Test.Employees"),其中Test是DLL的名字,Employees是类的名字;
当然,如果一个函数的返回值是一个对象,类似set oEmployee=oEmployees.GetFirst()这样的语法也是可以的。

至此,一个完整的三层结构的应用程序已经完成了,让我们看以下,如果把"合格"的定义改为:只有成绩进入前100名才算合格,程序需要做那些修改。事实上,如果你的数据库系统是SQL Server,你只需把SQL语句改为:

sql="select top 100 EMPLID from Employee order by Score desc" 就已经可以了,即使为了跨数据库系统的兼容性,我们也只需要对GetQualifiedList做如下修改:
  sql="select EMPLID from Employee order by Score desc"
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     i=1
     do while (not .eof) and (i<=100)
       dim oEmployee as new Employee
       oEmployee.Create trim(.Fields("EMPLID"))
       colQualifiedList.Add oEmployee
       set oEmployee=nothing
       i=i+1
     loop
   end if
   .close
  end with
  ...
然后把DLL重新编译,注册就可以了,ASP程序完全不必修改。
佚名
2024-05-30 23:49:45
最佳回答
类似问题(10)
  • 佚名
    2024-05-30 14:31:51

    检测实验室 检测机构如何申请成为强制性的认证机构?

    检测机构要申请成为强制性认证机构必须要满足以下几点要求:   一、 该项目可随时申请吗?  该项目实施审批前,国家认监委通过书面公告和其网站对外发布指定计划等相...

  • 佚名
    2024-05-30 05:29:02

    mybatis是如何实现事物处理的?

    SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻...

  • 佚名
    2024-05-30 12:57:38

    如何实现装卸搬运合理化?

    我据的这个很适合你 由于装卸搬运作业仅是衔接运输、保管、包装、配送、流通加工等各物流环节的活动,本身不创造价值,所以应尽量节约时间和费用,在装卸搬运作业合理化方...

  • 佚名
    2024-05-30 00:01:00

    C语言多线程如何实现?

    线程之间没有共享数据,不需要线程同步你在主函数里面,把线程销毁的太快了,线程都没来得及执行完你就退出了,在创建完线程之后,加个sleep等待几秒再销毁线程。同时...

  • 佚名
    2024-05-30 08:00:00

    如何实现2个不同的楼层一条宽带,2个路由器共享。

    方法一1,用一根网线从第一个路由器引导第二个路由器的LAN上的任意一个端口就行,切记不可以插到WAN口。2,一般大家采用的也比较多,基本没什么技术含量。只要第一...

  • 佚名
    2024-05-30 08:00:00

    用UG手动分模后,如何加入模架和标准件,出现“无法设置模具装配顶层部件”,改如何解决?

    我自动分模也出现过这个对话框,执行 <项目初始化> 之后就解决了。

  • 佚名
    2024-05-30 08:00:00

    如何用三档开关实现正负极转换?

    可以用交叉连接实现,以直流电机正反转为例(当然也可以是其它直流负载),如图所示:

  • 佚名
    2024-05-30 08:00:00

    如何通过企业私有云架构设计

    问题太广,要分析应用场景;但建议如果没有IT能力的公司,可以购买一些大公司的产品,比如IBM、Microsoft等

  • 佚名
    2024-05-30 08:00:00

    企业业务的现有架构是否适合云计算架构

    为应用选择合适的架构与技术对于应用而言,笔者认为可以根据数据的使用方式分为三种:以计算为中心的应用、以数据为中心的应用和需要兼顾数据与计算的应用。 针对上面所提...

  • 佚名
    2024-05-30 08:00:00

    Handler是如何实现线程间通信的

    就实现了线程间的通信 ITC与进行间通讯 IPC有十分类似的思想。通常的做法都是在主线程创建一个 Handler然后在新建线程中使用此 Handler与主线程通...