使用IntraWeb进行Web编程
《Delphi从入门到精通》第21章 第一部分
概述
自Delphi2以后,Chad Z. Hower就一直在为建立一种简化Web程序开发的Delphi架构而努力,这种简化的核心思想就是使开发Web程序像开发普通窗口程序一样简单并且可视化。一些程序员了解动态HTML、javaScript、 Cascading Style Sheets和最新的互联网技术;而另一些程序员则想像创建VCL和CLX应用程序那样创建Web程序。
IntraWeb就是应第二种开发者的需求而问世的,她功能强大,即便是专业的Web程序员也能够从中受益。用Chad的话来说,IntraWeb是用来开发Web程序而不是用来创建网站的。此外,IntraWeb组件可用于特有的应用程序或者是WebBroker 和 WebSnap应用程序。
在本章我不能详述IntraWeb的每一个细节,安装后,在Delphi上分布于数个组件板共计50个组件之多,实在太大了。我计划讲解一下基础内容,您可以有选择地用于您手头的项目或是那些项目中的部分内容。
提示:在Delphi7光盘中有IntraWeb的PDF版手册。如果您找不到,可以到Atozed Software公司的网站上去下载。关于IntraWeb的技术支持,可以参考Borland的新闻组。
IntraWeb简介
IntraWeb是Atozed Software公司出品的组件库。在Delphi7的专业版和企业版中有相应版本的IntraWeb。专业版的IntraWeb只能用于页模式(Page mode),关于页模式本章稍后将会提到。尽管Delphi7是Borland公司的第一版包含该组件集的集成开发环境,但IntraWeb已经发展有几年了,受到了相当好的评价和支持,包括很多第三方组件开发商。
提示:
尽管您不能得到核心源代码(需购买),IntraWeb体系架构是完全开放的。并且所有组件的源代码随意可得。虽然IntraWeb是Delphi标准安装的一部分,但同样适用于Kylix。只要小心编写,IntraWeb程序完全可以实现跨平台。
注:除了Delphi 和Kylix版外,IntraWeb还有C++ Builder和Java版。.Net版正在开发中,将会随Delphi for .Net(Delphi 8)一起发布。
如果您拥有正版Delphi7,你完全能够收到一个重大的升级信息,并且可以升级到IntraWeb5.1企业版,包括升级文档和技术支持。(目前版本为7.19——译者)
从网站到Web程序
正如前面所讲,IntraWeb背后的思想是构建Web程序而不是网站。当您使用WebBroker和WebSnap时,你以Web pages和Page PRoducers术语在思考,同时您的工作紧紧地和HTML层次的网页制作联系在一起。而用IntraWeb时,您想的是组件、属性和事件,就像是在Delphi中作可视开发一样。
比如,创建一个新的IntraWeb应用程序,选择File ® New ® Other,在新项目对话框中移到IntraWeb页,然后选择Stand Alone application。在接下来的对话框中(此对话框是Delphi的而不是IntraWeb的向导)你可以选择一个已经存在的文件夹或是输入一个新文件夹(系统会自动创建,之所以在此提及,是因为该对话框不是很清楚)。最终的程序包含一个项目文件和两个不同的单元(稍后我会讲到它的结构)。
现在,让我们创建一个例程(随书源代码中叫做IWSimpleApp),步骤如下:
1、 移到程序的主窗体,从组件板中的IW Standard页中选择一个按钮,一个文本编辑框和一个列表框添加到窗体。注意不是组件板中Standard页中的VCL组件,而是相应的IntraWeb组件:IWButton,IWEdit和IWListbox。
2、 像下面那样调整它们的属性:
object IWButton1: TIWButton
Caption = 'Add Item'
end
object IWEdit1: TIWEdit
Text = 'four'
end
object IWListbox1: TIWListbox
Items.Strings = (
'one'
'two'
'three')
end
3、 双击按钮组件编写OnClick事件,代码如下:
procedure TformMain.IWButton1Click(Sender: TObject);
begin
IWListBox1.Items.Add (IWEdit1.Text);
end;
如图21.1所示的web程序(图中所示的是多两个按钮的最终版本)能够把文本添加到列表框,创建它仅需这几步。当你运行该程序时需要注意的是你每次单击按钮,浏览器都会向程序发送一个新的请求,该请求将会驱动Delphi事件句柄产生一个新的基于窗体上组件新状态的HTML页。
当您执行该程序时,您看不到程序输出的浏览器,而是一个IntraWeb控制器窗口(见图21.2)。一个stand-alone IntraWeb应用程序是一个HTTP服务器,这一点在下一部分里会有详细的阐述。您所看到的这个窗口是由每个stand-alone IntraWeb应用程序的项目文件中默认创建的IWRun函数来调用管理的。您可以在该调试窗口中选择一个浏览器,并通过它来运行程序,或者把URL拷贝到剪切板,然后粘贴到您的浏览器中。程序默认使用一个随机端口,该端口每次执行都不相同,因此,每次执行时的URL都不同。您可以通过选择服务器设计器(有点像数据模块)设定port端口属性来改变这种行为。在该例中我用的是8080(一个普通的HTTP端口),当然,其他值也可以。
IntraWeb程序的代码主要在服务器端,但IntraWeb也能够产生Javascript来控制程序的一些特性,因此在客户端也可以执行特别的代码。您可以通过使用特别的客户端组件或者写一些特别的JavaScript代码来实现。作为一个比较,下面例程IWSimpleApp中的两个按钮通过不同的方法实现显示一个消息框。
两个按钮中的IWButton2使用Delphi代码利用服务器端事件来显示一个消息框。
procedure TformMain.IWButton2Click(Sender: TObject);
var
nItem: Integer;
begin
nItem := IWListbox1.ItemIndex;
if nItem >= 0 then
WebApplication.ShowMessage (IWListBox1.Items [nItem])
else
WebApplication.ShowMessage ('No item selected');
end;
这两个按钮中的第二个(IWButton3)使用了JavaScript,这是通过在按钮的ScriptEvents属性的属性编辑器中正确地设置JavaScript事件句柄来实现在Delphi程序中嵌入JavaScript的。
IntraWeb事件脚本编辑器
初探幕后
看到了吧,创建一个IntraWeb应用程序就和创建一个基于窗体的Delphi应用程序一样简单:在窗体上放置组件然后处理它们的事件。当然,效果是不同的,毕竟这样的程序是运行在浏览器中。为了让您明白到底是怎样工作的,我们简要地看一下这个简单的程序背后。这样做会帮助您理解设置组件属性和使用组件编程的效果。
这是一个基于浏览器的程序,因此没有什么比看一下程序送到浏览器的HTML代码能更好地理解它工作机制的方式了。打开IWSimpleApp程序源代码页,会发现分成了三部分。第一部分是类似下面的样式列表:
.IWEDIT1CSS {position:absolute;left:40;top:40;z-index:100;
font-style:normal;font-size:10pt;text-decoration:none;}
IntraWeb使用样式不仅能确定每个组件的外观,如字体和颜色,而且能够确定组件的位置,默认方式是相对位置定位。每个样式受组件的很多属性影响,如果您有样式表的知识,您可以简单地试验一下;如果不熟悉样式表,那就相信IntraWeb吧,它会把组件在web页上绘制得很好。
The second block consists of JavaScript scripting. The main script block contains initialization code and the code of client-side event handlers for the components, like the following:
第二块包含了JavaScript的描述。主要的脚本块包含初使化代码和组件的客户端事件处理代码,例如:
function IWBUTTON1_OnClick(ASender) {
return SubmitClickConfirm('IWBUTTON1','', true, '');
}
The scripting section of the page has also references to other files required by the browser and made available by IntraWeb. Some of these files are generic; others are tied to the specific browser: IntraWeb detects the browser being used and returns different JavaScript code and base JavaScript files.
脚本还涉及一些浏览器需要的由IntraWeb产生的其他文件。这些文件有些是通用的,而有些是捆绑给特定的浏览器的:IntraWeb能够探测出所用浏览器,从而返回不同的JavaScript代码和基本JavaScript文件。
注意:因为不是所有浏览器都能识别JavaScript的,所以IntraWeb只支持部分浏览器。支持的浏览器有最新版的Microsoft Internet Explorer、Netscape Navigator和开放源代码的 Mozilla (我用的就是)。由于Opera支持JavaScript更有限,所以默认情况下如被识别,IntraWeb就会发出一个错误信息(依赖于controller的SupportBrowsers属性)。Opera能够和免费的Arcana组件一起使用,在IW 5.1版中被正式支持。记住浏览器可能会伪造身份:比如,Opera常常被认成IE。为使站点不受浏览器的限制,设置支持更多的浏览器,却又可能会导致运行错误和矛盾。
第三部分HTML是定义页面结构的。在Body标记内部是一个带有将要执行的动作的form标记(同一行):
<form onsubmit="return FormDefaultSubmit();" name="SubmitForm"
action="/EXEC/3/DC323E01B09C83224E57E240" method="POST">
form标记依附于指定的用户界面组件,如按钮和编辑框:
<input type="TEXT" name="IWEDIT1" size="17" value="four"
id="IWEDIT1" class="IWEDIT1CSS">
<input value="Add Item" name="IWBUTTON1" type="button"
onclick="return IWBUTTON1_OnClick(this);"
id="IWBUTTON1" class="IWBUTTON1CSS">
窗体还隐藏了一些用于前后传递信息的IntraWeb组件。不过,URL在IntraWeb中是最重要的传递信息方式。在程序中URL类似下面:
http://127.0.0.1:8080/EXEC/2/DC323E01B09C83224E57E240
第一部分是IP地址和stand-alone IntraWeb应用程序端口(使用不同的体系结构将会不一样), EXEC 命令后面是累计请求次数,后面是session ID。稍后我们会讨论Session。但现在我们就可以说IntraWeb使用URL记号代替cookies从而忽略浏览器的设置而使应用程序可用。如果你愿意,可以通过设置controller的TrackMode属性,来使用cookies代替URL标记。
IntraWeb 体系结构
在演示如何使用Delphi7中其他IntraWeb组件之前,让我们来讨论一下IntraWeb的关键东西: Web开发的不同开发模式,即AppMode和PageMode。前者可以开发成一个独立运行的可执行程序,也可以开发成ISAPI DLL,甚至Apache Modules。AppMode能够真正展示IntraWeb的优秀特征。而PageMode则是WebBroker或WebSnap程序的IntraWeb简版插件,可以开发除可执行程序之外的任何程序,如ISAPI、Apache Module、CGI等。IntraWeb基于这两种模式提供了三种不同但又有所交叉的体系结构:
Standalone Mode 提供了一个像第一个例程那样的自己的Web Server。这一点对于调试来说相当便利(你可以在开发环境中直接运行并且可以随处设置断点)。Standalone mode开发的程序可以运行在内联网(Intranets)并且让用户在自己的电脑上脱机使用Web 界面工作。如果带参数 -install 运行stand-alone程序,程序将会以服务形式工作,不显示对话框界面。Standalone mode提供开发使用IntraWeb自身作为Web服务器的AppMode程序的一种方法。
Application Mode 能够开发商务web服务,建立Apache module或是IIS动态链接库。Application mode具备包括会话期管理在内的IntraWeb全部特性,并且是开发通过Web即可升级的网络程序首选。准确地说,Application mode可以开发成为stand-alone程序,ISAPI动态链接库,或是Apache modules。
Page Mode 提供一个整合IntraWeb页面和WebBroker与WebSnap应用程序的方法。Page mode能够向现有的程序或是基于其他技术的动态交互站点注入IntraWeb特性,提供更好的交互手段。Page mode是在CGI程序中使用IntraWeb技术的唯一选择,不过,Page mode不具有会话期管理特性,而具备该特性的Stand-alone IntraWeb程序却不支持Page mode。
本章后面的例子,为了追求简单和调试方便主要使用Stand alone模式。但同时也会涉及Page mode。