admin管理员组

文章数量:1578577

2024年7月23日发(作者:)

什么是IntraWeb

IntraWeb是一个创建基于Web应用程序的具有革命性意义的新方法,在早期版本的IntraWeb的用最简单的

方法创建Web解决方案的基础上,IntraWeb扩展了它的技术,提供了一个杰出的工具,用来高速、简易地

创建Internet,Intranet 以及Extranet应用程序。

许多基于Web的开发工具都要求开发者有CGI脚本的知识,同时也要求开发者要有状态跟踪以及复杂的客

户端配置。IntraWeb避免了这些。通过使用Delphi中的组件,简单的创建一个应用程序项目,之后,注册

到服务器上,客户就可以利用兼容HTML 4的任何一种浏览器来访问这个应用程序。这些浏览器包括最新

版的Netscape 以及Internet Exploer等等。利用IntraWeb开发的Web应用程序在这些浏览器上都通过了测

试。利用IntraWeb开发,不需要写任何的HTML、CGI或是JavaScript代码,所有的代码都在Delphi中完

成了。为了让应用程序有更好的灵活性,利用IntraWeb开发的应用程序也可以以独立的可执行程序的方式

像其它的桌面应用程序一样来运行,也提供了相应的调试能力。

IntraWeb是怎样工作的?

IntraWeb很像是普通的应用程序,唯一不同的是它的用户界面是用浏览器代替了通常的Windows界面,

当把应用程序安装到Web服务器上之后,用户马上就可以通过它的网络地址来开启它,应用程序会马上建

立使用者的用户信息,这样就可以避免丢失用户信息或者与其它的使用者发生使用混乱。每一个用户的使

用信息都会由程序自动创建和跟踪,并且对于开发者来说,是透明的。其它的开发语言,像ISAPI,CGI,ASP

处理这些问题的能力都不是很好。IntraWeb设计成一套能创建基于Web的各种类型应用程序的开发工具,

不论是一个简单的数据输入界面,投票或是一个更复杂的让已访问过的客户能顺利登录的应用程序,

IntraWeb都能胜任。

IntraWeb用户手册

系统要求

客户要运行用IntraWeb开发的应用程序,唯一的要求就是要有一个能兼容HTML4.0浏览器,用IntraWeb

及HTML4和JavaScript开发的程序都通过了广泛的测试,它支持Mozilla,Netscape 6 或更高版本,Internet

Exploer 4.0 或更高版本。

备注:如果你想你的应用程序支持Netscape 4,你就要使用我们继续给予支持的IntraWeb4的版本来开发。

HTML4

IntraWeb使用HTML 4和样式单来完成页面元素及其它元素的布置,要使用模板或Page Mode都需要使

用到样式单。

JavaScript

JavaScript的使用可以提供更多的客户端特性,JavaScript 也允许IntraWeb来控制浏览过程以及一个已经

生成的页面,只有在Application mode,JavaScript才是必需的。

Browser Specific Feathers

尽宇航局HTML 和JavaScript的标准已经制定了,但是在许多地方,不同的浏览器之间仍然存在许多差异,

IntraWeb能自动调整这些差异,IntraWeb充当了一个HTML和JavaScript代码的生成器。IntraWeb甚至

动态地知道每一个浏览器在运行时所存在的每一个Bug.另一方面,IntraWeb输出给每一个浏览器的代码都

是经过优化的,请查阅Browser Implementations这一章节,获取更多的信息。

安装IntraWeb

安装

在Delphi的安装过程中,IntraWeb将会自动整合到Delphi中,三个新的包含IntraWeb组件Tab会在Delphi

可视化组件工具中自动创建,其中一个包含了非数据库类型的组件,另外的两个包含一个数据库访问类型

的组件和控制组件。一个新的名为IntraWeb的Tab也会在Delphi的储存器中创建,所有的IntraWeb应

用程序都将通过包含在这些Tab中的组件和模块来完成。

IntraWeb的安装会把一些文件拷贝到WindowsSystem目录以及所有Delphi环境变量中所需要的子目录

下,同时,也创建了一个在程序组中通过开始菜单来访问的快捷方式,文档也会被放在这个程序组中。

卸载

要卸载IntraWeb,和其它的Windows应用程序一样,选择控制面板里的“添加/删除应用程序”来卸载

IntraWeb。

安装License Keys

