Keep looking Donot settle
分类: 嵌入式
2015-04-02 20:12:42
GoAHead的前端页面的实现有两种方式:
一种是所有的HTML代码全部由C语言实现。
另一种是一种类似于asp风格的方式,静态相关的网页由HTML编辑器实现,交互部分采用类似这种<%GetTermTime();%>宏的 方式实现。在客户端网页请求Goahead服务器网页的时候,GoAHead服务器网页浏览整个网页文件,看到这种宏,就用服务端的一段代码进行替换,最 后展现在客户端前面的页面就是替换过的网页文件。
综合比较了一下,还是选用了第二种。第一种方式C语言的体力活太多,而且非常不容易维护,扩展性也比较差,不具有通用性。
项目的交互主要分两个方面:
所谓的后台也就是goahead的c语言处理部分。
1.修改后缀名
在src/route.txt中 :
把 route uri=/
改成route uri=/ extensions=jst,html handler=jst
这样前端访问的网页就支持.jst和.html两种格式了,否则默认是.jst的格式。如果客户端访问GoAhead服务器上的html文件,GoAhead服务器在浏览页面的时候,是不会用服务器端的代码去替换宏的,也就是没办法去获取后台数据。
2.我们用来测试的页面叫做settime.jst,代码如下:
点击“获取终端时间”可查看终端时间,点击“获取本地时间”可得到当前系统时间 “设置终端时间”,用当前各输入框内的数据更新终端时间,即时生效
设置终端时间
settime.jst中的GetTermTime和formSetTermTime ,就对应下面http.c中新增的aspGetTermTime和formSetTermTime
2.http.c新增如下代码:
int aspGetTermTime(int eid,Webs *wp,int argc,char **argv)
{
time_t ti;
struct tm *timeinfo;
time(&ti);
timeinfo=localtime(&ti);
websWrite(wp,"
void formSetTermTime(Webs *wp,char *path,char *query)
{
char * ok;
bool bError = 0;
char sText[50];
struct tm *timeinfo;
time_t ti;
ti =time(NULL);
timeinfo=localtime(&ti);
a_assert(wp);
ok = websGetVar(wp,"year","");
websHeader(wp);
if(0==strcmp(ok,"取消"))
websWrite(wp,"取消");
else
{
ok = websGetVar(wp,"year","");
timeinfo->tm_year=atoi(ok)-1900;
ok = websGetVar(wp,"month","");
timeinfo->tm_mon=atoi(ok)-1;
ok = websGetVar(wp,"day","");
timeinfo->tm_mday=atoi(ok);
ok = websGetVar(wp,"hour","");
timeinfo->tm_hour=atoi(ok);
ok = websGetVar(wp,"minute","");
timeinfo->tm_min=atoi(ok);
ok = websGetVar(wp,"second","");
timeinfo->tm_sec=atoi(ok);
struct timeval tv;
struct timezone tz;
gettimeofday(&tv,&tz);
tv.tv_sec=mktime(timeinfo);
if(0!=settimeofday(&tv,&tz))
{
logmsg(2,"#####################settimeofday failed!");
}
else
SerialMain(0,"tang");
websFooter(wp);
websDone(wp);
logmsg(2,"#######%d %d/%d
%d:%d:%d",timeinfo->tm_year,timeinfo->tm_mon,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
}
以上的函数需要在websJstOpen中定义,如下所示
PUBLIC int websJstOpen()
{
websJstFunctions = hashCreate(WEBS_HASH_INIT * 2);
websDefineJst("write", websJstWrite);
websDefineJst("GetTermTime",aspGetTermTime);
websFormDefine("formSetTermTime",formSetTermTime);
websDefineHandler("jst", 0, jstHandler, closeJst, 0);
return 0;
}
备注:参考了http://blog.chinaunix.net/uid-23412956-id-4044201.html,看到两个写好的应答函数,一起拿过来用。
void websReportOK(webs_t wp, const char *url)
{
websHeader(wp);
websWrite(wp,(""), url);
websFooter(wp);
websSetStatus(wp, 200);
websDone(wp);
}
void websReportError(webs_t wp, const char *dsc, const char *url)
{
websHeader(wp);
websWrite(wp,(""), dsc);
websFooter(wp);
websSetStatus(wp, 200);
websDone(wp);
}
3.到目前为止,通过<%GetTermTime();%>得到服务端的数据,它对应的C函数是aspGetTermTime。
通过form的action="goform/formSetTermTime "实现将网页的数据提交到后台的formSetTermTime。正常情况下这时页面会跳转到goform/formSetTermTime 的页面。这是提交刷新的方式。
我这边要讲的是form提交但不刷新本页的方式。
方法如下,修改settime.jst文件:
">
.................................
" name="id_iframe" style="display:none;">
这在网页设计上叫提交到隐藏的iframe页面,实现form提交但不刷新的目的。
注意事项:iframe 的id与Form的target要一致。
iframe的style要设置成display:none
相关资料参考:可以百度一下以下关键字,不过这些GoAhead的版本都比3.4.3低,有些API的用法不太一样,大家看的时候可以选择性的看。
GoAhead webServer应用开发文档
GoAhead 3.4.3源码分析
GoAhead开发入门上篇
GoAhead开发入门下篇
from: http://3792615.blog.163.com/blog/static/778210942015294112202/ gfsoso: websDefineJst