Welcome

首页 / 软件开发 / VFP / 用vfp制作WEB网页(二)

用vfp制作WEB网页(二)2007-05-09 本站收集整理 实例教程

概览

这是一个计算机中级考试的成绩查询系统,可以通过姓名或者准考证号码查询出考试成绩,查询界面是这样的:

如果有结果返回,返回的结果将这样显示:

如果没有记录被查到,将显示这个页面:

代码分析

Index.htm

这是客户端浏览器上的查询界面,负责向 WEB 服务器发送请求。关键代码是:

<FORM name=search onsubmit="return validate_form()" action=search.asp method=post>

表示用 POST 方法调用名称为 search.asp 的ASP 页面。这里提交请求时,它会将客户端控件 cxxx 和 cxnr 的值一并传递到 WEB 服务器。其中 cxxx 表示查询的关键字:是按照姓名查询还是按照准考证查询;cxnr 表示查询内容,就是具体姓名或者准考证号码。

Search.asp

接着就是search.asp了,刚才客户端指明 WEB 服务器用 search.asp 来对应客户端的请求。所有代码,如下:

<%
set ox=server.createobject("vfpweb.computertest")
response.write ox.search(CBool(request("cxxx")),CStr(request("cxnr")))
set ox=nothing
%>

这是用 VB Script 编写的 ASP 脚本程序,很简单。先是创建 COM 对象实例,这和 Visual FoxPro 里的 CreateObject() 是很像的:

set ox=server.createobject("vfpweb.computertest")

创建了 COM 对象实例以后,就要调用它了。这时通过 ASP 的 Request 对象取得查询参数 cxxx 和 cxnr ,由于 VB Script 里仅有一种数据类型就是 Variant,为了保证 COM 通讯时,参数的数据类型不出错误,我们进行强制类型转换;调用 search 函数,并等待 search 函数返回 HTML 代码。最后将产生的 HTML 代码返回到客户端浏览器。

response.write ox.search(CBool(request("cxxx")),CStr(request("cxnr")))

Visual FoxPro 里 COM 组建的源代码

这里,我们分析一下核心的代码:

FUNCTION search(p1 as Boolean ,p2 as String ) as String
LOCAL cHtml as String

cHtml=""
TRY
IF p1
SELECT zkzh,xm,sfzh,dw,fs1,fs2,fs3,fs4,fs5,zfs from Hmhg WHERE zkzh=ALLTRIM(p2) INTO CURSOR Temp
ELSE
SELECT zkzh,xm,sfzh,dw,fs1,fs2,fs3,fs4,fs5,zfs from Hmhg WHERE xm like "%"+ALLTRIM(p2)+"%" INTO CURSOR Temp
ENDIF

IF _tally=0
cHtml=this.NoRecord()
ELSE
cHtml=this.GetResult()
ENDIF
CATCH TO oError
cHtml=this.ErrorResult()
strtofile("出错:"+oError.ErrorMessage+transform(datetime())+CL+CL,"c:log.txt",.t.)
ENDTRY

RETURN cHtml

ENDFUNC

根据不同的查询关键字,使用不同的查询语句。

如果没有查询到任何数据(查询结果 Cursor 的记录数目是0),就调用函数 NoRecord,并把 NoRecord 返回的HTML 描述返回给调用程序(这里是 ASP);

如果结果 Cursor 不存在,这说明查询时出现了错误。这时就调用函数 ErrorResult,并把 ErrorResult 返回的HTML 描述返回给调用程序(这里是 ASP);

如果查到了结果,就调用函数 GetResult ,由 GetResult 对查询结果 Cursor 进行配置,产生 HTML 描述返回给调用程序(这里是 ASP)。

这里有一点大家应该注意一下,NoRecord、GetResult、ErrorResult 函数都在声明时都使用了 Hidden 关键字,表示它们在类的外部是不可见的!

接着,我们再来分析一下函数 GetResult 的源代码:

