主要特性
GoAhead Web Server,它是一个开源(商业许可)、简单、轻巧、功能强大、可以在多个平台运行的嵌入式Web Server。
GoAhead Web Server的主要特性有:
- 支持ASP
- 嵌入式的javascript
- 标准的CGI执行
- 内存中的CGI处理GoFroms
- 扩展的API
- 快速响应,每秒可处理超过50个请求
- 完全和标准兼容
- 如果不包含SSI,仅要求60K的内存;包含SSI,要求500K内存
- web页面可以存在ROM或文件系统中
- 支持多种操作系统,包括eCos 、LINUX 、LynxOS 、QNX 、VxWorks 、WinCE、
pSOS等
一、先介绍下goahead用来构建动态网页的两个重要的过程:
- ASP过程
- GoForms过程(从3.X版本开始更新为GoActions过程,简化了使用,但调用方法基本不变)
asp过程用于在网页中动态显示内容,而goforms过程用于响应用户输入,更新设置或执行特定动作。
- ASP过程
ASP最初用于IIS中,它是微软开发的生成动态Web页面的服务器端技术。现在已经被移植到包括GoAhead的各种平台中,使用ASP的网页的后缀一般为“.asp”。为了在Web页面中嵌入ASP脚本,只需使用特殊的标签“<%” 和 “%>”将脚本包裹起来。之所以使用ASP标签目的是为了向用户显示动态内容,例如系统进程信息等。因为动态内容实际上是在执行特定的C函数生成的,所以需要将web页面中的ASP标签与特定的C函数联系在一起。一般,整个过程大致可以分成以下三个步骤:
-
设计web页面,动态内容使用特定的asp过程名替代,也称其为一个占位符。
-
在某个.c文件中定义与asp过程对应的C函数
-
在main.c文件中的initWebs函数中使用websAspDefine注册asp过程
以清单1中的<% UpdateProcInfor(); %>标签为例,此标签的目的是为了显示系统当前正在运行的进程的信息。获取进程信息实际上是由位于ui.c中的UpdateProcInfo函数完成的,详见清单2,它负责获取系统进程信息,并格式化为HTML输出。清单3中的websAspDefine函数将<% UpdateProcInfor(); %>标签与UpdateProcInfo函数关联起来,这样当GoAhead解析home.asp页面遇到<% UpdateProcInfor(); %>标签时,控制权就会跳转到UpdateProcInfor()函数,在输出以HTML格式表示的进程信息后,控制权转交给GoAhead继续解析home.asp页面。
注意:asp过程必须符合原型:int AspProcName (int ejid, webs_t wp, int argc, chart_t **argv);
其中,ejid参数作为JavaScript解释器句柄可以用来调用JavaScript相关函数,例如ejGetVar和ejSetResult。wp参数作为浏览器连接的句柄,可以用来调用很多有用的GoAhead服务器函数,例如用来输出HTML语句的websWrite等。argc和argv包含传递给asp过程的实参的个数和内容。
//清单1:home.asp(省略了其它无关的部分,细节请参考附带源代码)
<html>
<head>
<% WriteMetaElement(); %>
</head>
…
<form action="/goform/UpdateConfig" method="post">
<input type="text" name="interval" value="" size="7" />
<input type="submit" name="ok" value="Update" />
<input type="reset" name="cancel" value="Reset" />
</form>
<% UpdateProcInfo(); %>
</html>
//清单2:ui.c
#include "ui.h"
#include "..\webs.h"
//以HTML格式输出系统当前进程信息
int UpdateProcInfo(int ejid, webs_t wp, int argc, char_t *argv)
{
return WriteProcPage(wp);
}
//根据用户输入改变刷新间隔时间设置
void UpdateConfig(webs_t wp, char_t *path, char_t *query)
{
int tmpInterval=_ttoi(websGetVar(wp, L"interval", L"-1"));
if(tmpInterval>3)
{
s_interval=tmpInterval;
}
websRedirect(wp, L"home.asp");
}
//清单3:main.c文件中的initWebs()函数
#include "ui.h"
//关联asp标签和C函数名字
websAspDefine(T("UpdateProcInfo"), UpdateProcInfo);
websAspDefine(T("WriteMetaElement"), WriteMetaElement);
//关联GoForms标签和C函数名字
websFormDefine(T("UpdateConfig"), UpdateConfig);
- GoForms过程
GoAhead实现了称为GoForms的标准的通用网关接口(CGI)处理用户提交的表单。与传统的CGI方法不同,GoForms过程不是为每个浏览器连接都创建一个新的进程,而是通过与GoAhead服务器共享地址空间,于是可以直接访问全部的请求上下文。GoForms处理器可以自动解析和访问所有的POST和查询数据,它也提供了一组API可以轻松访问CGI变量。
GoForms过程与ASP过程不同,它主要用来响应用户输入以更新系统设置或者执行特定的动作。在GoAhead中,GoForms实现为一个URL处理器,它会解释以"/goform"开始的URLs。紧跟着"goform"之后的字符串定义了表单名字和用户请求的细节。例如:“/goform/ UpdateConfig?interval=5”这个请求表示调用GoForms过程" UpdateConfig ",GoForms变量interval表示用户设置的新刷新间隔时间。GoAhead对ASP过程和GoForms过程的处理十分类似,只是GoForms过程通过websFormDefine函数调用进行关联,并且必须遵守原型“void GoFormsProcName(webs_t wp, char_t *path, char_t *query);”。完整的GoForms过程示例请参考列表1-3中的用来处理用户请求的UpdateConfig过程。