对于注册用户,能过与试用版用户一样的方法来下载License Keys,如果你安装的是试用版本,那么License

Keys的安装完全是为了能使用注册程序,这个程序可以通过IntraWeb程序组中的图标来运行。

重新考虑用户界面

许多我都尝试把他们的用户程序设计成像普通的Windows应用程序一样,如果你也是这样的话,你会发现

你所设计的界面工作得并不是很好,想像一下,创建一个就像是一个DOS应用程序一样的用户界面,那将

会是多麻烦的一件事,不要仅仅考虑在Web上的用户界面是怎么样的,你还要再想想在设计Web界面时所

发现的局限性。

DBGrids就是一个例子,在一个普通的Delphi应用程序中,它被用于在一个Grid中显示成千上万的数据记

录,在Web中,那将会是一个非常大的HTML文档,而且在用户加载的时候,是非常慢的。当一个开发者

意识到这个事实情况的时候,他们经常会使用 “Next”和 “Previous”按钮以便于让DBGrid能局部地显示,

但是,这样做会让占用更多的服务器内存,消耗更多的服务器资源,同时,作为提供数据来源的数据库也

会回为内存大量的占用而变得越来越慢,试着想想一些普通的Delphi应用程序的作法,重新考虑一下在

Web上的用户界面。当然,利用创建一个空的Grid同时用一个搜索功能来解决也是通常用来缓解上述问题

的办法之一,通过让用户提供他所要筛选的数据参数,就能从成千上万的数据中筛选出十几个,或仅仅是

几百个记录,这不但是降低网络带宽占用的好办法,同时,它也可以说是提供了一个很好的用户界面,并

且,同时也最小化地读取数据库。

允许用户输入搜索条件仍然有可能产生就像上面提到的得到成千上万记录的可能性,为了避免这种情况的

产生,TIWDGBrid有一个RowLimit属性,它默认值是0,也就是说它默认是被禁止的。你可以给它设置

一个最大值,这样,不管查询出多少记录,返回给用户的记录数也不会超过你在RowLimit中所设置的最大

值,你可以查阅其它的技术参考来证实这一点。许多的搜索引擎也都限制了最大返回结果数,这不仅仅是

为了节省网络带宽,在大多数情况下,数据的精确程度是伴随着数据量的减少而增加的,如果不是这样的

话,那么返回给用户大量的记录,他们还是会想方设法地去筛选的。

如果你还是决定用Next/previous选项来使用 “paged grid”技术以减少传递的数据数,你也可以通过设置

TIWDBGrid的 “StartFirst”属性成 “false” ,把RowLimit属性设置一个最大值来决定一次传给用户的数据

记录数,这样,在数据显示之前,你也可以通过Next/Previous来移动数据记录。

创建一个新的应用程序

写你的第一个应用程序

所有的IntraWeb应用程序都应该通过新建项目中的IntraWeb Tab来创建,点击 File -> New,选择

IntraWeb Tab,选择 Stand Alone Application,一个对话框会提示你输入你要把由Delphi自动创建的文件

应该被放在计算机的什么地方。

这将为一个新的IntraWeb Stand Alone Application创建一个框架,它把一些开发所需的文件复制到项目所

在的文件夹,并且创建了一个模板文件以及一个空白的Form,尽管现在的项目已经可以编译和运行了,但

是它实际上还不能做任何事情。一个标准的调试FORM将显示一些关于IW和相关菜单项的信息,选择“运

行菜单,运行这个程序,将自动打开一个浏览器显示一个空白的页面,这是因为主FORM中没有包括任何

组件或功能项。

program IWProject;

uses

IWInitStandAlone,

ServerController in ‘’

{IWServerController: TDataModule},

IWUnit1 in ‘’ {formMain:

TIWFormMain};

{$R *.res}

begin

IWRun(TFormMain, TIWServerController);

end.

上面的代码显示了这个项目文件中的内容,它包含一个用来运行程序的叫做IWRun的过程。

procedure IWRun(AMainFormClass: TIWFormModuleClass;AServerControllerClass:

TIWServerControllerBaseClass);

IWRun接受两个必须的参数(指定Main Form Class和Server Controller Class)和一个可选的参数(Server

Type)。

IntraWeb 用户手册

正如我们以前提到过的,一个新的项目是创建任何一个IntraWeb应用程序的开始,就像其它的Delphi项

