用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的值也是必须的,因为在本程序中,并未涉及到月初月末时间变化。

转载于:https://www.cnblogs.com/myamanda/articles/1657403.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下编译firefox

可以自己定制下。估计很简单。。。。。 官方文档扫一遍&#xff1a; https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions 以下是中文相关博客&#xff1a; http://www.cnblogs.com/jianghust/archive/2010/06/14/1758234.html http://blog.…

两头编程,测试中间

最近在做一些开发测试代码的工作&#xff0c;就是为了测试中间业务程序&#xff0c;前头调用程序&#xff0c;后头写挡板程序&#xff0c;说白了就是链路调用&#xff0c;因为复杂度在中间的业务程序&#xff0c;所以前后两端的程序应相对简单。这里就有一个问题&#xff1a;技…

Win32 窗口篇(3)

1.11 如何显示或隐藏窗口的标题栏 使用ModifyStyle方法改变参数来更改窗体样式 void CDemoDlg::OnTest1() {//删除标题栏风格ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED); }void CDemoDlg::OnTest2() {//添加标题栏风格ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED); …

linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列

来源CSDN:CSDN-专业IT技术社区-登录​blog.csdn.net一、概念和原理消息队列是另一种标准IPC,当然也大概遵循大部分标准消息队列,它是存放消息(数据)的队列&#xff0c;而队列是先进先出的线性数据结构换句话说,我们就是利用这个数据结构 进行进程间的通信消息队列允许多个进程同…

15个只有数学老师懂的泪流满面瞬间

全世界只有3.14 % 的人关注了爆炸吧知识「1」大题算了半天&#xff0c;就是跟标准答案对不上「2」一次令人期待的公开课啊啊——啊...「3」这就是传说中美好的协同教研「4」在网上下了一堆 PPT 准备拼到一起「5」预测高考题「6」临下课了还有三道大题没评讲「7」当我以为我已经…

matlab绘制二元一次函数图像_【八上数学】 一次函数必考知识点(下)

【八上数学】《一次函数》必考知识点(中)【八上数学】《函数、一次函数》必考知识点(上)写在前面本讲&#xff0c;我们重点研究一次函数与一元一次方程&#xff0c;不等式&#xff0c;二元一次方程组的问题&#xff0c;帮助同学们解决一些典型问题&#xff0e;一、一次函数与二…

计算机能代替纸笔英语作文,电脑能代替纸笔吗英语作文

电脑能代替纸笔吗英语作文在现实生活或工作学习中&#xff0c;说到作文&#xff0c;大家肯定都不陌生吧&#xff0c;作文可分为小学作文、中学作文、大学作文(论文)。作文的注意事项有许多&#xff0c;你确定会写吗&#xff1f;以下是小编为大家整理的电脑能代替纸笔吗英语作文…

《WinForm开发系列之高级篇》Item2 TCP异步传输

1.AsySocket.cs 代码 publicclassAsySocket {#region私有字段privateSocket mSocket null;privatestringmID "";#endregion#region构造函数publicAsySocket(string_LocalIP, int_LocalPort) { try{ mSocket newSocket(AddressFamily.InterNetwork, SocketType.Stream…

C# params的用法详解

为了将方法声明为可以接受可变数量参数的方法&#xff0c;我们可以使用params关键字来声明数组,要求&#xff1a;(1)在方法声明中的 params 关键字之后不允许任何其他参数&#xff0c;并且在方法声明中只允许一个 params 关键字。(2)该参数必须标识一个一维数组&#xff0c;但类…

忙碌的三月,小感慨下~

感觉这个月过的非常快&#xff0c;收获好多。 这个月一直在忙科技立项的事&#xff0c;忙着学习VSTO&#xff0c;忙着分配任务&#xff0c;忙着答辩。我个人还是很喜欢去接触新的东西的&#xff0c;各种学习&#xff0c;呵呵。在这次科技立项中学到了更多的是管理方面的东西&am…

spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!

公众号关注“程序员二哥”&#xff0c;设为‘星标’&#xff0c;带你学习更多的知识。本文内容 详细介绍5中bean的sope及使用注意点自定义作用域的实现应用中&#xff0c;有时候我们需要一个对象在整个应用中只有一个&#xff0c;有些对象希望每次使用的时候都重新创建一个&…

女生的拳头有多厉害?

1 天下武功唯快不破2 狗子&#xff1a;没想到我有这种天赋3 哈哈哈还是你社会啊4 女生的拳头有多厉害&#xff1f;?5 怎么解开的&#xff1f;6 心中有海&#xff0c;脚下有沙&#xff0c;这就是马尔代夫7 你的人生概括

【转】10个让人受益的管理原理

1、彼得原理    每个组织都是由各种不同的职位、等级或阶层的排列所组成&#xff0c;每个人都隶属于其中的某个等级。彼得原理是美国学者劳伦斯彼得在对组织中人员晋升的相关现 象研究后&#xff0c;得出一个结论&#xff1a;在各种组织中,雇员总是趋向于晋升到其不称职的地…

与ln的指数转化公式_高考数学48条秒杀型公式与方法

点上方蓝字&#xff0c;关注“云学冠学习资讯”有助于提高成绩哦&#xff01;除了课本上的常规公式之外&#xff0c;掌握一些必备的秒杀型公式能够帮你在考试的时候节省大量的时间&#xff0c;师姐这次的分享就是48条秒杀公式&#xff0c;直接往下看&#xff01;1.适用条件&…

计算机技术级生活中的应用,人工智能技术在计算机中的发展与应用

摘要&#xff1a;科学技术的快速提高给计算机技术应用带来了新的发展.计算机程序研发人员在开发计算机应用领域这一过程之中,会依据使用人员的使用要求来进行规划和整合.随着人们对计算机网络依赖程度逐渐提高,人们对计算机的运用要求变得十分的严格和严谨,从而使计算机开发设计…

Dotnet 6.0,你值得拥有

Dotnet 6.0 就要来了&#xff0c;这会是一个绝对值得拥有的版本。了解一下&#xff1f;最近在研究 Dotnet 6.0 & C# 10&#xff0c;一个字 - 爽&#xff01;下面&#xff0c;分享一下新的一些特性给大家。一、编程语言方面编程语言升到 C# 10&#xff0c;新东西不少。1. 属…

在C#2.0中使用Nullable可空类型

在C#1.x的版本中&#xff0c;一个值类型变量是不可以被赋予null值的&#xff0c;否则会产生异常。在C#2.0中&#xff0c;微软提供了Nullable类型&#xff0c;允许用它定义包含null值&#xff08;即空值&#xff09;的数据类型&#xff0c;这对处理数据库中包含可选字段以及很多…

python版本差异_python的版本的差别 2,3

第一种 识别python语法执行python代码 x 上 python2 如果不指定文件头 中文没法存储 那是因为python2解释器识别语法存储数据的时候默认使用的是ASCII 如果指定了文件头 python2解释器识别语法存储数据的时候使用文件头指定的编码 python2中通常都会在中文的字符串前面加一个u…

豆瓣9.7,这些舍不得看完的神剧,看一集少一集!我刷了一晚上……

全世界只有3.14 % 的人关注了爆炸吧知识今天给大家介绍一位好朋友——小樱&#xff0c;小樱&#xff0c;作为资深美剧迷英语博主&#xff0c;收藏了很多经典美剧、动画资源&#xff0c;每天还会和大家分享新鲜有趣的英语知识。喜欢看美剧追动画和立志学好英语的小伙伴千万别错过…

C#编码规范

1、连接数据库并返回DataTable View Code public DataTable GetDataByTable() { DataSet dataset new DataSet(); DataTable datatable null; SqlConnection sqlConnection new SqlConnection("Data Source.;Initial CatalogCalamity_Dat…