用delphi+Apache 开发动态网站(二)

简介: -------创建数据库应用 时间过的真快,距离上次写Delphi+Apache 开发动态网站已经快一年了,Borland 的Delphi 7都发布快半年了,一直没有时间静下写文章,今天就写一下怎么创建数据库应用,其实网站的数据库和普通的客户端应用差不多,唯一的不同就是那些可视化控件不能再用了,虽然delphi 6 和7里面提供的websnap 功能比较强大,但是在实际应用中定制性太差,可控制的东西复杂,因此本文还是以web broker 为例。

 -------创建数据库应用

时间过的真快,距离上次写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。首先建立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;

   fname:pchar;

   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[i]+'.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

目录
相关文章
|
5月前
|
Apache 数据库
杨校老师课堂之基于Apache的数据库连接池DBCP的工具类开发
杨校老师课堂之基于Apache的数据库连接池DBCP的工具类开发
25 0
|
3月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
当今社会,物联网技术的发展带来了许多繁琐的挑战,尤其是在数据库管理系统领域,比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如,应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计,未来5年,物联网设备的数量将达数万亿。物联网产生大量的数据,包括流数据、时间序列数据、RFID数据、传感数据等。要有效地管理这些数据,就需要使用数据库。数据库在充分处理物联网数据方面扮演着非常重要的角色。因此,适当的数据库与适当的平台同等重要。由于物联网在世界上不同的环境中运行,选择合适的数据库变得非常重要。 原创文字,IoTDB 社区可进行使用与传播 一、什么是IoTDB 我
160 9
Apache IoTDB进行IoT相关开发实践
|
3月前
|
Java 持续交付 项目管理
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。它采用项目对象模型(POM)来描述项目,简化构建流程。Maven提供依赖管理、标准构建生命周期、插件扩展等功能,支持多模块项目及版本控制。在Java Web开发中,Maven能够自动生成项目结构、管理依赖、自动化构建流程并运行多种插件任务,如代码质量检查和单元测试。遵循Maven的最佳实践,结合持续集成工具,可以显著提升开发效率和项目质量。
49 1
|
3月前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
43 0
|
4月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
IoTDB是专为物联网(IoT)设计的开源时间序列数据库,提供数据收集、存储、管理和分析。它支持高效的数据写入、查询,适用于处理大规模物联网数据,包括流数据、时间序列等。IoTDB采用轻量级架构,可与Hadoop和Spark集成,支持多种存储策略,确保数据安全和高可用性。此外,它还具有InfluxDB协议适配器,允许无缝迁移和兼容InfluxDB的API和查询语法,简化物联网项目的数据管理。随着物联网设备数量的快速增长,选择适合的数据库如IoTDB对于数据管理和分析至关重要。
238 12
|
4月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
The article introduces IoTDB, an open-source time-series database designed for efficient management of IoT-generated data. It addresses challenges like real-time integration of massive datasets and security. IoTDB supports high-performance storage,
135 0
Apache IoTDB进行IoT相关开发实践
|
5月前
|
存储 Apache 文件存储
在Apache环境下为Web网站增设访问控制:实战指南
在Apache服务器上保护网站资源涉及启用访问控制模块(`mod_authz_core`和`mod_auth_basic`),在`.htaccess`或`httpd.conf`中设定权限,如限制对特定目录的访问。创建`.htpasswd`文件存储用户名和密码,并使用`htpasswd`工具管理用户。完成配置后重启Apache服务,访问受限目录时需提供有效的用户名和密码。对于高安全性需求,可考虑更复杂的认证方法。【6月更文挑战第20天】
264 4
|
5月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
IoTDB是面向物联网的时序数据库,专注于时间序列数据管理,提供高效的数据处理、集成Hadoop和Spark生态、支持多目录存储策略。它还具有InfluxDB协议适配器,允许无缝迁移原本使用InfluxDB的业务。文章讨论了IoTDB的体系结构,包括数据文件、系统文件和预写日志文件的存储策略,并介绍了如何配置数据存储目录。此外,还提及了InfluxDB版本和查询语法的支持情况。IoTDB在物联网数据管理和分析中扮演关键角色,尤其适合处理大规模实时数据。
|
5月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
物联网技术带来数据库管理挑战,特别是实时数据整合与安全性。IoTDB是一个专为时间序列数据设计的数据库,提供数据收集、存储和分析服务,适用于海量物联网数据。其架构包括数据文件、系统文件和预写日志文件的管理,并支持多目录存储策略。此外,IoTDB还开发了InfluxDB协议适配器,使得用户能无缝迁移原有InfluxDB业务。此适配器基于IoTDB的Java服务接口,转换InfluxDB的元数据格式,实现与IoTDB的数据交互。目前,适配器支持InfluxDB 1.x版本及部分查询语法。
180 5
|
4月前
|
安全 Java Apache
如何安装与使用Spring Boot 2.2.x、Spring Framework 5.2.x与Apache Shiro 1.7进行高效开发
【7月更文第1天】在现代Java Web开发领域,Spring Boot以其简化配置、快速开发的特点备受青睐。结合Spring Framework的成熟与Apache Shiro的强大权限控制能力,我们可以轻松构建安全且高效的Web应用。本篇文章将指导你如何安装并使用Spring Boot 2.2.x、Spring Framework 5.2.x以及Apache Shiro 1.7来构建一个具备基础权限管理功能的项目。
76 0

推荐镜像

更多