目一样,一个Main IntraWeb From会被自动创建,并做为一个新程序的主界面,为了证明IW开发的强大

能力及简易性,下面我们举一个小例子。

1. 打开刚才创建的那个默认的IWForm()。

2. 分别在这个Form中放入 IWButton, IWEdit, IWLabel。

3. 把下面的代码放入IWButton 的 OnClick事件中:

procedure on1Click(Sender: TObject);

begin

n := ;

end;

完成后,编绎运行程序,为了测试它,按F9键。默认的浏览器将自动打开并显示主界面。输入一些文字

到文本框中,然后点击按钮,输出结果将显示到Label上。

虽然,我们这个例子不像发明火箭那样激动人心,但是,它确实表明我们全部使用标准的Delphi语句,并

没有写一句HTML代码,我们之所以要选择这个例子,是因为它很简单,它证明我们用IntraWeb来开发

Web应用程序确实就像我们用Delphi开发普通的应用程序一样,一样的方法,一样的属性,一样的事件,

等等都可以用同样的方法。然而在开发完善的数据库应用程序时,IntraWeb却更强大。

要获取更多的关于开发IntraWeb应用程序的例子,请访问 /

Working With Forms

在程序中,我们要介绍的是都要包含的单元-IntraWeb Form,所有的IntraWeb From都可以通过

“File-New-IntraWeb Form”来创建,所有在IntraWeb中使用的Form 必须是一个专门的 IntraWeb Form,

标准的Delphi Form是不能在IntraWeb应用程序中使用的,一个新的Unit创建时,可用的Form会显示在

屏幕上,使用IntraWeb Form和与使用普通的Delphi Form有一点不同,简单的说就是IntraWeb 的 Form

要使用 Show 方法来显示,换句话说,也就是在IntraWeb开发中,ShowModal方法是不被支持的。更

多的信息你可以参考Demos.

Images and Graphics

IntraWeb通过Templates来支持图像,包括 TIWimage, TIWDBImage and TIWImageFile。在IntraWeb

中,你可以使用许多种方法来支持图像,同时,它们也有一些基本的方法。

Templates

在templates中使用图像也就是将图像插入到HTML中去,但是任何图像文件都必须在Files文件夹中,

或者是一个标准的WEB服务器中。

TIWImage

TIWImage被使用在创建动态的图像上,每当要显示一个图片时,图片都会被转换成JPG格式,这样,图

片是做为应用程序中功能的一部分来使用的。你可以参考关于动态交互式图片的演示程序来获得更多的信

息。如果你使用的是静态的图片,你可以使用TIWImageFile.

TIWDBImage

TIWDBImage 从数据库字段中自动把图片转换为JPG格式,它的使用就像普通的TDBImage一样,它提

高了从数据库中把图片输出到浏览器上的开发效率。

TIWImageFile

TIWImageFile提供了从磁盘上的一个文件中显示图片的能力,因为它不会转换图片模式,TIWImageFile

是一个比TIWImage更有效率的显示图片的组件,如果你仅仅是完整地显示一个静态的图片,你应该经常

使用TIWImageFile。

TIWImageFile也提供了设计时显示图片的能力,你可以在设计Form的同时显示图片,然而,这个图片只

是纯粹地显示,图片信息不会储存在Form中,只有当程序在运行时,图片才会被Load 到Form中。Filename

指定了要显示的图片的完整路径。在运行时,路径将会被省略,只有文件名会被使用,所以,在选择时,

要显示的图片应该在Files目录下。

GIF Support

IntraWeb支持GIF的显示,然而,安装程序将没有默认的安装GIF的支持,就参考IntraWeb FAQ来获得

臬安装和使用GIF文件的信息。

其它的文件

其它的文件,例如图片、下载的文件等等都可以通过指定主程序所在的相对路径来访问,创建一个Files

目录,把所有的HTML对象都放到这个目录下,在HTML页面中,你就可以通过使用 img

Src=’’../files/’’这样的形式来访问。请确认,在浏览器中你要使用 / 而不是 来访问,在IE中,

这种错误会自动被改正,但是在其它的浏览器中却不会被自动改正。通常,这种方法不仅限于对图片的显

示,也可以用在其它所有的文件格式中。

访问的文件都会被浏览器缓存,如果你希望创建一个不会被浏览器缓存的文件链接,那么,你可以