HIDDEN FUNCTION GetResult() as String
LOCAL cResult,cXml as String
TEXT TO cResult TEXTMERGE noshow
<HTML>
<style>
<!--
.title { font-family: Verdana; font-size: 1em; color: #FF0000; letter-spacing: 1pt;
font-weight: bold; background-color: #C0C0C0 }
-->
</style>
<HEAD></HEAD>
<TITLE>计算机考试结果查询</TITLE>
<BODY>
<XML ID=xmlresult>
ENDTEXT

CURSORTOXML("temp","cXml",1,16,0,"")

cResult=cResult+cXml

TEXT TO cResult TEXTMERGE ADDITIVE NOSHOW
</XML>

<TABLE ID=tblresult DATASRC=#xmlresult DATAPAGESIZE=10 BORDER=2 CELLPADDING=2 DATAPAGESIZE=10 bordercolorlight="#800000" bordercolordark="#808080" style="border-collapse: collapse" bordercolor="#111111" cellspacing="1">
<THEAD>
<TR class="title">
<TH>准考证编号</TH>
<TH>姓名</TH>
<TH>身份证编号</TH>
<TH>单位</TH>
<TH>分数_1</TH>
<TH>分数_2</TH>
<TH>分数_3</TH>
<TH>分数_4</TH>
<TH>分数_5</TH>
<TH>总分</TH>
</TR>
</THEAD>

<TR>
<TD><DIV datafld="zkzh"></DIV></TD>
<TD><DIV datafld="xm"></DIV></TD>
<TD><DIV datafld="sfzh"></DIV></TD>
<TD><DIV datafld="dw"></DIV></TD>
<TD><DIV datafld="fs1"></DIV></TD>
<TD><DIV datafld="fs2"></DIV></TD>
<TD><DIV datafld="fs3"></DIV></TD>
<TD><DIV datafld="fs4"></DIV></TD>
<TD><DIV datafld="fs5"></DIV></TD>
<TD><DIV datafld="zfs"></DIV></TD>
</TR>

</TABLE>

<P>每页显示记录数:<INPUT TYPE=TEXT VALUE=10 STYLE="WIDTH:20"
ONBLUR="tblresult.dataPageSize=this.value;">
</p>
<BUTTON ID=first onclick="tblresult.firstPage()">&lt;&lt;</BUTTON>
<BUTTON ID=previous onclick="tblresult.previousPage()">&lt;</BUTTON>
<BUTTON ID=next onclick="tblresult.nextPage()">&gt;</BUTTON>
<BUTTON ID=last onclick="tblresult.lastPage()">&gt;&gt;</BUTTON>
</BOBY>
</HTML>
ENDTEXT
RETURN cResult
ENDFUNC

这里用 TEXT TO 命令把 TEXT TO cResult TEXTMERGE ADDITIVE NOSHOW .......ENDTEXT 当中的 HTML 描述方便的送入了内存变量 cResult 中。这一部分是 “死” 的 HTML 代码,它定义了返回的页面的框架、标题、样式表格,以及用于显示查询结果的表格的框架。

好了,进行到这里,就只差把查询结果数据转化成为 HTML 了。这里我只是用了两句代码就实现了:

CURSORTOXML("temp","cXml",1,16,0,"")
*把查询结果 Cursor 转换成为 XML 字符串,送入内存变量 cXml 中
cResult=cResult+cXml
*把查询结果与 HTML 框架描述拼接

小结

从客户端发送请求,到服务器端的响应,再到 COM 组件的调用和运作,最后返回客户端浏览器能够解析的 HTML 代码描述(这里我们的返回信息中,还包含了XML、DHTML 、CSS,所以不是所有的浏览器都能够解析这些东东,我想 IE 5.5 以上 应该没问题的。如果想返回的代码适合更多的浏览器,那就尽量返回标准的 HTML 代码)。

编译、发布COM

在 Visual FoxPro 里把项目编译成为一个多线程的进程内组件;

在 IIS 里建立一个虚拟目录:

这里,你也许要问:在本地目录 D:myweb 里需要存在一些什么文件,我的 COM 是不是也要放在里面,还有我的数据库是不是也要存放在这个目录里?

我的回答是:COM 不必要存放在这个目录里,你可以把 COM 编译在任何目录里面,这样那些喜欢使用 WebZip 之类软件下载整个网站的人,就对我们的程序的核心没法子了,哈哈,多好!!!

这里,数据源 hmhg.dbf 被存放在了 C: 的一个目录下面,这样是不是很安全?

在 IIS 的其他设置,使用 默认值就行了!

说了半天,我把我机器上的目录安排给大家看一看:

c:vfp_data 存放hmhg.dbf

d:vfpweb 存放 vfpweb.dll、vfpweb.tbl、vfpweb.vbr

d:myweb 是 IIS 的对应的本地目录。这里存放着,index.htm、search.asp,还有一些图片。

结束

终于写完了,我发现我的“吹牛”的水平真的很不错——没有做过任何 ASP 程序的我,竟然在这里大吹了一通用 ASP+COM 实现的 Web Server,大家如果觉得不满意,我也没办法了,技尽于此……

我想,作为一个优秀的 WEB 开发人员,应该是个通才(除非你所在的公司很大,分工明确)——既要会 ASP 编程,也要懂得网页制作,最好还会组件开发。总之,不会开发组件的 WEB 程序员,只是脚本语言的程序员;当然会组件开发的程序员,像我这样,只是一个 Visual FoxPro 程序员,离开 Web 程序员,还有好长的距离……