N
nutian
Unregistered / Unconfirmed
GUEST, unregistred user!
用delphi6+Apache 开发动态网站(一) 转载自www.51delphi.com
-------创建一个简单的网页
随着Internet 的飞速发展,动态网页的开发方法五花八门,有ASP,JSP,PHP,CGI等等,其中web server主要
集中在IIS,Apache等上,MS 的IIS 以其强大的功能吸引了很多的开发者,ASP 是IIS 上用的最多的网页开发
方法,可是ASP 对开发非MS 产品的数据库程序时,简直就是一场恶梦,同时IIS 的漏洞越来越多,系统管理员
每天都得注意最新的漏洞补丁,否则不是被黑客攻翻就是被病毒感染,最近的redcode,bluecode,nimda就是例子。
具有速度快,安全性好,跨平台而且是完全免费的apache http server吸引了越来越多的开发者,而borland 新推
出的delphi6 开始支持Apache,功能强大的delphi 和 快速安全的apache 是一对非常好的动态网站开发方式,而且
delphi6 的工程源码几乎不用动就可以用kylix 编译,并在lunix 下的apache 上运行,厉害吧,动手吧,让
我们开始做一个简单的网页吧!
1.环境设置
先从http://www.apache.org 上下载apache http server for windows 版,最新的版本是1.3.22,
然后安装到服务器上,调试阶段最好现在本机上安装,反正apache 支持win9x,安装完毕后,在IE里面输入
http://localhost,会正常显示apache 默认页,说明安装成功!
2.现在打开delphi6 ,点菜单file-new-other,在new页里面选web server aplication,出现下面图片
选择Apache shared Module(DLL),系统就会建立一个空的工程.把工程另存为test,unit1另存为wmp.pas.
delphi 就会生成以下的工程代码
library test;
uses
WebBroker,
ApacheApp,
wmp in 'wmp.pas' {WebModule1: TWebModule};
{$R *.res}
exports
apache_module name 'Project1_module';
begin
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
end.
把'Project1_module' 改为'test_module'
然后在applicaiotn.Initilize 后面加入一下代码(很重要),
ModuleName:='test_module';
ContentType:= 'test-handler';
以上是让apache 加载dll是用的,如果与apache 的配置不一样的话,是无法运行的.
然后设置WebModule1的name 为wm(这仅仅是为了以后编程简单^_^),
打开wm的actions,出现一个editing wm.actions窗口,点击add new,出现一个新的item,
设置其name 为index,pathinfo 为/index,default 为true,
然后到events 页双击onaction
code editor出现一下代码:
procedure Twm.wmindexAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
end;
加入一下代码
procedure Twm.wmindexAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
const
chweek:array [1..7]of string[2]=('日','一','二','三','四','五','六');
var
s:string;
yy,mm,dd:word;
begin
decodedate(date,yy,mm,dd);
s:='今天是'+inttostr(yy)+'年'+inttostr(mm)+'月'+inttostr(dd)+'日';
s:=s+' 星期'+chweek[dayofweek(date)];
s:=s+'</font〉 欢迎你访问delphi窑洞!';
Response.content := s;
end;
end;
OK! 编译,如果按F9 会出现错误!(因为它是个DLL呀!)
把编译出来的test.dll 拷到apache 目录下的modules目录
然后用文本编辑器打开apache 目录下的conf目录里面的httpd.conf
最上面加入一下文本
LoadModule test_module "C:/Program Files/Apache Group/Apache/modules/test.dll"
<Location /test〉
SetHandler test-Handler
</Location〉
如果httpd.conf 里面的ClearModuleList 前面没有# 的话,一定要加上!!!!
现在先stop apache server,然后再start apache server
在IE 里面输入http://localhost/test
怎样出来了吗?
浏览器里面是不是显示
今天是2001年10月30日 星期二 欢迎你访问delphi窑洞!
如果你看到这样的话,那么你成功了!
还算简单吧!
下一步,显示一个静态网页,先输入以下的网页代码到一个html文件里面
<head〉
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"〉
</head〉
<title〉delphi窑洞</title〉
<style type="text/css"〉
<!-- td { font-family: "宋体"; font-size: 9pt}
body { font-family: "宋体"; font-size: 9pt}
select { font-family: "宋体"; font-size: 9pt}
a.news {color:#ff0033;text-decoration:none}
a.news:hover {color:#000000;text-decoration:underline}
A {text-decoration: none; color: navy; font-family: "宋体"; font-size: 9pt}
A:hover {text-decoration: none; color: red; font-family: "宋体"; font-size: 9pt;}
.white {color: white}
.silver {color: silver}
.ourfont {font-size: 9pt ; line-height:9pt; }
--〉
</style〉
<script〉
<!-- Beginning of JavaScript Applet -------------------
function scrollit_r2l(seed)
{ var m1 = "欢 迎 访 问 delphi 窑 洞" ;
var m2 =" ";
var msg=m1+m2;
var out = " ";
var c = 1;
if (seed 〉 100)
{ seed-=2;
var cmd="scrollit_r2l(" + seed + ")";
timerTwo=window.setTimeout(cmd,200);}
else if (seed <= 100 && seed 〉 0)
{ for (c=0 ; c < seed ; c++)
{ out+=" ";}
out+=msg; seed-=2;
var cmd="scrollit_r2l(" + seed + ")";
window.status=out;
timerTwo=window.setTimeout(cmd,200); }
else if (seed <= 0)
{ if (-seed < msg.length)
{
out+=msg.substring(-seed,msg.length);
seed-=2;
var cmd="scrollit_r2l(" + seed + ")";
window.status=out;
timerTwo=window.setTimeout(cmd,200);}
else { window.status=" ";
timerTwo=window.setTimeout("scrollit_r2l(100)",75);
}
}
}
// -- End of JavaScript code --〉
</script〉
<body topmargin="0" leftmargin="0" bgcolor="#F1FEFE" bgproperties="fixed" onload="timerONE=window.setTimeout('scrollit_r2l(100)',500);"〉
<table width="100%" valign="top" cellspacing="0" cellpadding="1" border=0〉
<tr valign="top" border=0 〉
<td height=96 align="center" 〉 <img src="http://www.51delphi.com/logo.jpg" border=0 〉 </td〉
</tr〉
<tr height=16〉
<td width="100%" 〉
<#date〉
</td〉
</tr〉
<tr〉
<td width="100%"〉
<table width="100%" valign="top" border="0" 〉
<td width="7" valign="left" bgcolor="#FFCF60"〉<img src="http://www.51delphi.com/topleft.gif" width="7" height="7" border=0 〉</td〉
<td valign="bottom" bgcolor="#FFCF60" align="center" class="L17"〉
<a href="http://www.51delphi.com" class="title"〉&nbsp;&nbsp;首页&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/soft.asp" class="title"〉&nbsp;&nbsp;软件下载&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/book.asp" class="title"〉&nbsp;&nbsp;技术资料&nbsp;&nbsp;</a〉<font color="#FFFFFF" class="L"〉|</font〉
<a href="http://www.51delphi.com/chat.asp" class="title"〉&nbsp;&nbsp;交流天地&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/link.asp" class="title"〉&nbsp;&nbsp;网络资源&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/tl.asp" class="title"〉&nbsp;&nbsp;技术论坛&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/ly.asp" class="title"〉&nbsp;&nbsp;给我留言&nbsp;&nbsp;</a〉
</td〉
<td valign="top" align="right" bgcolor="#FFCF60" width="7"〉<img src="http://www.51delphi.com/topright.gif" width="7" height="7" border=0 〉</td〉
</table〉
</td〉
</tr〉
</table〉
取名为title.html,
回到delphi 里面,在wm 里面放置一个PageProducer控件,命名为title,
双击此控件,出现一下代码
procedure Twm.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings; var ReplaceText: String);
const
chweek:array [1..7]of string[2]=('日','一','二','三','四','五','六');
var
s:string;
yy,mm,dd:word;
begin
if tagstring='date' then
begin
decodedate(date,yy,mm,dd);
s:='今天是'+inttostr(yy)+'年'+inttostr(mm)+'月'+inttostr(dd)+'日';
s:=s+' 星期'+chweek[dayofweek(date)];
s:=s+'欢迎你访问delphi窑洞';
ReplaceText:=s;
end;
end;
改写Twm.wmindexAction过程为以下:
procedure Twm.wmindexAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
title.HTMLFile:=defpathname+'/title.html';
Response.content := title.Content;
end;
好!编译,stop apache and start apache!
在IE 里面输入http://localhost/test
OK! yeah!
其他的东西你可以用类似方法添加,现在就取决于你的网页设计能力了
今天就写到这里,下次写存取数据库的方法及动态网页!byebye!
=============================================================================
用delphi+Apache 开发动态网站(二)
-------创建数据库应用
时间过的真快,距离上次写Delphi+Apache 开发动态网站已经快一年了,Borland 的Delphi 7都发布快半年了,一直没有时间静下写文章,今天就写一下怎么创建数据库应用,其实网站的数据库和普通的客户端应用差不多,唯一的不同就是那些可视化控件不能再用了,虽然delphi 6 和7里面提供的websnap 功能比较强大,但是在实际应用中定制性太差,可控制的东西复杂,因此本文还是以web broker 为例。
一般的网页都是以上、中、下来设计的,即上面是基本固定的LOGO 和联接部分,中间是内容部分,下面是版权等基本信息,因此我们可以把网页分成三部分,即上、中、下部分,由于上、下部分相对固定,我们就建立两个PageProducer1 元件与之相对应,中间的部分再根据情况动态设定。
我们以delphi 7 和 apache 2.0.43 和 Interbase为例,delphi7 不支持 Apache 2.0.43 ,具体解决办法请看我的文章使Delphi 6 支持Apache 2.0( http://www.51delphi.com/delphi/showwz?id=11)。
首先建立web server 应用程序。如图一,
这样就建立起一个Apache 2.x 的 DSO 模块,放置dbexpress 数据库联接和访问控件和PageProducer 元件,如图二,
并保证 Dbexpress 控件可以正常访问数据库,具体访问方式超出本文章范围,这里不再详细讨论。在Apache 2 的主目录(一般为htdocs目录)建立一下两个文件,title.html,foot.html.
title.html:
<#getalluser>
<BODY topmargin="0" leftmargin="0" >
<table align="center" border="0" width="90%" cellSpacing="1" cellPadding="1" >
<td align="left" width="20%" >
<a href="http://www.51delphi.com"><img src="/image/logo.jpg" border=0></a>
</td>
<td align="left">
<table width="100%" height=20 align="left">
<form method="POST" action="/delphi/login<#wz>" >
<td bgColor="#FEFDED" align="center">
<FONT class="pt9">用户名<input text name="user" class="edit" size=12>
密码<input type=password name="pass" class="edit" size=12 >
<input type =submit value="登陆" class="bt" ></font></td>
<td bgColor="#FEFDED" align="center">
<FONT class="pt9"><a href="/delphi/userreg" target="_blank"> 注册新用户</font>
</td>
<td bgColor="#FEFDED" align="center">
<FONT class="pt9">
<#username>
</font>
</td>
</form>
</table>
</td>
</table>
<table align="center" border="0" width="90%" cellspacing="0" cellpadding="0">
<td align="left" bgcolor="white"><a href="/delphi/fwtj"> <#alluser></a></td>
<td align="center" ><#date></td>
<td align="right" >当前人数:<#curuser></td>
</table>
</td>
</table>
<table align="center" border="0" width="95%" height=24 bgcolor="#FFCF60" cellSpacing="0" cellPadding="0" >
<td width="7" valign="left" bgcolor="#FFCF60"><img src="/topleft.gif" width="7" height="7"></td>
<td valign="bottom" bgcolor="#FFCF60" align="center" class="L17">
<a href="/delphi/" class="title">&nbsp;&nbsp;首页&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/soft" class="title">&nbsp;&nbsp;软件下载&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/book" class="title">&nbsp;&nbsp;技术资料&nbsp;&nbsp;</a><font color="#FFFFFF" class="L">|</font>
<a href="/delphi/jswz" class="title">&nbsp;&nbsp;技术文章&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/link" class="title">&nbsp;&nbsp;网络资源&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/jstl" class="title">&nbsp;&nbsp;技术论坛&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/ly" class="title">&nbsp;&nbsp;给我留言&nbsp;&nbsp;</a>
</td>
<td valign="top" align="right" bgcolor="#FFCF60" width="7"><img src="/topright.gif" width="7" height="7"></td>
</table>
foot.html:
<br>
<TABLE align="center" cellSpacing=1 cellPadding=1 width="95%" border=0>
<TBODY>
<TR>
<TD align=center bgcolor="#FFFFFF" colspan="3"><FONT class=pt9 color="#800000">谢谢光临</FONT></TD>
</TR>
<TR bgColor="#FFFFCC">
<TD align=middle ><A
href="/delphi/ly"><font class="pt9" color="#0000FF">给我留言</font></A></TD>
<TD align=middle ><A href="/"><font class="pt9" color="#0000FF">返回主页</font></A></TD>
<TD align=middle ><A href="mailto:xalion@51delphi.com"><font class="pt9" color="#0000FF">给我写信</font></A></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=1 cellPadding=1 width="100%" border=0 height="20">
<TBODY>
<TR>
<TD align=middle height="1"><FONT class=pt9>1999-2001 delphi 窑洞
copyright</FONT></TD></TR>
<TR>
<TD align=middle height="14">窑洞洞主:xalion&nbsp;&nbsp;&nbsp;&nbsp; <FONT class=pt9>合作伙伴:<A
href="mailto:richard@51delphi.com">阿土</A></FONT></TD></TR>
</TBODY></TABLE>
</BODY></HTML>
好,开始我们的程序之旅:
系统常量:
const
chweek:array [1..7]of string[2]=('日','一','二','三','四','五','六');
defpathname:string='d:/Apache Group/Apache2/htdocs';
defsoftpath:string='ftp://202.117.213.5/file/';
defbookpath:string='ftp://202.117.213.5/book/';
gridhead:string=' <table width="100%" border="0" cellspacing="1" cellpadding="1" bgColor="#609000">';
gridheadline:string=' <tr bgcolor="#ffffcc">';
gridline:string=' <tr bgcolor="#fefded">';
gridtdhead:string=' <td ><font class=pt9>';
gridtdheadnowrap:string=' <td nowrap><font class=pt9>';
gridtdend:string=' </font></td>';
webModule 的建立事件:
procedure Twm.WebModuleCreate(Sender: TObject);
var
fconfig:Tinifile;
bbsopen:string;
fnamechar;
path:string;
begin
getmem(fname,256);
GetModuleFileName( 0,fname,256);
path:=ExtractFilePath(fname);
Freemem(fname);
看是否有设置文件
fconfig:=Tinifile.create(path+'51delphi.ini'); //in folder
pathname:=fconfig.readstring('PATH','HTMLROOT',defpathname);
softpath:=fconfig.readstring('PATH','SOFTPATH',defsoftpath);
bookpath:=fconfig.readstring('PATH','BOOKPATH',defbookpath);
// defpathname);
fconfig.Free;
title.HTMLFile:=pathname+'/title.html';
foot.HTMLFile:=pathname+'/foot.html';
center.HTMLFile:=pathname+'/center.html';
bookpage.HTMLFile:=pathname+'/book.html';
end;
在title 的onhtmltag 事件写:
var
yy,mm,dd:word;
s,img,rc:string;
i:integer;
sip:string;
allnum:integer;
begin
// 加入IP 计数
if tagstring='getalluser' then
begin
sip:=request.RemoteAddr; //浏览器地址
with cx do
begin
sql.Clear;
SQL.Add('select max(id)+1 AS NUM from ip '); //取最大IP 值
OPen;
allnum:=fields[0].asinteger;
sql.Clear;
SQL.Add('select max(iptime) as iptime from ip where ip='''+sip+''''); // 是否访问过本站
OPen;
if Isempty then
//没有访问过本站
begin
SQL.Clear;
SQL.Add('INSERT INTO IP (ID,IP ,IPTIME ,IPTYPE ) VALUES 1,:2, CURRENT_TIMESTAMP, :3)');
Params[0].AsInteger:=allnum;
Params[1].AsString:=sip;
Params[2].asstring:=request.UserAgent;
try
ExecSQL; //写入访问时间
except
exit;
end;
end
else
begin
//访问过本站
if (now-fields[0].asdatetime)>(1/12) then
//是否两小时内访问过
begin
SQL.Clear;
SQL.Add('INSERT INTO IP (ID,IP ,IPTIME ,IPTYPE ) VALUES 1,:2,CURRENT_TIMESTAMP, :3)');
Params[0].AsInteger:=allnum;
Params[1].asstring:=sip;
Params[2].asstring:=request.UserAgent;
try
ExecSQL;
except
exit;
end;
end;
end;
end;
ReplaceText:=''; //仅仅是计数,不返回结果
end;
if tagstring='curuser' then //显示当前五分钟内在线用户
begin
with cx do
begin
SQL.Clear;
SQL.Add(' select count(*) as num from IP');
SQL.Add(' where (CURRENT_TIMESTAMP-iptime)<0.005');
Open;
ReplaceText:=fields[0].AsString;
end;
end;
if tagstring='date' then
begin
decodedate(date,yy,mm,dd);
s:='<font color="blue">';
s:=s+'今天是'+inttostr(yy)+'年'+inttostr(mm)+'月'+inttostr(dd)+'日';
s:=s+' 星期'+chweek[dayofweek(date)];
s:=s+'</font>';
ReplaceText:=s;
end;
if tagstring='alluser' then //显示访问人次
begin
s:='';
with cx do
begin
SQL.Clear;
SQL.Add('select * from ALLUSER');
Open;
allnum:=fields[0].AsInteger;
SQL.clear;
sql.Add('select max(ID) from IP');
open;
rc:=inttostr(fields[0].asinteger+allnum);
end;
img:='';
if length(rc)<7 then
begin
for i:=1 to (7-length(rc)) do
rc:='0'+rc;
end;
for i:=1 to length(rc) do
img:=img+'<img src ="/image/'+rc+'.gif" border=0>';
s:=s+img;
ReplaceText:=s;
end;
end;
建立显示技术资料事件(http://www.51delphi.com/delphi/book)
在webmodule 里面建立一个action ,name为book,pathinfo 为/book.
建立action 事件:
procedure Twm.wmbookAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
Response.content:=title.Content+bookpage.Content+foot.Content;
end;
建立book.html
book.html:
<title>delphi 窑洞------技术资料</title>
<table align="center" width="95%">
<td>页数:<#bookpage></td>
</table>
<table align="center" cellspacing="2" cellpadding="2" border="0" width="95%" >
<TR align=left vAlign=top>
<TD align=left background="/image/shadow.gif"
width=5>&nbsp;</TD>
<td font class="pt9">
<#showbook>
</td></TR>
</table>
在 web module 里面放置一个PageProdure , name为 book,
在book 的onhtmltag 里面写以下事件:
procedure Twm.bookpageHTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings; var ReplaceText: String);
const
showcount=25;
var
no:integer;
s:string;
where:string;
stype:string;
begin
if request.QueryFields.Values['no']='' then
no:=1
else
begin
s:=request.QueryFields.Values['no'];
try
no:=strtoint(s);
except
no:=1;
end;
if no<1 then no:=1;
end;
if TagString='bookpage' then
begin
with cx do
begin
SQL.Clear;
SQL.Add('select count(*) from BOOK');
SQL.Add(where);
Open;
ReplaceText:=showpage(fields[0].asinteger,showcount,no,'&type='+stype);
end;
end;
if TagString='showbook' then
begin
ReplaceText:=showbook(showcount,no-1,where)
end;
end;
里面用了一个showpage 函数,该函数为
function Twm.showpage(allnum, showcount, no:integer;stype:string): string;
var
lt:integer;
ys:integer;
i,start:integer;
s:string;
begin
start:=(no-1)*showcount;
lt:=allnum mod showcount;
ys:= allnum div showcount;
if lt<>0 then
ys:=ys+1;
s:='';
for i:=1 to ys do
begin
if i<>(start div showcount+1) then
s:=s+' <a href="/delphi'+request.Pathinfo+'?no='+inttostr(i)+stype+'">['+inttostr(i)+']</a>'
else
s:=s+' <font color=red><b>'+inttostr(i)+'</b></font>';
end;
result:=s;
end;
里面用了一个showbook 函数,该函数为
function Twm.showbook(showcount, no: integer;where:string): string;
var
s:string;
wz:integer;
news,jys:string;
begin
with cx do
begin
SQL.Clear;
SQL.Add('select num,name,indate,stype,dnum,jy,fsize from book');
SQL.Add(where);
SQL.Add('order by indate desc');
Open;
s:=gridhead+gridheadline;
s:=s+gridtdhead+'日期'+gridtdend;
s:=s+gridtdhead+'名称'+gridtdend;
s:=s+gridtdhead+'类别'+gridtdend;
s:=s+gridtdhead+'推荐度'+gridtdend;
s:=s+gridtdhead+'大小'+gridtdend;
s:=s+gridtdhead+'下载'+gridtdend;
s:=s+' </tr>';
wz:=0;
while ((wz<showcount) and (not eof)) do
begin
news:='';
if (now-fieldbyname('indate').AsDateTime)<3 then
news:='<img src="/image/new9.gif">';
jys:='<img src="/image/hx.gif"><img src="/image/hx.gif">';
if fieldbyname('jy').AsInteger>=80 then
jys:=jys+'<img src="/image/hx.gif">';
if fieldbyname('jy').AsInteger>=85 then
jys:=jys+'<img src="/image/hx.gif">';
if fieldbyname('jy').AsInteger>=90 then
jys:=jys+'<img src="/image/hx.gif">';
s:=s+gridline;
s:=s+gridtdhead+fieldbyname('indate').asstring+gridtdend;
s:=s+gridtdhead+'<font color="#0000ff">'+news+fieldbyname('name').asstring+'</font>'+gridtdend;
s:=s+gridtdhead+fieldbyname('stype').asstring+gridtdend;
s:=s+gridtdhead+jys+gridtdend;
s:=s+gridtdhead+fieldbyname('FSIZE').asstring+gridtdend;
if getsession('delphiuser')<>'' then
s:=s+gridtdhead+'<font color="blue">'+fieldbyname('dnum').asstring+'</font>'
+'<a href="/delphi/downbook?num='+fieldbyname('num').asstring+ '"><img src="/image/download.gif" border=0> </a> '+gridtdend
else
s:=s+gridtdhead+'<font color="blue">'+fieldbyname('dnum').asstring+'</font>'+gridtdend;
s:=s+' </tr>';
next;
wz:=wz+1;
end;
s:=s+' </table>';
end;
result:=s;
end;
好了,编译该工程,然后加载生成的dll,就可以正确显示数据的内容了。
本篇文章具体介绍了web module 里面的数据库的读写以及显示,希望可以给大家一点帮助,
谢谢大家的阅读!
Xalion
2002-11-27
http://www.51delphi.com/delphi/showwz?id=3
http://www.51delphi.com/delphi/showwz?id=13
-------创建一个简单的网页
随着Internet 的飞速发展,动态网页的开发方法五花八门,有ASP,JSP,PHP,CGI等等,其中web server主要
集中在IIS,Apache等上,MS 的IIS 以其强大的功能吸引了很多的开发者,ASP 是IIS 上用的最多的网页开发
方法,可是ASP 对开发非MS 产品的数据库程序时,简直就是一场恶梦,同时IIS 的漏洞越来越多,系统管理员
每天都得注意最新的漏洞补丁,否则不是被黑客攻翻就是被病毒感染,最近的redcode,bluecode,nimda就是例子。
具有速度快,安全性好,跨平台而且是完全免费的apache http server吸引了越来越多的开发者,而borland 新推
出的delphi6 开始支持Apache,功能强大的delphi 和 快速安全的apache 是一对非常好的动态网站开发方式,而且
delphi6 的工程源码几乎不用动就可以用kylix 编译,并在lunix 下的apache 上运行,厉害吧,动手吧,让
我们开始做一个简单的网页吧!
1.环境设置
先从http://www.apache.org 上下载apache http server for windows 版,最新的版本是1.3.22,
然后安装到服务器上,调试阶段最好现在本机上安装,反正apache 支持win9x,安装完毕后,在IE里面输入
http://localhost,会正常显示apache 默认页,说明安装成功!
2.现在打开delphi6 ,点菜单file-new-other,在new页里面选web server aplication,出现下面图片
选择Apache shared Module(DLL),系统就会建立一个空的工程.把工程另存为test,unit1另存为wmp.pas.
delphi 就会生成以下的工程代码
library test;
uses
WebBroker,
ApacheApp,
wmp in 'wmp.pas' {WebModule1: TWebModule};
{$R *.res}
exports
apache_module name 'Project1_module';
begin
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
end.
把'Project1_module' 改为'test_module'
然后在applicaiotn.Initilize 后面加入一下代码(很重要),
ModuleName:='test_module';
ContentType:= 'test-handler';
以上是让apache 加载dll是用的,如果与apache 的配置不一样的话,是无法运行的.
然后设置WebModule1的name 为wm(这仅仅是为了以后编程简单^_^),
打开wm的actions,出现一个editing wm.actions窗口,点击add new,出现一个新的item,
设置其name 为index,pathinfo 为/index,default 为true,
然后到events 页双击onaction
code editor出现一下代码:
procedure Twm.wmindexAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
end;
加入一下代码
procedure Twm.wmindexAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
const
chweek:array [1..7]of string[2]=('日','一','二','三','四','五','六');
var
s:string;
yy,mm,dd:word;
begin
decodedate(date,yy,mm,dd);
s:='今天是'+inttostr(yy)+'年'+inttostr(mm)+'月'+inttostr(dd)+'日';
s:=s+' 星期'+chweek[dayofweek(date)];
s:=s+'</font〉 欢迎你访问delphi窑洞!';
Response.content := s;
end;
end;
OK! 编译,如果按F9 会出现错误!(因为它是个DLL呀!)
把编译出来的test.dll 拷到apache 目录下的modules目录
然后用文本编辑器打开apache 目录下的conf目录里面的httpd.conf
最上面加入一下文本
LoadModule test_module "C:/Program Files/Apache Group/Apache/modules/test.dll"
<Location /test〉
SetHandler test-Handler
</Location〉
如果httpd.conf 里面的ClearModuleList 前面没有# 的话,一定要加上!!!!
现在先stop apache server,然后再start apache server
在IE 里面输入http://localhost/test
怎样出来了吗?
浏览器里面是不是显示
今天是2001年10月30日 星期二 欢迎你访问delphi窑洞!
如果你看到这样的话,那么你成功了!
还算简单吧!
下一步,显示一个静态网页,先输入以下的网页代码到一个html文件里面
<head〉
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"〉
</head〉
<title〉delphi窑洞</title〉
<style type="text/css"〉
<!-- td { font-family: "宋体"; font-size: 9pt}
body { font-family: "宋体"; font-size: 9pt}
select { font-family: "宋体"; font-size: 9pt}
a.news {color:#ff0033;text-decoration:none}
a.news:hover {color:#000000;text-decoration:underline}
A {text-decoration: none; color: navy; font-family: "宋体"; font-size: 9pt}
A:hover {text-decoration: none; color: red; font-family: "宋体"; font-size: 9pt;}
.white {color: white}
.silver {color: silver}
.ourfont {font-size: 9pt ; line-height:9pt; }
--〉
</style〉
<script〉
<!-- Beginning of JavaScript Applet -------------------
function scrollit_r2l(seed)
{ var m1 = "欢 迎 访 问 delphi 窑 洞" ;
var m2 =" ";
var msg=m1+m2;
var out = " ";
var c = 1;
if (seed 〉 100)
{ seed-=2;
var cmd="scrollit_r2l(" + seed + ")";
timerTwo=window.setTimeout(cmd,200);}
else if (seed <= 100 && seed 〉 0)
{ for (c=0 ; c < seed ; c++)
{ out+=" ";}
out+=msg; seed-=2;
var cmd="scrollit_r2l(" + seed + ")";
window.status=out;
timerTwo=window.setTimeout(cmd,200); }
else if (seed <= 0)
{ if (-seed < msg.length)
{
out+=msg.substring(-seed,msg.length);
seed-=2;
var cmd="scrollit_r2l(" + seed + ")";
window.status=out;
timerTwo=window.setTimeout(cmd,200);}
else { window.status=" ";
timerTwo=window.setTimeout("scrollit_r2l(100)",75);
}
}
}
// -- End of JavaScript code --〉
</script〉
<body topmargin="0" leftmargin="0" bgcolor="#F1FEFE" bgproperties="fixed" onload="timerONE=window.setTimeout('scrollit_r2l(100)',500);"〉
<table width="100%" valign="top" cellspacing="0" cellpadding="1" border=0〉
<tr valign="top" border=0 〉
<td height=96 align="center" 〉 <img src="http://www.51delphi.com/logo.jpg" border=0 〉 </td〉
</tr〉
<tr height=16〉
<td width="100%" 〉
<#date〉
</td〉
</tr〉
<tr〉
<td width="100%"〉
<table width="100%" valign="top" border="0" 〉
<td width="7" valign="left" bgcolor="#FFCF60"〉<img src="http://www.51delphi.com/topleft.gif" width="7" height="7" border=0 〉</td〉
<td valign="bottom" bgcolor="#FFCF60" align="center" class="L17"〉
<a href="http://www.51delphi.com" class="title"〉&nbsp;&nbsp;首页&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/soft.asp" class="title"〉&nbsp;&nbsp;软件下载&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/book.asp" class="title"〉&nbsp;&nbsp;技术资料&nbsp;&nbsp;</a〉<font color="#FFFFFF" class="L"〉|</font〉
<a href="http://www.51delphi.com/chat.asp" class="title"〉&nbsp;&nbsp;交流天地&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/link.asp" class="title"〉&nbsp;&nbsp;网络资源&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/tl.asp" class="title"〉&nbsp;&nbsp;技术论坛&nbsp;&nbsp;</a〉<span class="L"〉|</span〉
<a href="http://www.51delphi.com/ly.asp" class="title"〉&nbsp;&nbsp;给我留言&nbsp;&nbsp;</a〉
</td〉
<td valign="top" align="right" bgcolor="#FFCF60" width="7"〉<img src="http://www.51delphi.com/topright.gif" width="7" height="7" border=0 〉</td〉
</table〉
</td〉
</tr〉
</table〉
取名为title.html,
回到delphi 里面,在wm 里面放置一个PageProducer控件,命名为title,
双击此控件,出现一下代码
procedure Twm.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings; var ReplaceText: String);
const
chweek:array [1..7]of string[2]=('日','一','二','三','四','五','六');
var
s:string;
yy,mm,dd:word;
begin
if tagstring='date' then
begin
decodedate(date,yy,mm,dd);
s:='今天是'+inttostr(yy)+'年'+inttostr(mm)+'月'+inttostr(dd)+'日';
s:=s+' 星期'+chweek[dayofweek(date)];
s:=s+'欢迎你访问delphi窑洞';
ReplaceText:=s;
end;
end;
改写Twm.wmindexAction过程为以下:
procedure Twm.wmindexAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
title.HTMLFile:=defpathname+'/title.html';
Response.content := title.Content;
end;
好!编译,stop apache and start apache!
在IE 里面输入http://localhost/test
OK! yeah!
其他的东西你可以用类似方法添加,现在就取决于你的网页设计能力了
今天就写到这里,下次写存取数据库的方法及动态网页!byebye!
=============================================================================
用delphi+Apache 开发动态网站(二)
-------创建数据库应用
时间过的真快,距离上次写Delphi+Apache 开发动态网站已经快一年了,Borland 的Delphi 7都发布快半年了,一直没有时间静下写文章,今天就写一下怎么创建数据库应用,其实网站的数据库和普通的客户端应用差不多,唯一的不同就是那些可视化控件不能再用了,虽然delphi 6 和7里面提供的websnap 功能比较强大,但是在实际应用中定制性太差,可控制的东西复杂,因此本文还是以web broker 为例。
一般的网页都是以上、中、下来设计的,即上面是基本固定的LOGO 和联接部分,中间是内容部分,下面是版权等基本信息,因此我们可以把网页分成三部分,即上、中、下部分,由于上、下部分相对固定,我们就建立两个PageProducer1 元件与之相对应,中间的部分再根据情况动态设定。
我们以delphi 7 和 apache 2.0.43 和 Interbase为例,delphi7 不支持 Apache 2.0.43 ,具体解决办法请看我的文章使Delphi 6 支持Apache 2.0( http://www.51delphi.com/delphi/showwz?id=11)。
首先建立web server 应用程序。如图一,
这样就建立起一个Apache 2.x 的 DSO 模块,放置dbexpress 数据库联接和访问控件和PageProducer 元件,如图二,
并保证 Dbexpress 控件可以正常访问数据库,具体访问方式超出本文章范围,这里不再详细讨论。在Apache 2 的主目录(一般为htdocs目录)建立一下两个文件,title.html,foot.html.
title.html:
<#getalluser>
<BODY topmargin="0" leftmargin="0" >
<table align="center" border="0" width="90%" cellSpacing="1" cellPadding="1" >
<td align="left" width="20%" >
<a href="http://www.51delphi.com"><img src="/image/logo.jpg" border=0></a>
</td>
<td align="left">
<table width="100%" height=20 align="left">
<form method="POST" action="/delphi/login<#wz>" >
<td bgColor="#FEFDED" align="center">
<FONT class="pt9">用户名<input text name="user" class="edit" size=12>
密码<input type=password name="pass" class="edit" size=12 >
<input type =submit value="登陆" class="bt" ></font></td>
<td bgColor="#FEFDED" align="center">
<FONT class="pt9"><a href="/delphi/userreg" target="_blank"> 注册新用户</font>
</td>
<td bgColor="#FEFDED" align="center">
<FONT class="pt9">
<#username>
</font>
</td>
</form>
</table>
</td>
</table>
<table align="center" border="0" width="90%" cellspacing="0" cellpadding="0">
<td align="left" bgcolor="white"><a href="/delphi/fwtj"> <#alluser></a></td>
<td align="center" ><#date></td>
<td align="right" >当前人数:<#curuser></td>
</table>
</td>
</table>
<table align="center" border="0" width="95%" height=24 bgcolor="#FFCF60" cellSpacing="0" cellPadding="0" >
<td width="7" valign="left" bgcolor="#FFCF60"><img src="/topleft.gif" width="7" height="7"></td>
<td valign="bottom" bgcolor="#FFCF60" align="center" class="L17">
<a href="/delphi/" class="title">&nbsp;&nbsp;首页&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/soft" class="title">&nbsp;&nbsp;软件下载&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/book" class="title">&nbsp;&nbsp;技术资料&nbsp;&nbsp;</a><font color="#FFFFFF" class="L">|</font>
<a href="/delphi/jswz" class="title">&nbsp;&nbsp;技术文章&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/link" class="title">&nbsp;&nbsp;网络资源&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/jstl" class="title">&nbsp;&nbsp;技术论坛&nbsp;&nbsp;</a><span class="L">|</span>
<a href="/delphi/ly" class="title">&nbsp;&nbsp;给我留言&nbsp;&nbsp;</a>
</td>
<td valign="top" align="right" bgcolor="#FFCF60" width="7"><img src="/topright.gif" width="7" height="7"></td>
</table>
foot.html:
<br>
<TABLE align="center" cellSpacing=1 cellPadding=1 width="95%" border=0>
<TBODY>
<TR>
<TD align=center bgcolor="#FFFFFF" colspan="3"><FONT class=pt9 color="#800000">谢谢光临</FONT></TD>
</TR>
<TR bgColor="#FFFFCC">
<TD align=middle ><A
href="/delphi/ly"><font class="pt9" color="#0000FF">给我留言</font></A></TD>
<TD align=middle ><A href="/"><font class="pt9" color="#0000FF">返回主页</font></A></TD>
<TD align=middle ><A href="mailto:xalion@51delphi.com"><font class="pt9" color="#0000FF">给我写信</font></A></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=1 cellPadding=1 width="100%" border=0 height="20">
<TBODY>
<TR>
<TD align=middle height="1"><FONT class=pt9>1999-2001 delphi 窑洞
copyright</FONT></TD></TR>
<TR>
<TD align=middle height="14">窑洞洞主:xalion&nbsp;&nbsp;&nbsp;&nbsp; <FONT class=pt9>合作伙伴:<A
href="mailto:richard@51delphi.com">阿土</A></FONT></TD></TR>
</TBODY></TABLE>
</BODY></HTML>
好,开始我们的程序之旅:
系统常量:
const
chweek:array [1..7]of string[2]=('日','一','二','三','四','五','六');
defpathname:string='d:/Apache Group/Apache2/htdocs';
defsoftpath:string='ftp://202.117.213.5/file/';
defbookpath:string='ftp://202.117.213.5/book/';
gridhead:string=' <table width="100%" border="0" cellspacing="1" cellpadding="1" bgColor="#609000">';
gridheadline:string=' <tr bgcolor="#ffffcc">';
gridline:string=' <tr bgcolor="#fefded">';
gridtdhead:string=' <td ><font class=pt9>';
gridtdheadnowrap:string=' <td nowrap><font class=pt9>';
gridtdend:string=' </font></td>';
webModule 的建立事件:
procedure Twm.WebModuleCreate(Sender: TObject);
var
fconfig:Tinifile;
bbsopen:string;
fnamechar;
path:string;
begin
getmem(fname,256);
GetModuleFileName( 0,fname,256);
path:=ExtractFilePath(fname);
Freemem(fname);
看是否有设置文件
fconfig:=Tinifile.create(path+'51delphi.ini'); //in folder
pathname:=fconfig.readstring('PATH','HTMLROOT',defpathname);
softpath:=fconfig.readstring('PATH','SOFTPATH',defsoftpath);
bookpath:=fconfig.readstring('PATH','BOOKPATH',defbookpath);
// defpathname);
fconfig.Free;
title.HTMLFile:=pathname+'/title.html';
foot.HTMLFile:=pathname+'/foot.html';
center.HTMLFile:=pathname+'/center.html';
bookpage.HTMLFile:=pathname+'/book.html';
end;
在title 的onhtmltag 事件写:
var
yy,mm,dd:word;
s,img,rc:string;
i:integer;
sip:string;
allnum:integer;
begin
// 加入IP 计数
if tagstring='getalluser' then
begin
sip:=request.RemoteAddr; //浏览器地址
with cx do
begin
sql.Clear;
SQL.Add('select max(id)+1 AS NUM from ip '); //取最大IP 值
OPen;
allnum:=fields[0].asinteger;
sql.Clear;
SQL.Add('select max(iptime) as iptime from ip where ip='''+sip+''''); // 是否访问过本站
OPen;
if Isempty then
//没有访问过本站
begin
SQL.Clear;
SQL.Add('INSERT INTO IP (ID,IP ,IPTIME ,IPTYPE ) VALUES 1,:2, CURRENT_TIMESTAMP, :3)');
Params[0].AsInteger:=allnum;
Params[1].AsString:=sip;
Params[2].asstring:=request.UserAgent;
try
ExecSQL; //写入访问时间
except
exit;
end;
end
else
begin
//访问过本站
if (now-fields[0].asdatetime)>(1/12) then
//是否两小时内访问过
begin
SQL.Clear;
SQL.Add('INSERT INTO IP (ID,IP ,IPTIME ,IPTYPE ) VALUES 1,:2,CURRENT_TIMESTAMP, :3)');
Params[0].AsInteger:=allnum;
Params[1].asstring:=sip;
Params[2].asstring:=request.UserAgent;
try
ExecSQL;
except
exit;
end;
end;
end;
end;
ReplaceText:=''; //仅仅是计数,不返回结果
end;
if tagstring='curuser' then //显示当前五分钟内在线用户
begin
with cx do
begin
SQL.Clear;
SQL.Add(' select count(*) as num from IP');
SQL.Add(' where (CURRENT_TIMESTAMP-iptime)<0.005');
Open;
ReplaceText:=fields[0].AsString;
end;
end;
if tagstring='date' then
begin
decodedate(date,yy,mm,dd);
s:='<font color="blue">';
s:=s+'今天是'+inttostr(yy)+'年'+inttostr(mm)+'月'+inttostr(dd)+'日';
s:=s+' 星期'+chweek[dayofweek(date)];
s:=s+'</font>';
ReplaceText:=s;
end;
if tagstring='alluser' then //显示访问人次
begin
s:='';
with cx do
begin
SQL.Clear;
SQL.Add('select * from ALLUSER');
Open;
allnum:=fields[0].AsInteger;
SQL.clear;
sql.Add('select max(ID) from IP');
open;
rc:=inttostr(fields[0].asinteger+allnum);
end;
img:='';
if length(rc)<7 then
begin
for i:=1 to (7-length(rc)) do
rc:='0'+rc;
end;
for i:=1 to length(rc) do
img:=img+'<img src ="/image/'+rc+'.gif" border=0>';
s:=s+img;
ReplaceText:=s;
end;
end;
建立显示技术资料事件(http://www.51delphi.com/delphi/book)
在webmodule 里面建立一个action ,name为book,pathinfo 为/book.
建立action 事件:
procedure Twm.wmbookAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
Response.content:=title.Content+bookpage.Content+foot.Content;
end;
建立book.html
book.html:
<title>delphi 窑洞------技术资料</title>
<table align="center" width="95%">
<td>页数:<#bookpage></td>
</table>
<table align="center" cellspacing="2" cellpadding="2" border="0" width="95%" >
<TR align=left vAlign=top>
<TD align=left background="/image/shadow.gif"
width=5>&nbsp;</TD>
<td font class="pt9">
<#showbook>
</td></TR>
</table>
在 web module 里面放置一个PageProdure , name为 book,
在book 的onhtmltag 里面写以下事件:
procedure Twm.bookpageHTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings; var ReplaceText: String);
const
showcount=25;
var
no:integer;
s:string;
where:string;
stype:string;
begin
if request.QueryFields.Values['no']='' then
no:=1
else
begin
s:=request.QueryFields.Values['no'];
try
no:=strtoint(s);
except
no:=1;
end;
if no<1 then no:=1;
end;
if TagString='bookpage' then
begin
with cx do
begin
SQL.Clear;
SQL.Add('select count(*) from BOOK');
SQL.Add(where);
Open;
ReplaceText:=showpage(fields[0].asinteger,showcount,no,'&type='+stype);
end;
end;
if TagString='showbook' then
begin
ReplaceText:=showbook(showcount,no-1,where)
end;
end;
里面用了一个showpage 函数,该函数为
function Twm.showpage(allnum, showcount, no:integer;stype:string): string;
var
lt:integer;
ys:integer;
i,start:integer;
s:string;
begin
start:=(no-1)*showcount;
lt:=allnum mod showcount;
ys:= allnum div showcount;
if lt<>0 then
ys:=ys+1;
s:='';
for i:=1 to ys do
begin
if i<>(start div showcount+1) then
s:=s+' <a href="/delphi'+request.Pathinfo+'?no='+inttostr(i)+stype+'">['+inttostr(i)+']</a>'
else
s:=s+' <font color=red><b>'+inttostr(i)+'</b></font>';
end;
result:=s;
end;
里面用了一个showbook 函数,该函数为
function Twm.showbook(showcount, no: integer;where:string): string;
var
s:string;
wz:integer;
news,jys:string;
begin
with cx do
begin
SQL.Clear;
SQL.Add('select num,name,indate,stype,dnum,jy,fsize from book');
SQL.Add(where);
SQL.Add('order by indate desc');
Open;
s:=gridhead+gridheadline;
s:=s+gridtdhead+'日期'+gridtdend;
s:=s+gridtdhead+'名称'+gridtdend;
s:=s+gridtdhead+'类别'+gridtdend;
s:=s+gridtdhead+'推荐度'+gridtdend;
s:=s+gridtdhead+'大小'+gridtdend;
s:=s+gridtdhead+'下载'+gridtdend;
s:=s+' </tr>';
wz:=0;
while ((wz<showcount) and (not eof)) do
begin
news:='';
if (now-fieldbyname('indate').AsDateTime)<3 then
news:='<img src="/image/new9.gif">';
jys:='<img src="/image/hx.gif"><img src="/image/hx.gif">';
if fieldbyname('jy').AsInteger>=80 then
jys:=jys+'<img src="/image/hx.gif">';
if fieldbyname('jy').AsInteger>=85 then
jys:=jys+'<img src="/image/hx.gif">';
if fieldbyname('jy').AsInteger>=90 then
jys:=jys+'<img src="/image/hx.gif">';
s:=s+gridline;
s:=s+gridtdhead+fieldbyname('indate').asstring+gridtdend;
s:=s+gridtdhead+'<font color="#0000ff">'+news+fieldbyname('name').asstring+'</font>'+gridtdend;
s:=s+gridtdhead+fieldbyname('stype').asstring+gridtdend;
s:=s+gridtdhead+jys+gridtdend;
s:=s+gridtdhead+fieldbyname('FSIZE').asstring+gridtdend;
if getsession('delphiuser')<>'' then
s:=s+gridtdhead+'<font color="blue">'+fieldbyname('dnum').asstring+'</font>'
+'<a href="/delphi/downbook?num='+fieldbyname('num').asstring+ '"><img src="/image/download.gif" border=0> </a> '+gridtdend
else
s:=s+gridtdhead+'<font color="blue">'+fieldbyname('dnum').asstring+'</font>'+gridtdend;
s:=s+' </tr>';
next;
wz:=wz+1;
end;
s:=s+' </table>';
end;
result:=s;
end;
好了,编译该工程,然后加载生成的dll,就可以正确显示数据的内容了。
本篇文章具体介绍了web module 里面的数据库的读写以及显示,希望可以给大家一点帮助,
谢谢大家的阅读!
Xalion
2002-11-27
http://www.51delphi.com/delphi/showwz?id=3
http://www.51delphi.com/delphi/showwz?id=13