用../filesnc/来代替../files/。文件将会从一个同样的目录来访问,但是不会被浏览器

缓存。

其它的

FormProperties

请仔细地查看那些经常会被开发都忽略的Form的属性,这些属性可以控制例如HTML的输入及其它更多

的。

Server Controller

每一个应用程序都包含一个ServerController单元,这个单元包含了会影响应用程序在全局范围中的动作

及行为的属性,它也包含了能在应用程序中定义的事件。

DataModules

如果你要使用DataModules,请参考一下 FishfactDM演示,有一点要提醒的是,如果你在设计时链接了一

个DataSource,就像在FishFactDM里一样,你的DataModules必须被一个WebApplication所拥用,这

在FishFactDM中是通过设置DataModules’s owner到 Session Data’s owner的WebApplication Variable

来实现的,如果做了这一步,那个Form在属性中是不可读的,并且,所有的Form都将会被链接到第一

个也就是同一个DataModule

Extanding IntraWeb

自定义组件(Custom Components)

所有的IntraWeb组件都是用一个开放的API来写的,这将允许你更容易的将你自已写的组件增中到

IntraWeb里,这就像是其它的Delphi所做的一样。

嵌入纯HTML

通过使用TIWText,你可以不编写一个组件就把你自己的HTML语句嵌入到IntraWeb中,简单地把一个

TIWText组件拖放到你的Form里,设置RawText属性为True,并且把WantReturns设置为False,最后,

把你需要的HTML语句放到Lines属性里,你的HTML将会成为你输出的Form的一部分。

HTML Templates

HTML templates(可以参考一下其它地方的Template)用于增加一些复杂的HTML到你的应用程序中用来

定义你的应用程序的外观。你可以看看Layout Manager部分来获得更多的信息。

Form Managerment

介绍

在一个IntraWeb应用程序中管理Form就像在普通的Delphi程序中一样简单,但也有一点限制。

限制

1. 只有一个Form是可见的,这是因为在实际情况中,浏览器里只能显示一个Form.

2. 模式的Forms是不能使用的,然而,因为在浏览器中一次只能显示一个Form,所以实际上所有的Form

都是模式的。

3. 所有的Form都必须是Owned By WebApplicaton.

使用方法

Form List

IntraWeb保留了一个Forms的列表做为用户Session的一部分,它就像是时装店里的新上架商品一样,

最近显示的Form将会被保留在最顶端,当一个Form被隐藏时或被释放时,这个列表用来确定应该激活

哪一个Form,如果没有明确的通过.Show方法来提出应该显示哪一个Form.

通常,Form List从来不会直接与用户进行交互,而是通过Call的方法来确定显示哪一个Form,但是,在

有的情况下,Form List必须与用户进行交互,在这些情况下,TIWApplication包含了一系列的方法来实现

与用户的交互,这在帮助文档里都有说明。

Showing Forms

显示一个Form通常的语句格式如下:

第一次看来,这有点让人迷惑,但是它是以下格式的略缩:

除了它在这里是一个WebApplication这外,就像是通常的应用程序一样,不同的是,普通的应用程序在调

用了Call之后,Form是马上就显示,在IntraWeb中,当Call调用一个Form之后,只是纯粹地指定了哪

一个Form是在一个事件退出之后下一个活动的Form,也仅仅当一个事件被执行之后Form才会显示。

Destorying Forms

一个普通的应用程序中,当一个Form不在需要的时候,它能通过使用.Free或.Destroy方法来Destory掉,

在IntraWeb应用程序中,有一点相似,但是,你不能直接调用.Free或.Destroy方法,你必须调用一

个.Release方法,.Release方法并没有真正地Destory这个Form,这个Form直到退出了事件并且把控制

权还给IntraWeb的时候才会真正地Destory.这是因为.Release是Form本身在事件中调用的,尽管这并不

是经常发生。

当Relase被调用的时候,就像一个普通的应用程序一样,当前活动的Form变成前一个被Destory的Form,

如果你不想用户回到上一个Form,你就必须调用.Show方法来激活另一个Form,可以在.Release将程序

控制权还给IntraWeb之前或之后调用.Show方法。当一个Form被释放后,所有对这个Form List的参考

都会被删除,如果在这些Form在Hidden或Release的时候没有调用.Show方法,将改变Form的序列。

