![]() |
#2
easyppt昨晚 22:19
|
搜遍了网络,楞是没有找到一篇教我们如何用vfp编写的web应用的文章,有的都是让我们如何应用,如foxweb,foxpage等,人家已经写好了的。为此也搜索了很多其他语言的cgi编程的文章,期望能有所启发。。。为此,我还特地反编译了上面那三个foxpro编写的web程序,尝试去读懂它的源代码,以便理解它的深层逻辑。
好在,有了deepseek,网上搜不到的资料,可以问它,渐渐地我大概地了解了Web开发的原理,好像我觉得我又行了

下面,我就讲讲我的理解:
foxweb的脚本后缀是.fwx;foxpage的脚本后缀是.fps;vfpweb的脚本后缀也是.fwx;php的脚本后缀是.php;asp的脚本后缀是.asp。
我们以foxweb为例,来掰扯掰扯它的工作原理,这个我比较熟悉,其他几种原理都一样。
当我们在浏览器中输入:http://localhost/,IIS服务器会搜索index.fwx,index.php,index.asp,或index.html 我的服务器支持这三种脚本,IIS会按顺序搜索,正常是默认的是html,当然这个顺序是可以改变的。
当然直接输入http://localhost/index.fwx更好,直接。
服务器会把index.fwx发送给foxweb处理,这个就叫脚本映射,就是所有后缀名是.fwx的文件,IIS都会发给foxweb,此时的foxweb.exe就是我们常说的模块映射,就是CGI程序。foxweb把服务器发过来的fwx脚本翻译成html文件再返回给服务器,这样就在浏览器中可以查看了。
光这样说可能不太好理解,要是能举个例子就好了,能加深我们的理解,这时就可以求助deepseek了,让它给我生成一段示例代码。
假设我用foxpro编写了一个cgi程序control.exe,作为 IIS 模块映射处理 FPX 脚本;我们的自定义脚本的后缀名是fpx,那么请求处理流程如下:
1,用户请求 example.fpx
2,IIS 识别 .fpx 扩展名并调用 control.exe
3,control.exe 接收请求参数和脚本路径
4,control.exe 执行 FoxPro 脚本
5,FoxPro 脚本生成 HTML 输出
6,control.exe 将 HTML 返回给 IIS
7,IIS 将 HTML 发送给客户端浏览器
编写example.fpx内容:

* example.fpx [color=#808080]- FoxPro 脚本生成 HTML[/color]
* 设置响应头
Response = [HTTP/1.1 200 OK] + chr(13) + chr(10) + ;
[Content-Type: text/html] + chr(13) + chr(10) + chr(13) + chr(10)
* HTML 内容
html = [<html>]
html = html + [<head><title>FoxPro FPX 示例</title></head>]
html = html + [<body>]
html = html + [<h1>欢迎来到 FoxPro Web 脚本</h1>]
* 动态内容 [color=#808080]- 当前日期时间[/color]
html = html + [<p>当前服务器时间: ] + dtoc(date()) + [ ] + time() + [</p>]
* 从查询字符串获取参数
cName = GetEnv("QUERY_STRING") * 获取查询字符串
IF !EMPTY(cName)
* 简单解析查询字符串 (例如: ?name=John)
nPos = AT("=", cName)
IF nPos > 0
cValue = SUBSTR(cName, nPos+1)
html = html + [<p>你好, ] + cValue + [!</p>] &&有参数显示“你好,John!”
ENDIF
else
html = html + [<p>Hello World!</p>] &&如果没有提供参数显示“Hello World!”
ENDIF
html = html + [</body></html>]
* 输出结果
? Response + html
RETURN
假设我们已经完成IIS 配置:
添加 .fpx 扩展名映射到 control.exe
设置可执行路径为 control.exe 的完整路径
取消选中"验证文件存在"选项(因为 control.exe 会处理文件存在性)
浏览器中这样访问这个脚本:http://localhost/example.fpx?name=John 或http://yourserver/example.fpx
点击浏览器的查看源代码应该是如下所示:

HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head><title>FoxPro FPX 示例</title></head>
<body>
<h1>欢迎来到 FoxPro Web 脚本</h1>
<p>当前服务器时间: 04/25/2025 14:30:45</p>
<p>你好, John!</p>
</body>
</html>
然后最重要的就是,如何编写我们的control.exe了。
把下面这段代码编译为control.exe(代码deepseek生成的,没有验证,我只是举例让大家了解原理)

* control.exe 的主程序
LPARAMETERS tcScriptPath, tcQueryString
* 设置错误处理
ON ERROR DO ErrorHandler WITH ERROR(), MESSAGE(), LINENO()
* 获取环境变量(IIS传递的信息)
IF EMPTY(tcScriptPath)
tcScriptPath = GETENV("PATH_TRANSLATED")
ENDIF
IF EMPTY(tcQueryString)
tcQueryString = GETENV("QUERY_STRING")
ENDIF
* 验证脚本文件是否存在
IF !FILE(tcScriptPath)
? "HTTP/1.1 404 Not Found"
? "Content-Type: text/html"
?
? "<html><body><h1>404 Not Found</h1>"
? "<p>Requested script file not found: " + tcScriptPath + "</p>"
? "</body></html>"
RETURN
ENDIF
* 设置FoxPro环境
SET PROCEDURE TO
SET CLASSLIB TO
SET TALK OFF
SET SAFETY OFF
SET ESCAPE OFF
SET EXCLUSIVE OFF
SET STATUS BAR OFF
* 将查询字符串保存到内存变量
PUBLIC gcQueryString
gcQueryString = tcQueryString
* 执行脚本文件
DO (tcScriptPath)
RETURN
* 错误处理程序
PROCEDURE ErrorHandler(tnError, tcMessage, tnLineNo)
? "HTTP/1.1 500 Internal Server Error"
? "Content-Type: text/html"
?
? "<html><body><h1>500 Server Error</h1>"
? "<p>Error executing script: " + tcMessage + "</p>"
? "<p>Error #: " + TRANSFORM(tnError) + "</p>"
? "<p>Line: " + TRANSFORM(tnLineNo) + "</p>"
? "</body></html>"
* 记录错误到日志文件
STRTOFILE(DTOC(DATE()) + " " + TIME() + " - Error " + ;
TRANSFORM(tnError) + ": " + tcMessage + " (Line " + ;
TRANSFORM(tnLineNo) + ")" + CHR(13) + CHR(10), ;
"fpx_errors.log", .T.)
ENDPROC
通过我的分享,我想大家一定会有跃跃欲试的感觉的,赶快试试看吧。
后续我再根据反响,优化一下这个程序


