设为首页
加入收藏
关于我们
帝国产品
合作伙伴计划
网站信息查询
域名交易
下载中心
ECMS教程
技术论坛
模板中心
帝国网站管理系统
帝国下载系统
帝国论坛
帝国备份王
帝国合作伙伴计划
帝国CMS交流区
其它产品
技术交流区
休闲娱乐
站务管理
购买方式
联系我们
部分案例
加入帝国
网站地图
标题
简介
内容
作者
搜索全部
栏 目:
搜索全部
新闻中心
技术文档
下载中心
FLASH酷秀
[
技术文档
] [
下载中心
] [
域名交易
]
您的位置:
首页
>
技术文档
>
ASP编程
>
与ASP进行接口
作者:佚名 发布时间:2005-04-02 来源:不详
在前一章中,我们学习了用C++创建COM组件的基本方法,用这些概念创建的组件对于在内存中处理数据是非常有用的。但是,要制作一个功能强大的服务器组件,需要使用微软平台提供的其他服务。特别是,创建的组件应能提供对数据的访问、与COM+进行接口以及与ASP交互的功能。本章主要内容有以下几个方面:
? 使用ASP内置接口。
? 与COM+进行接口。
? 通过C++使用ADO。
? 使用OLE DB消费者模板。
18.1 与ASP进行接口
前一章创建的组件没有考虑到在ASP中的使用,如果想创建在任何环境中使用的一般组件这是有效的。然而,如果ASP页能访问信息,组件也能访问的话,这个组件在Web应用程序中将会十分有用。如果能够完成像ASP页一样的基于Web的交互功能,则这个组件将更有用。
COM的世界十分精彩,可用C++组件做任何事情。就像在ASP中可以有各种各样可用的对象一样,可从服务器对象访问这些组件。在ASP中所做的工作大部分可通过下列内置对象实现:Request、Response、Session、Application和Server。指向任一对象的指针可通过ScriptingContext获得。因此,关键是得到指向ScriptingContext的指针,然后寻找相应的内置对象。
与多数编程工作不同,程序的代码是由Visual C++ AppWizard产生的。我们要使第1 7章中创建的组件“启用ASP”,这时将有两个选择:一种是在本章中创建组件,拷贝并粘贴合适的代码到前面的组件中;另一种从一个新的组件开始,并加入在前一章中编写的代码。我们选择后者。
使用不同的向导选项创建组件的框架,然后通过Windiff观察附加代码的生成,这将有助于理解。Windiff是Visual C++附带的程序。
使用在上一章创建ASPCOMponents Visual C++项目,插入一个新的ATL对象。创建一个ActiveX Server 组件而不是创建Simple Object,命名为C TableStorage 2,如图1 8 - 1所示。
Simple Object向导与ActiveX Server向导的不同在于后者包含ASP属性页。在ASP属性页中,仅选择Response复选框。在我们的例子中,仅使用Response对象,但是如果需要再添加其他内置对象也非常容易,如图1 8 - 2所示。
这表现了Visual C++的灵活性和高效性,仅选择所需要的特性,可减少组件的代码。当然,与在ASP中不同,特性不仅仅是编程环境的一部分,增加特性就要增加代码。
不选择OnStartPage/OnEndPage时,所有内置对象均无效。必须调用OnStartPage才能得到内置对象。如果选择内置对象,将会自动产生OnStartPage和OnEndPage。这种相关性必须引起开发人员的注意。
我们来看一下选用ActiveX Server组件后产生的代码,如果已有一个启用ASP的组件,必须人工插入这段代码。
首先,文件TableStorage2.h中有一个新的头文件,它包含使用ScriptingContext和ASP内置对象所需的常数和定义。
#include <asptlb.h> //Active Server Pages Definitions
注意,这里使用ScriptingContext而不是使用较新的ObjectContext,ATL向导产生使用ScriptingContext的代码,一般情况下不必进行修改。
你将看到增加了OnStartPage和OnEndPage方法。有了这两个方法,就可以在ASP页面创建这个组件时,或在ASP页面用过它之后做一些工作。这些方法将在以后讨论。
在类里面增加了一些成员变量。其中一个是Response对象的指针。如果选择其他的ASP内置对象,也要为它们声明指针。指向对象的指针声明后,这个指针实际上还没有指向这个对象。
另一个成员变量是一个布尔变量,表示调用OnStartPage是否成功,后面你将看到其重要性。在构造器中这个变量被初始化为FALSE(在对象首次被创建时,会调用构造器)。在C++中构造器和析构器起的作用分别与VB中的Class_Initialize和Class_Terminate方法相同。
这是头文件的全部变化。我们再来看一下AppWizard为TableStorage2.cpp生成的代码。这个代码实现了OnStartPage和OnEndPage 方法。如果转换上一章中的组件,在ASPCOMponents.cpp中必须有一行是#include TableStorage2.h。
OnStartPage的主要任务是得到ScriptingContext和指向ASP内置对象的指针。在这个例子中只有得到Response对象的代码。再强调一次,如果选择了其他的ASP内置对象,就得到指向它们的指针。一旦成功获取了指向ASP内置对象的指针, m_bOnStartPageCalled将置为TRUE。可用这个变量对使用ASP内置对象是否安全进行检查:
ASP页处理完后,调用OnEndPage方法,这时ASP内置对象的指针没有意义,因此释放接口,并且m_bOnStartPageCalled置为FALSE:
如果在ASP页中对象有效期的开头和结尾处要进行一些处理的话,可在OnStartPage和OnEndPage内编写程序。
简单的组件与ActiveX Server组件不同。OnStartPage和OnEndPage方法通过ActiveX自动化提供,所以在组件的外部可以调用。要这样做必须在接口定义语言(IDL)文件中对此进行说明。在ASPCOMponents.idl中有这两条语句:
编译组件时,MIDL编译器使用IDL文件创建一个类型库和调度代码。
现在已经可以在组件中使用Response对象了。先添加一个方法来使用它。在前一章中我们编写了一个ASP程序,它用存储在组件中的数据生成HTML。如果由组件本身产生HTML表,组件会更强大。这一修改使得性能更为优越,并封装了绘制逻辑。
封装具有许多好处。对于生成表,所有绘制代码集中到一个地方,任何ASP页可调用包含这段代码的组件,并可以运行它。很显然这比在页和页之间拷贝同样的代码或编写新的代码简单。开发人员可主要关心将像数据存取这样的高层次问题,而不是去寻找遍历数据并在表中显示的方式。调用一个组件和运行预编译代码比分析一系列复杂的HTML命令快得多。
最后需要说明的是即使绘制编码需要有微小的修改,组件也要重新编译。开发组件时应仔细考虑程序员在生成表时需要设置的参数。用户可修改的特征,如边界尺寸、表格单元的背景色,可作为参数传给接口方法,而不必进行硬编码。但是如果组件接口改变,使用这个
接口的ASP页必须进行修改。
还有一点需要说明, 必须在I TableStorage 2中增加与I TableStorage相同的方法, 例如ParseCSV、GetField 和GetColumnName等。详细内容可参阅第1 7章。
在I TableStorage 2中增加一个新方法OutputTable,按照图1 8 - 3所示的对话框进行配置。
虽然增加其他表格属性如颜色、单元宽度等也很简单,但为了说明方便,仅允许改变边界尺寸。OutputTable的代码如下:
首先确认m_b OnStartPageCalled为TRUE并且,m_pi Response确实包含一个指针。如果检查通过,就可以使用Response对象。
Write方法希望字符串为variant,在C++中使用variant必须指定一种variant类型。最简单的方法是将字符串作为字符类型,并用C COM Variant类构造一个variant。下一步输出表列:
列的名称作为键存储在列映射中,因此,可以遍历列映射得到列的名称,并显示在表格的表头中。像前面一样,将字符串转换为variant,与Response对象一起送到浏览器中,一旦列输出完成,接下来处理行:
每一行是vector数据结构中的一个元素,因此可遍历m_row。列的数据与列的标题对应。上一章讲过行数据使用映射可使存储空间最小。因此,可遍历列名称以判定特定行是否有值,如果其值存在,则输出,否则,输出一个空的表格单元。
最后关闭HTML标记并递增遍历器:
这与上一章中的ASP代码非常相似,区别只是没有遍历字段以显示数据,仅须调用OutputTable。这段代码比较简洁并可得到相似的结果,如图1 8 - 4所示。
此表仅是相似,列的顺序不同。这是因为C++程序与ASP代码用不同的方式进行列遍历,C++中列按字母顺序存储在map数据结构中。另一方面, ASP代码以列存储的顺序进行遍历,其存储的顺序是“Name、Group、Instrument”,是由上一章的例子生成的输出。可以扩展OutputTable方法,使用户可指定列的顺序,而不需要改变代码。
综上所述,如果可以与其环境交互, C++服务器组件会更有用。在这种情况下, C++组件可通过COM得到各种ASP内置对象的指针。这样可以让组件利用ASP 的固有功能。我们仅分析了一个ASP内置对象,其余的都以同样的方式工作。下面介绍C++服务器组件如何通过COM+与其环境交互。
【
评论
】【
加入收藏夹
】【
大
中
小
】【
打印
】【
关闭
】
※ 相关链接
·
在ASP与ASP.NET之间共享对话状态
(2005-04-02)
·
动态网页制作技术JSP与ASP的比较
(2005-03-12)
·
ASP+与ASP有哪些区别(转)
(2005-03-12)
·
asp+与asp的区别(1)
(2005-03-12)
·
asp+与asp的区别(2)
(2005-03-12)
·
asp+与asp的区别(3)
(2005-03-12)
·
asp+与asp的区别(4)
(2005-03-12)
·
asp+与asp的区别(5)
(2005-03-12)
·
asp+与asp的区别(6)
(2005-03-12)
·
关于ACCESS 2K与ASP的几点想法
(2005-03-12)
栏目导行
PHP编程
ASP编程
ASP.NET编程
JAVA编程
站点最新
·
致合作伙伴的欢迎信
·
媒体报道
·
帝国软件合作伙伴计划协议
·
放眼未来 帝国近期将有重大举措!
·
PHPWind6.3.2版通行证发布
·
帝国备份王2008版正式发布
·
帝国备份王2008版发布
·
phpcms2007转帝国CMS5.0程序发布
·
dedecms5.1转帝国CMS5.0程序发布
·
帝国网站管理系统V5.0商业购买说明
类别最新
·
在ASP中使用数据库
·
使用ASP脚本技术
·
通过启动脚本来感受ASP的力量
·
学习使用ASP对象和组件
·
解析asp的脚本语言
·
初看ASP-针对初学者
·
ASP开发10条经验总结
·
ASP之对象总结
·
ASP与数据库应用(给初学者)
·
关于学习ASP和编程的28个观点
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板