用vfp制作WEB网页(二)
实例教程
概览
这是一个计算机中级考试的成绩查询系统,可以通过姓名或者准考证号码查询出考试成绩,查询界面是这样的:
如果有结果返回,返回的结果将这样显示:
如果没有记录被查到,将显示这个页面:
代码分析
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 ateobject("vfpwebputertest")
response.write ox.search(CBool(request("cxxx")),CStr(request("cxnr")))
set ox=nothing
%>
这是用 VB Script 编写的 ASP 脚本程序,很简单。先是创建 COM 对象实例,这和 Visual FoxPro 里的 CreateObject() 是很像的:
set ateobject("vfpwebputertest")
创建了 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:\',.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 DA
TAPAGESIZE=10 bordercolorlight="#800000" bordercolordark="#808080" 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="Page()">></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 里把项目编译成为一个多线程的进程内组件;
asp 源代码
在 IIS 里建立一个虚拟目录:
这里,你也许要问:在本地目录 D:\myweb 里需要存在一些什么文件,我的 COM 是不是也要放在里面,还有我的数据库是不是也要存放在这个目录里?
我的回答是:COM 不必要存放在这个目录里,你可以把 COM 编译在任何目录里面,这样那些喜欢使用 WebZip 之类软件下载整个网站的人,就对我们的程序的核心没法子了,哈哈,多好
这里,数据源 hmhg.dbf 被存放在了 C:\ 的一个目录下面,这样是不是很安全?
在 IIS 的其他设置,使用默认值就行了!
说了半天,我把我机器上的目录安排给大家看一看:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。