| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 148 人关注过本帖
标题:foxpro web 开发原理
只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:886
专家分:1376
注 册:2021-10-13
结帖率:97.3%
收藏
已结贴  问题点数:20 回复次数:7 
foxpro web 开发原理
有没有人跟我一样好奇,foxweb,foxpage,vfpweb,php,asp 是如何工作的?可以把我们编写的脚本,转化成html发送给客户的?

搜遍了网络,楞是没有找到一篇教我们如何用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

通过我的分享,我想大家一定会有跃跃欲试的感觉的,赶快试试看吧。
后续我再根据反响,优化一下这个程序,给我顶上去,就继续。。。

5 天前 22:15
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:862
注 册:2021-11-24
收藏
得分:4 
好文,谢谢分享,期待更新!
5 天前 22:19
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1995
专家分:3961
注 册:2012-2-29
收藏
得分:4 
支持,继续哈
4 天前 07:07
kosung
Rank: 2
等 级:论坛游民
帖 子:21
专家分:26
注 册:2006-8-14
收藏
得分:4 
好文,期待更新
4 天前 16:42
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:330
专家分:776
注 册:2014-6-12
收藏
得分:4 
回复 楼主 sam_jiang
楼主费了不少心细,讲的非常好。对于只会VFP的VFPer来讲,搞web的难点在:1、iis服务器的配置;2、对html、js、css语言的空白
如果不简单学点儿html、js、css语言的话,前端手机端、web端是搞不好的

如果是简单web应用的话:

1、iis服务器的配置
简单现成的有 EasyWebSvr.exe(百度下载)。运行它,一个简易的“iis服务器”就有了

做个简易的“iis服务器”:Nginx + VFP FastCGI开发说明
https://blog.(这篇文章以前可以直接浏览,现在需要解锁了)

做个相对较好的“iis服务器”:https://bbs.bc-cn.net/viewthread.php?tid=509467&extra=&page=4(本论坛32楼下载,自己测试,加王子QQ群学习)

2、如果学习html、js、css比较困难的话,可以学习使用《篮茑中文编程》开发工具,它可以在不懂html、js、css的前提下,开发手机版app,通过它逐步了解html、js、css
上边本论坛链接31楼有篮茑开发的app界面效果
3 天前 18:59
sych
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:354
专家分:583
注 册:2019-10-11
收藏
得分:4 
谢谢分享,非常好的一篇文章
前天 09:09
trial03
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2025-1-20
收藏
得分:0 
以下是引用kangss在2025-4-27 18:59:49的发言:

楼主费了不少心细,讲的非常好。对于只会VFP的VFPer来讲,搞web的难点在:1、iis服务器的配置;2、对html、js、css语言的空白
如果不简单学点儿html、js、css语言的话,前端手机端、web端是搞不好的

如果是简单web应用的话:

1、iis服务器的配置
简单现成的有 EasyWebSvr.exe(百度下载)。运行它,一个简易的“iis服务器”就有了

做个简易的“iis服务器”:Nginx + VFP FastCGI开发说明
https://blog.(这篇文章以前可以直接浏览,现在需要解锁了)

做个相对较好的“iis服务器”:https://bbs.bc-cn.net/viewthread.php?tid=509467&extra=&page=4(本论坛32楼下载,自己测试,加王子QQ群学习)

2、如果学习html、js、css比较困难的话,可以学习使用《篮茑中文编程》开发工具,它可以在不懂html、js、css的前提下,开发手机版app,通过它逐步了解html、js、css
上边本论坛链接31楼有篮茑开发的app界面效果


学习了, 谢谢
昨天 09:02
trial03
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2025-1-20
收藏
得分:0 
谢谢桜主


以下是引用sam_jiang在2025-4-25 22:15:01的发言:

有没有人跟我一样好奇,foxweb,foxpage,vfpweb,php,asp 是如何工作的?可以把我们编写的脚本,转化成html发送给客户的?

搜遍了网络,楞是没有找到一篇教我们如何用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 - FoxPro 脚本生成 HTML

* 设置响应头
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>]

* 动态内容 - 当前日期时间
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

通过我的分享,我想大家一定会有跃跃欲试的感觉的,赶快试试看吧。
后续我再根据反响,优化一下这个程序,给我顶上去,就继续。。。

昨天 09:03
快速回复:foxpro web 开发原理
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040063 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved