与ASP进行接口

 在前一章中,我们学习了用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+与其环境交互。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP API 接口接收与返回 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。 该版本直接解压后就可以使用,其中 属于公共文件。不论是客户端还是服务器端都需要这些文件。 是客户端文件,如果你只需要使用客户端,那么只要有上面那些公共文件和这个文件就可以使用了,使用时,直接在你的程序中包含 phprpc_client.php 就可以,公共文件不需要单独包含。 这三个文件是服务器端需要的文件。 其中 dhparams 目录中包含的是加密传输时用来生成密钥的参数 dhparams.php 是用来读取 dhparams 目录中文件的类。 phprpc_server.php 是服务器端,如果你要使用 PHP 来发布 PHPRPC 服务,只需要包含这个文件就可以了。公共文件和 dhparams.php 都不需要单独包含。 PHP 4.3+、PHP 5、PHP 6 客户端要求开启 socket 扩展。 服务器端需要有 IIS、Apache、lighttpd 等可以运行 PHP 程序的 Web 服务器。 如果服务器端需要加密传输的能力,必须要保证 session 配置正确。 <?php include('php/phprpc_server.php'); //加载文件 function hello($name) { return'Hello ' . $name; } $server = new PHPRPC_Server(); //创建服务端 $server->add(array('hello', 'md5', 'sha1')); //数组形式一次注册多个函数 $server->add('trim'); //单一注册 $server->start(); //开启服务 ?> <?php include ("php/phprpc_client.php"); //加载文件 $client = new PHPRPC_Client('http://127.0.0.1/server.php'); //创建客户端 并连接服务端文件 echo$client->Hello("word"); //调用方法 返回 hello word ?> -------------------------------------------------- --------------------------------------------------- ------------------------------ 服务端其他说明: <?php include('php/phprpc_server.php'); //加载文件 function hello($name) { return'Hello ' . $name; } class Example1 { staticfunction foo() { return'foo'; } function bar() { return'bar'; } } $server = new PHPRPC_Server(); //创建服务端 $server->add('foo', 'Example1'); //静态方法直接调用 $server->add('bar', new Example1()); //非静态方法 需要实例化 //注册别名调用 $server->add('hello', NULL, 'hi'); //第三参数是函数的别名 客户端通过别名来调用函数 $server->add('foo', 'Example1', 'ex1_foo'); $server->add('bar', new Example1(), 'ex1_bar'); $server->setCharset('UTF-8'); //设置编码 $server->setDebugMode(true); //打印错误 $server->setEnableGZIP(true); //启动压缩输出虽然可以让传输的数据量减少,但是它会占用更多的内存和 CPU,因此它默认是关闭的。 $server->start(); //开启服务 ?> -------------------------------------------------- --------------------------------------------------- ---------------------------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值