熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

用ISAPI方式實現Web頁面的自動更新

2013-11-11 21:06:31  來源: Delphi編程 
 對於某些網站管理員來說最痛苦的事情莫過於每天必做的重復工作譬如從新聞頁面中刪除舊的新聞標題換上新的新聞標題如果想讓讀者能看到以前的新聞還要更改隨時間改變的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的值也是必須的因為在本程序中並未涉及到月初月末時間變化


From:http://tw.wingwit.com/Article/program/Delphi/201311/8517.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.