用ISAPI方式实现Web页面的自动更新
作者:崔本强
对于某些网站管理员来说,最痛苦的事情莫过于每天必做的重复工作。譬如:从新闻页面中删除旧的新闻标题,换上新的新闻标题;如果想让读者能看到以前的新闻,还要更改随时间改变的FormField值。等等。用DELPHI编写一个WebServer端的ISAPI程序,可以大大减轻工作量。
---- ISAPI方式的服务器端程序,有以下特点:内存开销小,多个客户端链接与一个链接内存开销等同;速度快。由于DLL运行一次后便常驻内存,当有新的链接时,直接从内存发送数据,有效地提高了速度。
---- 我用DELPHI4编写的这个程序,具有以下功能:
---- 1、根据日期变化,自动修改FormField的时间值(此值宫浏览器端选择)。
---- 2、自动生成新闻目录。管理者只需把新的新闻拷贝至此目录即可,程序能自动生成新闻首页的页面。
---- 重点:
---- 1、在一个目录中搜索符合条件的文件,返回句柄: HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData);
---- 2、根据FindFirstFile返回的句柄继续搜索下一个文件: BOOL FindNextFile(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData );
---- 3、关闭指定搜索句柄: BOOL FindClose(HANDLE hFindFile);
---- 4、WIN32_FIND_DATA该结构存储FindFirstFile和FindNextFile找到文件的各项信息,其结构如下:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName
[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA;
程序的action内容:
name
pathinfo
enabled
updata
WebActionItem1
/DispNews true
源代码如下:
unit Unit1;
interface
uses
Windows, Messages,
SysUtils, Classes,
HTTPApp,ShellApi, ExtCtrls;
type
TWebModule1 = class(TWebModule)
Timer1: TTimer;
procedure WebModule1updataAction
(Sender: TObject; Request: TWebRequest;
Response: TWebResponse;
var Handled: Boolean);
procedure WebModule1WebActionItem1
Action(Sender: TObject;
Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
WebModule1: TWebModule1;
implementation
{$R *.DFM}
//
//本部分是执行不带入口的dll。
功能:生成新闻中心的首页,
//主要目的是下拉菜单
的时间动态改变
procedure TWebModule1.
WebModule1updataAction
(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="AutoUpDt.dll/DispNews"';
DHTML:=DHTML+'< p >
< select size="1" name="tm" >';
//下拉列表中包含
前推十天的日期
DHTML:=DHTML+'< option
selected value="'+FormatDateTime('mmdd',
date)+'" >今天< /option >';
DHTML:=DHTML+'< ption value="'
+FormatDateTime('mmdd', date-1)+'"
>昨天< /option >';
DHTML:=DHTML+'< option value="'
+FormatDateTime('mmdd', date-2)+'"
>前天< /option> ';
for i:=1 to 7 do
DHTML:=DHTML+'< option value="'
+FormatDateTime('mmdd',
date-2-I)+'" >'+FormatDateTime
('m"月"dd"日"', date-2-I)+'< /option >';
DHTML:=DHTML+'< /select >
< input type="submit" value="提交" name="B1" >';
DHTML:=DHTML+'< /p >';
DHTML:=DHTML+'< /form >';
DHTML:=DHTML+'< /body >';
DHTML:=DHTML+'< /html >';
Response.Content:=DHTML;
end;
//根据request传送的参数
确定要显示的文件目录
//并从该目录中取
出所有的htm文件
//如果没有该目录,
则向浏览器发送提示信息
procedure TWebModule1.
WebModule1WebAction
Item1Action(Sender: TObject;
Request: TWebRequest;
Response: TWebResponse;
var Handled: Boolean);
Var ReqDir:Tstrings;
//保存Request要求的参数
Var DHTML,SeleDir:string;
var FileNameData:
WIN32_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="5"
color="#0000FF" >
新闻中心< /font >< /p >';
//DHTML:=DHTML
+ReqDir.Values['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+'/'
+FileNameData.cFileName+'" >'
+FileNameData.cFileName+'
< /a >< /p >';
//根据搜索句柄向后搜索
while FindNextFile
(SearchFileHandle,
FileNameData ) do
DHTML:=DHTML+'< P >< a
href="../'+SeleDir+'/'
+FileNameData.cFileName+'"
>'+FileNameData.cFileName+'
< /a >< /p >';
//关闭搜索句柄
fileClose(SearchFileHandle);
end
else
DHTML:=DHTML+'对不起,
没有您需要的新闻';
DHTML:=DHTML+'< /body >';
DHTML:=DHTML+'< /html >';
Response.Content:=DHTML;
end;
//在上午八点到九点之间,
Timer被激发一次,创建下一天的文件夹
procedure TWebModule1.
Timer1Timer(Sender: TObject);
begin
if FormatDateTime('h',
time)='8' then
mkdir(IntToStr(StrToInt
(FormatDateTime('mmdd', date))+1));
end;
end.
---- 实际使用时,可根据自己的需要,将已有的Web页面编辑进程序中;同时,编写合适的时间处理函数修改FormField的值也是必须的,因为在本程序中,并未涉及到月初月末时间变化。