电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

用ISAPI方式实现Web页面的自动更新


发布日期:2018/2/16
 
对于某些网站管理员来说最痛苦的事情莫过于每天必做的重复工作譬如从新闻页面中删除旧的新闻标题换上新的新闻标题如果想让读者能看到以前的新闻还要更改随时间改变的FormField值等等用DELPHI编写一个WebServer端的ISAPI程序可以大大减轻工作量

ISAPI方式的服务器端程序有以下特点内存开销小多个客户端链接与一个链接内存开销等同速度快由于DLL运行一次后便常驻内存当有新的链接时直接从内存发送数据有效地提高了速度

我用DELPHI编写的这个程序具有以下功能

根据日期变化自动修改FormField的时间值(此值供浏览器端选择)

自动生成新闻目录管理者只需把新的新闻拷贝至此目录即可程序能自动生成新闻首页的页面

重点

在一个目录中搜索符合条件的文件返回句柄 HANDLE FindFirstFile(LPCTSTR lpFileNameLPWIN_FIND_DATA lpFindFileData);

根据FindFirstFile返回的句柄继续搜索下一个文件 BOOL FindNextFile(HANDLE hFindFileLPWIN_FIND_DATA lpFindFileData );

关闭指定搜索句柄 BOOL FindClose(HANDLE hFindFile);

WIN_FIND_DATA该结构存储FindFirstFile和FindNextFile找到文件的各项信息其结构如下

typedef struct _WIN_FIND_DATA {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD nFileSizeHigh;

DWORD nFileSizeLow;

DWORD dwReserved;

DWORD dwReserved;

TCHAR cFileName

[ MAX_PATH ];

TCHAR cAlternateFileName[ ];

} WIN_FIND_DATA;

程序的action内容

name

pathinfo

enabled

updata

WebActionItem

/DispNews true

源代码如下

unit Unit;

interface

uses

Windows Messages

SysUtils Classes

HTTPAppShellApi ExtCtrls;

type

TWebModule = class(TWebModule)

Timer: TTimer;

procedure WebModuleupdataAction

(Sender: TObject; Request: TWebRequest;

Response: TWebResponse;

var Handled: Boolean);

procedure WebModuleWebActionItem

Action(Sender: TObject;

Request: TWebRequest; Response:

TWebResponse; var Handled: Boolean);

procedure TimerTimer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

WebModule: TWebModule;

implementation

{$R *DFM}

//

//本部分是执行不带入口的dll 功能生成新闻中心的首页

//主要目的是下拉菜单的时间动态改变

procedure TWebModule

WebModuleupdataAction

(Sender: TObject;

Request: TWebRequest;

Response: TWebResponse;

var Handled: Boolean);

var DHTML:string;

var I:integer;

begin

DHTML:=< html >;

DHTML:=DHTML+< head >;

DHTML:=DHTML+< title >

新闻中心< /title >;

DHTML:=DHTML+< /head >;

DHTML:=DHTML+< body >;

DHTML:=DHTML+< p >

请选择日期< /p >;

DHTML:=DHTML+< form

method=POST action=AutoUpDtdll/DispNews;

DHTML:=DHTML+< p >

< select size= name=tm >;

//下拉列表中包含

前推十天的日期

DHTML:=DHTML+< option

selected value=+FormatDateTime(mmdd

date)+ >今天< /option >;

DHTML:=DHTML+< ption value=

+FormatDateTime(mmdd date)+

>昨天< /option >;

DHTML:=DHTML+< option value=

+FormatDateTime(mmdd date)+

>前天< /option> ;

for i:= to do

DHTML:=DHTML+< option value=

+FormatDateTime(mmdd

dateI)+ >+FormatDateTime

(mdd dateI)+< /option >;

DHTML:=DHTML+< /select >

< input type=submit value=提交 name=B >;

DHTML:=DHTML+< /p >;

DHTML:=DHTML+< /form >;

DHTML:=DHTML+< /body >;

DHTML:=DHTML+< /html >;

ResponseContent:=DHTML;

end;

//根据request传送的参数 确定要显示的文件目录

//并从该目录中取出所有的htm文件

//如果没有该目录则向浏览器发送提示信息

procedure TWebModule

WebModuleWebAction

ItemAction(Sender: TObject;

Request: TWebRequest;

Response: TWebResponse;

var Handled: Boolean);

Var ReqDir:Tstrings;

//保存Request要求的参数

Var DHTMLSeleDir:string;

var FileNameData:

WIN_FIND_DATA;

var SearchFileHandle:THandle;

begin

ReqDir:=NIL;

ReqDir:=Request

ContentFields;

DHTML:=< html >;

DHTML:=DHTML+< head >;

DHTML:=DHTML+

< title >新闻中心< /title >;

DHTML:=DHTML+

< /head >;

DHTML:=DHTML+

< body >;

DHTML:=DHTML+

< p align=center >

< font face=宋体 size=

color=#FF >

新闻中心< /font >< /p >;

//DHTML:=DHTML

+ReqDirValues[tm];

SeleDir:=ReqDir

Values[tm];

// 获得搜索句柄

SearchFileHandle:=FindFirstFile

(Pchar(C:\MyWeb\news\+SeleDir+

\*htm)FileNameData);

if SearchFileHandle< >

INVALID_HANDLE_VALUE then

begin

DHTML:=DHTML+< P >< a

href=/+SeleDir+/

+FileNameDatacFileName+ >

+FileNameDatacFileName+

< /a >< /p >;

//根据搜索句柄向后搜索

while FindNextFile

(SearchFileHandle

FileNameData ) do

DHTML:=DHTML+< P >< a

href=/+SeleDir+/

+FileNameDatacFileName+

>+FileNameDatacFileName+

< /a >< /p >;

//关闭搜索句柄

fileClose(SearchFileHandle);

end

else

DHTML:=DHTML+对不起没有您需要的新闻;

DHTML:=DHTML+< /body >;

DHTML:=DHTML+< /html >;

ResponseContent:=DHTML;

end;

//在上午八点到九点之间

Timer被激发一次创建下一天的文件夹

procedure TWebModule

TimerTimer(Sender: TObject);

begin

if FormatDateTime(h

time)= then

mkdir(IntToStr(StrToInt

(FormatDateTime(mmdd date))+));

end;

end;

实际使用时可根据自己的需要将已有的Web页面编辑进程序中同时编写合适的时间处理函数修改FormField的值也是必须的因为在本程序中并未涉及到月初月末时间变化

上一篇:控制文本框只能录入数字

下一篇:如何把ListBox中的内容拖曳到另一个ListBox中