Hiding Froms

在普通的应用程序中可以不调用.Hide方法来Destory一个Form,同样的功能也可以在IntraWeb中调.Hide

方法来实现,.Hide方法可以在调用.Release方法时隐藏一个Form而不必Destroy它。调用.Release

时,.Hide删除了所有的关于对这个Form List的引用,但是并没有Destory它,正因如此,如果你想在以

后还想继续使用这个Form,你必须保留一个对这个Form的引用,换句话说,也就是这个Form变成孤立

的了。

Passing Data Between Forms

像普通的应用程序一样,数据可以在Form之前传递,因为Form的信息可以做为Form Class的一个变量

储存在内存中。作为一个试例,你要定义两个Form, TFormMain和ain是主Form

并且包含一个Butoon 和一个Edit Box。TFormDialog包含一个memo Field和一个Label。当用户在主窗

体中点击按钮时,主窗体的Edit Box中的文字会被加到Dialog Form的Memo Field中去,同时,Dialog Form

也会被显示,Dialog Form也同时显示了它已经被显示了多少次,并且允许用户返回到主窗体中去。

IWLink1 OnClick

这个事件以链接的形式与标识Caption为”Quit”相关,当用户点击这个链接时,简单地终止了这个应用程序。

OnCreate

OnCreate事件将会在这个Form被创建时调用,在这个事件中创建了别一个Form,同时,这个Form的引

用也做为Form的member Variable储存起来了,以便于再次调用。

butnOk OnClick

OnClick事件中将会检查Edit Box中是否有数据,如果没有数据存在,那么程序将调用

ssage向用户显示一些信息,当释放MessageBox后,Form将会再次显示,如

果用户已经输入了数据,那么,Using FDialogForm(在当前Form的OnCreate事件中创建)将会显示,

EditBox中的数据会被加到Memo Field中,TFormDialog的member variable会更新,调用.Show方法显

示这个Form,就像你看到的,数据在两个不同的Form中被传递了,如同普通的Delphi应用程序一样。

Complete Demo

你可以看看这个Demo来获得完整的示例。

State Management

Inherent State

标准的Web开发工具都有一个自动的Session Management,但仅仅意味着它会为你跟踪Session的信息,

你仍然不得不在页面之间处理这些状态信息,或者在不同的状态对象中处理这些信息,状态对象通常也局

限于字符串和那些字符串中整理出来的数据,这不利于处理更复杂的数据类型。

IntraWeb在这方面有了一定的改善,它是一种固有的状态管理。你倒底是在说什么呀?新的词语?不,问

问你自己吧,你是怎样在普通的Delphi程序中管理这些状态的呢?什么?你不需要管理?正是这样,在

IntraWeb中你确实也需要管理这些。

限制

Global Variables

全局变量通常不会使用,如果你需要使用全局变量来指定每一个用户Session都要用到的变量,我们下面

将会提到的。

如果你需要对所有的用户Session都使用一个变量,那你就用一个全局变量吧,然而,IntraWeb是一个线

程化的环境,你必须指定一个属性来保护当前访问的变量。

ThreadVars

ThreadVars在IntraWeb应用程序中永远不会被使用到,除非某种临时的储存的使用。IntraWeb是基于

HTTP的表态访问的,这在本质上就意味着所有的线程都没有指定给某一个特定的用户,并且用户是在

HTTP请求和线程中转移的。

Safe Storage

Form/Datamodule Members

因为IntraWeb Form和DataModules是持续的,就像普通的Delphi程序一样,你能以member Variables

和属性的方法来储存信息,这些信息能在Form自身需要时或在接收来自其它Form的时候储存在内存里。

User Session

User Session(在Session Management部分将会更多的介绍)包含一个.Data属性,它能控制到一个对象的

Reference.当你需要储存一个用户的特定信息时,你可以把信息储存在.Data属性里,它接受即时的

TObject,并且能在Session释放的时候自动Destory。最简单的方法就是创建一个对象,把你要的Fields

加到里面,创建一个对象时,当Session创建时,把Session储存在这个Session的Data属性里。Phonetics

示例演示了一个较为完整的例子。

当创建一个新的IntraWeb项目时,一个Shell的用户Session对象也会在ServerController里被自动创建

了,一个缺省的ServerController看上去就像这个样子:

TUserSession是一个空的Session对象,你可以把members, Properties and methods加到上面,为每一

