加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

怎样成立三层系统布局的ASP应用措施(1)

发布时间:2020-12-24 21:59:45 所属栏目:编程 来源:网络整理
导读:跟着互连网应用的深入和成长,三层系统布局的应用模式也获得更多人的青睐。本文先容了三层布局应用措施的观念和利益,并团结一个实例先容了怎样成立三层布局的ASP应用措施。 一、两层布局的ASP应用有何弱点 在Browser/Server 应用措施开拓规模,微软公司的II

跟着互连网应用的深入和成长,三层系统布局的应用模式也获得更多人的青睐。本文先容了三层布局应用措施的观念和利益,并团结一个实例先容了怎样成立三层布局的ASP应用措施。

一、两层布局的ASP应用有何弱点
在Browser/Server 应用措施开拓规模,微软公司的IIS/ASP以其强盛的成果,精采的扩展手段,及与其余微软产物的同等性,敏捷地风行起来。它能使一个具有VB/VC履历的措施员,很快地成为一个Web措施员,开拓出看上去很是专业的应用。可是,ASP有一个生成的弱点,就是ASP代码和HTML代码是混在一路的,ASP措施员既必要思量与数据库打交道,必要体谅怎样与HTML共同,偶然还必要用ASP直接天生HTML代码。其功效是,当措施逻辑足够伟大时,.asp源文件很是长;并且,无论客户提出用户界面的改变,照旧贸易逻辑的改变(好比,在测验体系中,"及格"的尺度也许从到达60分就算及格,改为进入前100名才算及格),都必要对.asp文件举办窜改,而贸易逻辑的改变,很也许必要窜改许多文件。

二、三层布局的观念
在传统的Client / Server应用中,也存在着上述同样的题目,多层布局的应用正是在对C/S 布局的总结基本上发生的,而且也已经扩展到了B/S应用开拓规模。 即将应用分别为三层(可以有更多层,但三层最常见): 用户界面层,贸易逻辑层,数据库层。 用户界面层认真处理赏罚用户的输入和向用户的输出,但并不认真表明其寄义(出于服从的思量,它也许在向上传输用户输入前举办正当性验证),这一层凡是用前端器材(VB,VC,ASP等)开拓;贸易逻辑层是上下两层的纽带,它成立现实的数据库毗连,按照用户的哀求天生SQL语句检索或更新数据库,并把功效返回给客户端,这一层凡是以动态链接库的情势存在并注册随处事器的注册簿(Registry)中,它与客户端通信的接口切合某一特定的组件尺度(如COM,CORBA),可以用任何支持这种尺度的器材开拓;数据库层认真现实的数据存储和检索。 有了这样的布局,上面的题目迎刃而解:照旧以测验体系中的及格尺度为例,在客户端全部必要表现及格职员名单的处所,挪用这样一个函数GetQualifiedList,至于这个函数怎样编写,怎样与数据库打交道,以至会见的是何种数据库都与其无关(你必然有过这样的经验,在一种数据库体系上运行得很好的SQL语句,偶然换到另一种数据库体系上必需加以修改); 在中间层DLL中实现这个GetQualifiedList函数,假如用户对"及格"的界说变了,只必要修改这个函数就可以了,只要此函数的进口参数和返回内容稳固,在客户端不需作任何窜改。在这里,我们看到了面向工具编程的特征之一封装性的利益,而这一点在开拓大型应用时尤其有效--我们可以把开拓职员分成两组,一组认真开拓界面层,另一组认真开拓贸易逻辑层,两边只要凭证事先商定的函数接口,并行地开拓就可以,而不必向以前那样,后头的事变必需等前面的事变完成后才气开始。虽然,这样的开拓模式必要很好的项目协协调文档作支持。

你大概会问,假如我把这些函数些在一个单独的文件中,再在必要挪用的处所把它包括进来,不是同样能到达目标吗? 第一,这种要领服从不高,无论你把这些函数分手到几多个文件中,当你必要挪用个中一个时,总会包括进一些现实上并不必要的函数,这无疑加重了处事器的承担,对处事器机能要求较高的Web应用尤其云云。 而DLL只在必要时才调入内存且只调入必要的函数,而且多个应用措施实例可以共享统一个DLL实例;第二,假想一个员工,有20个属性(工号,姓名,年数,性别......),此刻给定某工号,要求返回此员工全部信息。此时假如纯真用函数,只能界说20个全局变量,在函数中改变这些变量值,可能界说一个有20个传参(by reference)参数的函数。显然,第一种要领很贫困而一旦增进一个属性后一种要领就必要变动函数接口。而在一个工具里,既包括成员要领(即函数和进程),也包罗成员属性。假如我们回收工具的要领,则在函数中只必要改变工具的属性,在函数外可以直接引用改变了的工具属性值。 这种要领有些相同第一种要领,但1.属性值无需在函数外一一声名;2.这些属性值只属于工具,与工具无关的代码不会有时地改变属性值;3.一旦工具被开释,这些值会被一路开释。

三、怎样开拓三层布局的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,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()这样的语法也是可以的。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读