构建具有三层结构的asp应用
asp应用程序的一、二层结构有哪些缺点
在浏览器/服务器的应用程序开发领域,微软公司的IIS和ASP已经流行迅速,由于其强大的功能,与其他微软产品良好的扩展性和一致性。它使程序员用VB或VC的经验,很快成为一个程序员,开发一个应用程序,看起来很专业。不过,ASP具有固有的缺陷,即ASP代码和HTML代码。ASP程序员需要考虑处理数据库,以及如何与HTML合作。有时,ASP代码来生成HTML代码直接。因此,当程序逻辑是足够复杂,ASP源文件很长;而且,无论客户提出的用户界面的变化,或业务逻辑的变化(例如,在考试系统中,合格标准从5月达到60分就算合格,进入100强的资格)。需要更改asp文件,而业务逻辑发生变化,可能需要更改很多文档。
两层或三层结构的概念
在传统的客户机/服务器应用程序中,也存在上述问题。多层结构的应用是基于C/S结构的总结,也被扩展到B/S应用开发领域的应用分为三层(可以有更多层,但三层最常见):用户界面层、业务逻辑层、数据库层,用户界面层负责处理用户的输入和输出给用户,但不负责其意义的解释(为了效率,而这可能将用户输入之前有效),这一层通常用前端工具(VB,VC,ASP等)开发;业务逻辑层是上下两层链接,建立实际的数据库连接对,根据用户的搜索请求生成的SQL语句或更新数据库,并把结果返回给客户端,这一层通常以动态链接库的形式和注册服务器登记(注册),及其通信接口与客户特定组件的标准(如COM、CORBA),你可以使用该工具支持任何标准的开发;数据库层负责实际的数据存储和检索。在这种结构下,上述问题是:标准顺利完成或容易解决的问题,通过系统的检查为例,显示合格人员名单中的所有客户的需求,把这样一个作为getqualifiedlist功能,如何写,如何去铝与数据库,并获得什么样的数据库无关(你一定有过这样的经历,在数据库系统运行良好,有时换到另一种数据库系统的SQL语句必须修改);在DLL的中间层的getqualifiedlist功能的实现,如果合格定义变化的用户,只需要修改函数将该函数的参数,只要入口和返回的内容不变,客户端不需要任何改变。在这里,我们看到封装优势的面向对象编程,但这一点在大规模应用的发展特别是有用的时候,我们可以把人员分为两组,一组我们负责界面层的开发,另一组是负责业务逻辑层的开发,只要双方同意按照功能接口,并行发展的就可以了,不用之前,后面的工作必须在完成的工作前的等待开始。当然,这样的发展模式需要良好的项目协调和文件支持。
你可能会问,如果我把其中的一些功能在一个文件中,然后调用的地方把它,不能达到同样的目的:第一,效率不高,无论你把这些功能分散到多个文件,当你需要调用时将包含在一些实际上并不需要函数,这无疑加重了服务器的负担,尤其是对Web应用服务器的性能要求较高,而DLL只在需要的时候进记忆,只需要的功能,以及多个应用程序实例可以共享同一个DLL的实例;第二,想象一个员工,有20个属性(工号,姓名年龄,性别,现在,......)获得了一份工作,还要求所有员工的信息。在这一点NT,如果我们简单的使用功能,我们只能定义20个全局变量,在函数改变这些变量,或定义一个函数20参数的参考。显然,第一种方法是很麻烦的,一旦添加一个属性,一个方法需要改变函数接口。在一个对象,它既包括成员方法(即过程和函数),以及成员的属性。如果我们使用对象的方法,我们只需要改变函数中的对象的属性,以及更改对象的属性值可以直接引用外部的功能。这种方法有点类似于第一种方法,但1。属性值不需要在函数之外逐一解释。2、这些属性值只属于对象,而与对象无关的代码不会无意中更改属性值。3、一旦对象被释放,这些值将一起释放。
三。如何开发一个三层结构的asp应用程序
ASP具有良好的可扩展性,我们访问数据库,使用ADO对象访问文件,使用文件系统对象(FSO),事实上,这个项目一直是三层结构的应用,但由于它是使用内置的对象来实现的。这些物体都遵循COM / ActiveX接口,所以我们发展自己的对象也遵循这个接口。接下来,我们采取的合格标准以上为例演示了如何创建自己的三层结构的ASP应用程序。
1、在数据库系统中,建立以下数据库表:
员工:emplid char(5)不为空,
名称char(10)不为null,
性别char(1)不是null,
积分不为空
这张桌子储存雇员信息和考试结果。简单起见,它只包含三个部分:姓名和性别,只有一个考试。emplid是首要关键。
2、建立动态链接库
启动VB(这里是VB的,例如,你可以使用任何开发工具开发的ActiveX接口支持你),并与ActiveX类型库创建一个新的项目。一个新的类,在建的项目,叫员工。您可以添加的属性和方法的类类生成器的可视化,你可以编辑直接用手。首先,添加emplid属性如下:
私人msemplid作为字符串
物业让emplid(semplid字符串)
msemplid = semplid
最后的财产
属性获取emplid()为字符串
emplid = msemplid
最后的财产
一般来说,每个属性都应该有两种方式:属性让和属性获取。他们被称为当属性值分配给属性值分别从阅读。如果一个属性是只分配而不读,这在相应的数据库表的主键属性大多发生,财产的获取方法可以省略。物业让方法不能省略。你可以复制的名字三性能,采用上述方案的性别和得分。然后创建下面的方法:
(emplid创建公共子字符串)
昏暗的Conn新连接
昏暗的RS作为新的记录
将SQL作为字符串
假设你创建控制面板中的DSN,ConnectionString
也可以无DSN字符串
conn.connectionstring =DSN = dsnname;UID =用户名;密码=密码
conn.open
选择*从员工那里emplid = emplid SQL =
RS
打开SQL,Conn,1。
if和Bof
退出子
其他的
msemplid =装饰(。领域(emplid ))
msname =装饰(。领域(名称))
msgender =装饰(。领域(性别))
msscore =。领域(得分)
最后如果
关闭
结束
设置=无
conn.close
设置conn =没有
端子
在这里,我们创建Employee对象根据emplid。我们注意到数据库中的值被分配给三个私有变量,而不是直接赋给属性。如果你调试一步一步,你会发现,msemplid赋值调用属性让emplid,即分配的价值属性。
接下来,我们创建一个类雇员,并添加以下方法:
私人colqualifiedlist作为新的集合
私人mncurrentindex为整数
市民Sub GetQualifiedList()
昏暗的Conn新连接
昏暗的RS作为新的记录
将SQL作为字符串
假设你创建控制面板中的DSN,ConnectionString
也可以无DSN字符串
conn.connectionstring =DSN = dsnname;UID =用户名;密码=密码
conn.open
SQL =选择emplid从员工那里得分> = 60阶按评分排序
RS
打开SQL,Conn,1。
if和Bof
退出子
其他的
做而不做。
昏暗的员工作为新员工
员工,创造装饰(。领域(emplid ))
colqualifiedlist增加员工。
设置员工=没有
环
最后如果
关闭
结束
设置=无
conn.close
设置conn =没有
端子
第一,注重员工的模糊语法VB中创建一个类实例的新员工,你会看到,在ASP创建类的实例的语法是不同的。此方法检索雇员数大于60,并在此基础上创建Employee对象,然后添加对象到一个私人集合对象。以下两个功能通过集合中的元素:
公共函数GetFirst()员工
如果colqualifiedlist计数>0。
mncurrentindex = 1
集colqualifiedlist.item getFirst =(1)
其他的
设置获取第一=没有
最后如果
端功能
公共函数GetNext()员工
mncurrentindex = mncurrentindex + 1
如果mncurrentindex > colqualifiedlist.count然后
集GETNEXT =没有
其他的
集GETNEXT = colqualifiedlist.item(mncurrentindex)
最后如果
端功能
也许你会说,你为什么不把这些藏品公开,所以这不是ASP的直接参考事实上,它的工作原理,编程容易实现,但它破坏了封装原则。因为在业务逻辑层是什么格式的数据,没有用户界面层,如果有一天你因为各种原因放弃了将设计数据的存储,和数组或集合使用记录(记录集)来存储,那么你只需要修改的getFirst和GetNext两功能,用户无需修改接口层。
在这类文件的结束,项目文件存储为test.vbp,和使test.dll选择文件菜单下的编译。
三.注册动态链接库
开始对微软事务服务器的Web服务器(开始——Windows NT optionpack4 --互联网信息服务器,Internet服务管理器事务服务器--计算机--我的电脑--包),微软安装,右键单击新包装--创建空包装测试,输入包名(其中试验是一个可选的名字,不是DLL,一名好的交互式用户的当前登录的用户--完成)。双击测试组件,右键单击组件的新组件安装新组件(S)-添加文件,选择DLL文件你编译,MTS会发现DLL有两类员工和DLL。此时,DLL已经注册。
4。写ASP程序
U3000 U3000
U3000 U3000
合格的员工名单
U3000 U3000
U3000 U3000
员工身份
名称
性别
分数
U3000 U3000
建立职工= server.createobject(测试。员工)
oemployees.getqualifiedlist
设置员工= oemployees.getfirst()
而不是员工是什么
%>
U3000 U3000
U3000 U3000
U3000 U3000
U3000 U3000
U3000 U3000
U3000 U3000
设置员工= oemployees.getnext()
环
%>
U3000 U3000
U3000 U3000
注意在ASP职工= server.createobject语法创建一个类的实例(测试。雇员),在测试的DLL的名称,员工是类的名称;当然,如果一个函数的返回值是一个对象,类似于集(员工=职工。先富起来)这个语法也可以。
此时,一个完整的三层结构应用程序已经完成。让我们看看下面。如果我们定义合格的定义如下:只有当得分达到前100名是合格的,程序才需要进行修改。事实上,如果你的数据库系统是SQL Server,你只需要把SQL语句改为:
SQL =选择前100 emplid员工按评分排序已经能够,甚至为了跨数据库系统的兼容性,我们只需要做以下修改getqualifiedlist。
…
SQL =选择emplid员工按评分排序
RS
打开SQL,Conn,1, 3。
if和Bof
退出子
其他的
我= 1
做(不,EOF)和(我昏暗的员工作为新员工
员工,创造装饰(。领域(emplid ))
colqualifiedlist增加员工。
设置员工=没有
i = i + 1
环
最后如果
关闭
结束
…
然后重新编译的DLL,并登记好,和ASP程序并没有被彻底修改。
四。注意事项及注意事项
1,因为这个例子比较简单,没有建立在员工类的方法,但在员工,所有员工的信息(工号,名字,性别,成绩)读出来,分配给员工对象相应的属性,但在实际应用中,当员工对象增加属性,或表的数量增加,表之间的关系变得更加复杂。本文提出的方法更有效,代码重用机会更大。
2、当DLL被修改时,它只能在MTS中被删除和重新注册,因为在每次编译之后,对象的ID值将在注册表中重新生成。
三.从参数的方法和函数调用,所有的变量必须在介绍转换对应类型的函数调用,否则会造成类型不匹配的错误,因为只有在VBscript变量类型,它不能自动转换为其他类型。例如,有一个函数的定义如下:
公共函数关系(P1为字符串,P2为整数)整数
端功能
在asp程序中,它应该被调用如下:
P1 = obj.property1属性是一个字符串属性
P2 = obj.property2财产是一个整数属性
a obj.fun1(CSTR(P1),Cint(P2))
a obj.fun1(AAA
%>
以下两种文字是错误的:
P1 = obj.property1属性是一个字符串属性
P2 = obj.property2财产是一个整数属性
a obj.fun1(P1,P2)不正确,P1和P2是不同的变量
CSTR(P1)
P2 = Cint(P2)
a obj.fun1(P1,P2)仍然不正确
%>
这里的第二个方法仍然是错误的,甚至是经过类型转换,P1和P2还在变化的变量。在VBscript,数据类型和类型转换函数表达式中的运算只扮演一个角色,和变量只有一种类型的变异。
结语
这是一个多层结构的理论和实践的探讨,希望能帮助你发展。这里还有一个问题是如何的类和类的成员应设计。它不仅涉及到面向对象编程的理论,也需要实践经验。请参阅有关面向对象的理论书籍和继续综上所述,在实践中,我相信你将能够设计自己的完美的多层结构的应用。