个Session创建一个TUserSession的同时,它也会被创建到OnNewSession事件中。

以Function Named UserSession也是已经存在的用来简单访问对象的方法,所以,如果你把TUserSession

的声明改成以下的样子:

你可以访问这些属性,在你的代码中就像这样:

如果你不再需要一个用户的Session了,你可以在代码里终止它,当然,它不是必须的,这在一个缺省的

template里是作为一个部分自动存在的。

TUserSession的Class Type可以是任何类型的,在一个由DataModule生成的项目中,TUserSession是

TCompnonet的派生,而不是这里显示的TObject。TComponent允许Session own component例如

Datamodule 允许简单地清除。(cleanup).

复杂的State和后退按钮

许多人很快会发现,当然使用IntraWeb开发里,浏览器里的后退按钮没有用了,缺省的IntraWeb禁止了

后退按钮,点击它时,不会有任何事情发生,请注意,这仅仅适用于Application Mode,在Page mode里,

后退按钮是有用的,这个限制是因为IntraWeb为了使用复杂的状态才会有的。

Scenario-Normal Appplication

试想一个普通的程序设计成运行在用户本地计算机上,它有五个不同的Form,并且为了满足Forms multiple

instances of that form may be created different data(例如属性对话框显示了不同对象的不同属性)。试想一

下现在在任何时候,不需要警告或是提示你,用户能在程序里访问任何一个Form。但不仅仅访问任何一个

Form,他们还能访问任何一种过去的状态,甚至是访问一个已经从内存对象中移除的Form。在他们访问那

个Form的时候,他们还能与之交互,怎样的一个程序会这样呢?这里有一些,但不是全部的问题:

-Form所依赖的数据在数据库中的数据已经在数据库中不存在了,因为用户已经删了。

-Form所依赖的数据在数据库中正被改变,并且用户可能正定位到一个非法的数据

-内存中的对象已经被改变了,或者不再存在了。

在非IntraWeb 系统中的后退按钮

不是由IntraWeb开发的系统通常支持后退按钮,然而,它会处于这样一些情况:

_ Stateless – They are completely stateless and reconstruct state between each page.

This is usually very inefficient on the server side for weblications and puts

considerably extra load on databases because data is read and written unnecessarily.

_ State Streaming – These types stream the state into and out of each web page. This

consumes bandwidth and slows down page accesses. They also cannot use complex

data, or usage of complex data causes the same problems described prior.

Even applications that support the back button, such problems are still encountered.

However because they allow old data to be posted they must check the data to see if the

requested operations can be performed. This adds significantly to the amount of user code

except in the simplest of systems. Such systems are typically not weblications, but

individual dynamic pages.

IntraWeb is Not Alone

如果你试过许多的在线Bank应用程序或是定购系统,他们中许多都有同样的限制,但运行得都不是很好,

大多数的系统允许你后退,但是会告诉你你所请求的页面是一个过期的内容,这是一种很不友好的界面,

并且会让那些非技术出身的用户感觉迷惑。

用后退按钮来访问历史数据

在有限的环境下,后退按钮在Application mode下是被支持的,它支持访问历史数据。这就意味着,后退

按钮将可用,让用户返回历史数据。然而,如果用户如果尝试在历史页里与数据进行交互操作时,就会失

败。如果用户尝试这样的操作,那就会出现一个警告:

在这个警告页显示之后,页面将返回到用户通过后退按钮访问的页面之前的那个页面。这个功能通过设置

Server Controller中的.HistoryEnabled属性来实现。

这个警告也可以关闭,要这样做,可以在Server Controller中把.ShowResyncWarning属性设为False,

如果这样做的话,用户将不会看到警告页面,而是直接转到当前页面。

Session Management

WebApplication Object

TIWApplication 指的是一个IntraWeb apllication,TApplication是一个标准的Delphi应用程序。就像近来,

TIWApplication不是一个可视化的组件,它不会出现在属性对话面板中,因此,没有公开它的属性,然而,

它也有一些公开的属性和方法可以通过代码在IWApplication中访问,针对每一个用户的Session,

TIWApplication对象都会创建。它会重新提供用户一个”Application”或是一个”session”。

Session 的生命期

用户Session是由IntraWeb自动管理的,当一个新的Session开始时,IntraWeb会自动创建一个新的实

