用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()"><<</BUTTON>
<BUTTON ID=previous onclick="tblresult.previousPage()"><</BUTTON>
<BUTTON ID=next onclick="tblresult.nextPage()">></BUTTON>
<BUTTON ID=last onclick="tblresult.lastPage()">>></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.dbfd:vfpweb 存放 vfpweb.dll、vfpweb.tbl、vfpweb.vbrd:myweb 是 IIS 的对应的本地目录。这里存放着,index.htm、search.asp,还有一些图片。结束终于写完了,我发现我的“吹牛”的水平真的很不错——没有做过任何 ASP 程序的我,竟然在这里大吹了一通用 ASP+COM 实现的 Web Server,大家如果觉得不满意,我也没办法了,技尽于此……我想,作为一个优秀的 WEB 开发人员,应该是个通才(除非你所在的公司很大,分工明确)——既要会 ASP 编程,也要懂得网页制作,最好还会组件开发。总之,不会开发组件的 WEB 程序员,只是脚本语言的程序员;当然会组件开发的程序员,像我这样,只是一个 Visual FoxPro 程序员,离开 Web 程序员,还有好长的距离……