例给用户并且跟踪它,它能被用来获得用户的信息,控制用户信息或者储存一些典型的信息。对于开发者,

不需要实现Session的管理,或者跟踪用户。

只有当TIWApplication的Terminate方法被调用或者它超时,才会终止一个Session,否则它将一直存在,

如果在特定的时间内,一个用户没有访问应用程序,这个用户的Session将会被Destory,缺省的超时期

是10分钟,但是在ServerController里,通过设定Session Timeout属性,你可以改变这个时间。

Session Implementation

Session是由IntraWeb自动管理的。Session是保存在服务器的内存里的,同时会防止用户人为的修改

Session的数据,每一个Session ID都是由安全的方法来创建的,所以不可预见,同时不容易被修改,通

常情况下,每一个Session都是绑在用户的浏览器上的,并且如果另一个浏览器被检测到试图访问一个同

样的Session,那么会得到一个错误。要获得更好的安全性,可以设置ServerController的RestrictIPs 属

性。这会检查用户的IP地址,如果IP地址改变了,那么服务器将拒绝该Session的访问。这个选项缺省

是设为False的,它只有在控制Intranets或是Extranets的用户时才会被设为True。这是因为,一些代理

服务器比如Microsoft ISA Proxy Server在实现HTTP请求的时候会改变IP地址,这会造成给IntraWeb多

个IP地址。

缺省的,Session ID是嵌入到每一个HTML页面并且由每一个HTTP请求来跟踪的,这允许一个单一的用

户在一个应用程序中拥有多个Session,但是这样不方便的地方是,一旦用户开始使用程序,那他就不能

离开程序和返回它。因为这一点,使用Session ID来跟踪任何非Applicatoin的页面时,必须新开一个窗

口,除非是等到终止应用程序时再运行。

Session Tracking可以被设置为使用Cookies而不是嵌入到HTML页面中,你可以设置ServerController

里的Session TrackingMethod属性为tmCookie来实现。这会让IntraWeb 使用Cookies来跟踪用户的

Session,优点是用户可以随便地在程序内与程序外移动。缺点是许多用户都Disabled了Cookies并且在

一个应用程序中,用户只能有一个Session。

Accessing the Session

应用的应用程序可以通过很多种方法来访问。

WebApplication Property of the Form

你可以简单地使用引用了Form的WebApplication属性来定义所有的事件和方法。这将满足近期来几乎所

有的情况。然而,值得注意的是这个属性中不容易理解的是Global procedures, Tframes, Datamodules and

non IntraWeb classes.

WebApplication Property of a Control

在写一个用户Controls的时候,基本的IntraWeb Control也包含了一个能使用的WebApplication属性。

RWebApplication

RWebApplication是一个特殊的全局变量,它能被用在当一个Form或是一个Control Reference不再有效

时访问当前用户Session。这在Datamodules,Tframes’s, global procedures and non IntraWeb classes时

会非常有用。RWebApplicatoin是一个ThreadVar,在开发者使用它时,没有什么预告的警告,要引用

RWebApplication你需要加一个IWInit到你的 usese clause。

Storing Additiong Data

Addition data能被储存在.Data属性里,在State Management 部分我们已经提到了。

Session Related Events

Server Controller有一些与Session Management相关的方法, are fired for session createion and

destruction.

OnNewSession

OnNewSession在一个新的用户Session创建的时候就被取消了,它传递进来两个参数,ASession和

VMainFrom。

ASession是一个对新创建的Session的引用,能被用在查询用户信息或是修改储存在.Data属性的对象中

的用户信息时。VMainForm就像一个定义的参数一样被传递,它如果在项目文件(dpr)中没有设定缺省

的主窗体的话,那么它就会被初始化为nil,VMainForm可以从Start URL传递的参数中或是通过其它的规

则来修改它,要指定一个交替的主窗体,只要简单地创建它,并且马上把它返回给VMainForm参数。

OnCloseSession

OnCloseSeesion在一个用户Session要终止的时候会被调用。它不会在一个WebApplication的Form关

闭或是一个Session超时的时候被调用。

Memory Consumption

每一个Session所消耗的基本内存是非常小的,通常情况下这不是一个主要要考虑的问题。实际的占用的

大小可以通过一个Session到另一个Session时改变,但是,占用的基本内存除了储存在.Data属性中的

任何一个用户数据之外,通常不会超过1024bytes。

Reference

要获得更多的方法和属性的信息,你可以看看IntraWeb 帮助文件中关于TIWApplication的介绍。

Debugging

当你在Standalone方式开发时,调试就像开发其他的Delphi应用程序一样,设置断点、监视、运行之类

的。

Debug Output

当你的程序运行在Standalone模式时,你可以返回一个调试结果来看看Session的创建、消亡以及HTTP

请求,你可以把调试输出打开,从文件菜单中选择 “Show Debug Information”,或者点击工具条上的图标。

Detecting Error on Startup

如果在运行一个程序时碰到了错误,那么IntraWeb会终止这个程序,并且会把错误的Log存成一个.err

文件,一个以应用程序名加上.err结尾的日志文件将会创建,如果你在运行一个程序的时候碰到困难,那

检查一下相关联的.err文件,.err文件是一个标准的文本文件,能用记事本或其它的工具打开。但是发生在

程序之外的错误,比如找不到需要的包或是一个需要链接的DLL文件时,这种错误不会记录到.err的日志

文件里。

Layout Management

一个Layout management可以把分散多个组件中的零星的HTML片段装配成一个完成的HTML页面发送

给浏览器。IntraWeb提供了一个基本的Layout management,TIWLayoutMgr可以用来充当一个布局管理

器,现在IntraWeb提供了两个管理器,TIWLayoutMgrForm和TIWTemplateProcessorHTML。将来,还

会有其它的可以支持XML或更多的管理器。

Form Layout Manger – TIWLayoutMgfFrom

这是缺省的布局管理器,如果没有一个特别的管理器被指定的话,那么它就会被创建并且使用。

TIWLayoutMgrForm创建的HTML页面就和在设计Form时创建的一模一样。

HTML Templates

Templates允许你更好地规划和布置个别的From. Templates也允许一使用其它的页面编辑工具来设计页

面,而不是使用Delphi,简而言之就是说它允许把设计和代码的实现分开来进行,Templates是一些特别

指定的HTML文件。

要使用Template(模板),需要你的浏览器支持HTML4和JavaScript。在使用Templates时,每一个Frame

Controls都会被当做没有Frame的状态来输出,如果你希望在Templates里使用frame的话,你需要在你

的模板文件里使用IFrame标记来预先分好。

要使用templates,首先要在你的程序目录里创建一个Templates子目录并且创建一个以.html

命名的文件,然后,在你要使用模板的那个Form里

1. 加一个TIWTemplateProcessorHTML组件。

2. 设置Form的TemplateProcessor到那个新加上去的TIWTemplateProcessorHTML组件。要了解模板

中的Action,可以参考Phonetics Customer Profiler Demo。

每一个组件里,Template都会包含一个标记{%me%}。HTMLName多数情况下都会

和生成From时的名字一样,这个标记会在组件输出时被替换。用{%%}而不用<>是因为这样更便于你在

WSIWYG(即见即所得)的HTML编辑工具里编辑它,并且它兼容所有的HTML编辑器,{%%}标记也不

会和其它的特殊字符冲突,这样就不会被解释成一些特殊的标记。缺省情况下,一个主窗体的标记会出现

在要实现功能或属性的代码的首尾,当然,在某些情况下,这可能会和HTML冲突,如果出现这种情况,

可以参考帮助文件中关于Form标记的那章,要在TFrame里使用组

件,HTMLName不同于Name.因此一个Tframe是组件所owner的,一个Tframe中的组件可以在其他

TFrame存在的情况或者Form里有一个组件的情况下取一个与那些Tframe中同名的组件。要避免在运行

时把TFrame中的组件命名为与Frame相同的名字。另外,如果一个名为Label1的组件放在一个命名为

Frame1的TFrame上,那么这个组件的HTMLName在运行时就会成Frame1Label1.在一个模板中就要使

用{%Frame1Label1%}来做为Tag标记了。

如果你希望使用Boland Style Tags <#TagName#>来代替IntraWeb的Style tags,你可以设置TagType属

性为ttBorland. IntraWeb Type tags在即见即所得的HTML编辑器中会更容易使用。

System Tmplates

System templates可以用来编辑由IntraWeb生成的系统信息和对话框的外观和布局。

System Dialogs

有两种特殊的模板文件

本文标签: 用户应用程序使用创建程序