goahead 移植与配置---fwqlzz love is for ever
2016-04-29 23:19
621 查看
- 基本步骤
1. 在官网下载最新的源码包
官网:http://embedthis.com/downloads/index.html
2. 解压并编译
# tar -zxvf goahead-3.1.3-0-src.tgz -C /usr/src
# cd /usr/src/goahead-3.1.3-0
# make CC=arm-arago-linux-gnueabi-gcc ARCH=arm
编译完成后会在 /usr/src/goahead-3.1.3-0/linux-arm-default/bin 生成可执行文件
3. 将bin目录下的可执行文件goahead,库文件libest.so、libgo.so拷贝到开发板
库文件可与goahead文件放在同一目录下,也可拷贝到 /usr/lib 目录下
但是,goahead移植没那么简单,此时直接运行goahead会有问题,下面将介绍如何逐一解决。
- 移植配置
问题一(运行错误):
goahead: 0: Can't get host address for host dvr: errno 110
goahead: 0: Can't initialize server. Exiting.
解决办法:修改 /usr/src/goahead-3.1.3-0/src/http.c
# vi src/http.c // 共有2处相同的代码需修改
=============================================================================
if ((hp = gethostbyname(host)) == NULL) {
error("Can't get host address for host %s: errno %d", host, errno);
return -1;
}
memcpy((char*) &intaddr, (char *) hp->h_addr_list[0], (size_t) hp->h_length);
ddr = inet_ntoa(intaddr);
websSetIpAddr(ipaddr);
websSetHost(ipaddr);
=============================================================================
改为:
=============================================================================
#if 0
if ((hp = gethostbyname(host)) == NULL) {
error("Can't get host address for host %s: errno %d", host, errno);
return -1;
}
memcpy((char*) &intaddr, (char *) hp->h_addr[0], (size_t) hp->h_length);
ipaddr = inet_ntoa(intaddr);
#else
int sockfd;
struct sockaddr_in sin;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1)
{
return -1;
}
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0;
if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)
{
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
ipaddr=inet_ntoa(sin.sin_addr);
#endif
websSetIpAddr(ipaddr);
websSetHost(ipaddr);
=============================================================================
! 修改源码后需重新编译,并下载到开发板
------------------------------------------------------------------------------------------
问题二(运行错误):
goahead: 0: Can't open config file route.txt
goahead: 0: Can't initialize server. Exiting.
解决办法:把 /usr/src/goahead-3.1.3-0/src/route.txt 拷贝到goahead可执行文件同一目录下。
------------------------------------------------------------------------------------------
问题三(运行错误):
goahead: 0: Can't open config file auth.txt
goahead: 0: Can't load auth.txt
解决办法:在goahead可执行文件同一目录下创建auth.txt。
# touch auth.txt
------------------------------------------------------------------------------------------
问题四:页面存放路径?
答:在goahead可执行文件目录下的web目录,自行创建web目录即可。
# mkdir web
------------------------------------------------------------------------------------------
问题五:CGI存放路径?
答:
1. 修改源码,使错误信息能正确显示(可选)
# vi src/cgi.c +93
error("Cannot find CGI program: ", cgiPath);
修改为:
error("Cannot find CGI program: %s", cgiPath);
! 修改源码后需重新编译,并下载到开发板
2. 创建cgi-bin目录
# mkdir web/cgi-bin
3. 修改配置文件
# vi route.txt
route uri=/cgi-bin dir=cgi-bin handler=cgi
修改为:
route uri=/cgi-bin dir=/opt/linux-arm-default/bin/web handler=cgi // dir设置为web目录的绝对路径
4. 重启goahead
- 测试
1. 创建 index.html (保存至web/index.html)
<html>
<head><h3>GoAhead Test Page</h3></head>
<body>
Hello, GoAhead!
<form action=/cgi-bin/test.cgi method=POST>
<input type=submit name="OK" value="ok">
</form>
</body>
</html>
----------------------------------------------------------------------
2. 创建 test.cgi (保存至web/cgi-bin/test.cgi)
#!/bin/sh
echo
echo Content-type: html/plain
echo
echo `/bin/date`
! 创建完成后赋予该文件可执行权限:
# chmod a+x web/cgi-bin/test.cgi
----------------------------------------------------------------------
3. 启动goahead(如果上面的操作全部已经完成了但依然无法启动goahead,则可尝试cd到goahead所在的目录再尝试启动),在浏览器中输入192.168.1.239/index.html(笔者开发板的IP地址为192.168.1.239),然后在显示的页面中点击“ok”,如果能够正确显示系统时间则说明goahead移植成功且已正确配置。
点击“ok”按钮后:
最近的项目需要在cubieboard3上布署一个web server,用于与设备进行交互,实现通过移动设备的网页控制设备的功能。web server选用了goahead 3.4.3。
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,代码如下:
<HTML>
<HEAD>
<TITLE>Time Setting</TITLE>
<SCRIPT language=JavaScript>
function js_getObjectByNameFromForm(form,name)
{
for(var i=0;i<form.length;i++)
{
if(form[i].name == name)
return (form[i]);
}
return (null);
}
function clickedSetButton(form)
{
var date;
var year;
var mon;
var day;
var hour;
var min;
var sec;
year = js_getObjectByNameFromForm(form,"year");
mon = js_getObjectByNameFromForm(form,"month");
day = js_getObjectByNameFromForm(form,"day");
hour = js_getObjectByNameFromForm(form,"hour");
min = js_getObjectByNameFromForm(form,"minute");
sec = js_getObjectByNameFromForm(form,"second");
date = new Date();
year.value=date.getFullYear();
mon.value =date.getMonth()+1;
day.value =date.getDate();
hour.value=date.getHours();
min.value =date.getMinutes();
sec.value =date.getSeconds();
return false;
}
</SCRIPT>
</HEAD>
<BODY text=#000000 vLink=#000080 alink=#000080 link=#000080 bgColor=#FFFFFF onload="">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR align=left>
<TD vAlign=bottom>
<FONT size=+2 >
<STRONG>
<h1>设置终端时间</h1>
</STRONG>
</FONT>
</TD>
</TR>
</TBODY>
</TABLE>
<P>点击“获取终端时间”可查看终端时间,点击“获取本地时间”可得到当前系统时间 “设置终端时间”,用当前各输入框内的数据更新终端时间,即时生效
</P>
<FORM id="" action=/goform/formSetTermTime method=POST target="id_iframe">
<TABLE>
<TBODY>
<TR>
<%GetTermTime();%>
</TR>
</TBODY>
</TABLE>
<BR>
<INPUT onClick="location.reload()" type=button value=获取终端时间 name=reloadp >
<INPUT onClick="" type=submit value=设置终端时间 name=Modify>
<INPUT onClick="clickedSetButton(form);" type=button value="获取本地时间" name=B2>
</FORM>
<iframe id="id_iframe" name="id_iframe" style="display:none;"></iframe>
</BODY>
</HTML>
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,"<TD noWrap><INPUT maxlength=4 size=6 title=时间年 value=%d name=year>年</TD>\n",1900+timeinfo->tm_year);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间月 value=%d name=month>月</TD>\n",1+timeinfo->tm_mon);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间日 value=%d name=day>日</TD>\n",timeinfo->tm_mday);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间时 value=%d name=hour>点</TD>\n",timeinfo->tm_hour);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间分 value=%d name=minute>分</TD>\n",timeinfo->tm_min);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间秒 value=%d name=second>秒</TD>\n",timeinfo->tm_sec);
return 1;
}
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,("<script>location.href='../%s'</script>"), url);
websFooter(wp);
websSetStatus(wp, 200);
websDone(wp);
}
void websReportError(webs_t wp, const char *dsc, const char *url)
{
websHeader(wp);
websWrite(wp,("<script>alert('%s');history.back();</script>"), dsc);
websFooter(wp);
websSetStatus(wp, 200);
websDone(wp);
}
3.到目前为止,通过<%GetTermTime();%>得到服务端的数据,它对应的C函数是aspGetTermTime。
通过form的action="goform/formSetTermTime "实现将网页的数据提交到后台的formSetTermTime。正常情况下这时页面会跳转到goform/formSetTermTime
的页面。这是提交刷新的方式。
我这边要讲的是form提交但不刷新本页的方式。
方法如下,修改settime.jst文件:
<FORM id="" action=/goform/formSetTermTime method=POST target="id_iframe">
.................................
<INPUT onClick="" type=submit value=设置终端时间 name=Modify>
</FORM>
<iframe id="id_iframe" name="id_iframe" style="display:none;"></iframe>
这在网页设计上叫提交到隐藏的iframe页面,实现form提交但不刷新的目的。
注意事项:iframe 的id与Form的target要一致。
iframe的style要设置成display:none
相关资料参考:可以百度一下以下关键字,不过这些GoAhead的版本都比3.4.3低,有些API的用法不太一样,大家看的时候可以选择性的看。
1. 在官网下载最新的源码包
官网:http://embedthis.com/downloads/index.html
2. 解压并编译
# tar -zxvf goahead-3.1.3-0-src.tgz -C /usr/src
# cd /usr/src/goahead-3.1.3-0
# make CC=arm-arago-linux-gnueabi-gcc ARCH=arm
编译完成后会在 /usr/src/goahead-3.1.3-0/linux-arm-default/bin 生成可执行文件
3. 将bin目录下的可执行文件goahead,库文件libest.so、libgo.so拷贝到开发板
库文件可与goahead文件放在同一目录下,也可拷贝到 /usr/lib 目录下
但是,goahead移植没那么简单,此时直接运行goahead会有问题,下面将介绍如何逐一解决。
- 移植配置
问题一(运行错误):
goahead: 0: Can't get host address for host dvr: errno 110
goahead: 0: Can't initialize server. Exiting.
解决办法:修改 /usr/src/goahead-3.1.3-0/src/http.c
# vi src/http.c // 共有2处相同的代码需修改
=============================================================================
if ((hp = gethostbyname(host)) == NULL) {
error("Can't get host address for host %s: errno %d", host, errno);
return -1;
}
memcpy((char*) &intaddr, (char *) hp->h_addr_list[0], (size_t) hp->h_length);
ddr = inet_ntoa(intaddr);
websSetIpAddr(ipaddr);
websSetHost(ipaddr);
=============================================================================
改为:
=============================================================================
#if 0
if ((hp = gethostbyname(host)) == NULL) {
error("Can't get host address for host %s: errno %d", host, errno);
return -1;
}
memcpy((char*) &intaddr, (char *) hp->h_addr[0], (size_t) hp->h_length);
ipaddr = inet_ntoa(intaddr);
#else
int sockfd;
struct sockaddr_in sin;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1)
{
return -1;
}
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0;
if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)
{
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
ipaddr=inet_ntoa(sin.sin_addr);
#endif
websSetIpAddr(ipaddr);
websSetHost(ipaddr);
=============================================================================
! 修改源码后需重新编译,并下载到开发板
------------------------------------------------------------------------------------------
问题二(运行错误):
goahead: 0: Can't open config file route.txt
goahead: 0: Can't initialize server. Exiting.
解决办法:把 /usr/src/goahead-3.1.3-0/src/route.txt 拷贝到goahead可执行文件同一目录下。
------------------------------------------------------------------------------------------
问题三(运行错误):
goahead: 0: Can't open config file auth.txt
goahead: 0: Can't load auth.txt
解决办法:在goahead可执行文件同一目录下创建auth.txt。
# touch auth.txt
------------------------------------------------------------------------------------------
问题四:页面存放路径?
答:在goahead可执行文件目录下的web目录,自行创建web目录即可。
# mkdir web
------------------------------------------------------------------------------------------
问题五:CGI存放路径?
答:
1. 修改源码,使错误信息能正确显示(可选)
# vi src/cgi.c +93
error("Cannot find CGI program: ", cgiPath);
修改为:
error("Cannot find CGI program: %s", cgiPath);
! 修改源码后需重新编译,并下载到开发板
2. 创建cgi-bin目录
# mkdir web/cgi-bin
3. 修改配置文件
# vi route.txt
route uri=/cgi-bin dir=cgi-bin handler=cgi
修改为:
route uri=/cgi-bin dir=/opt/linux-arm-default/bin/web handler=cgi // dir设置为web目录的绝对路径
4. 重启goahead
- 测试
1. 创建 index.html (保存至web/index.html)
<html>
<head><h3>GoAhead Test Page</h3></head>
<body>
Hello, GoAhead!
<form action=/cgi-bin/test.cgi method=POST>
<input type=submit name="OK" value="ok">
</form>
</body>
</html>
----------------------------------------------------------------------
2. 创建 test.cgi (保存至web/cgi-bin/test.cgi)
#!/bin/sh
echo
echo Content-type: html/plain
echo
echo `/bin/date`
! 创建完成后赋予该文件可执行权限:
# chmod a+x web/cgi-bin/test.cgi
----------------------------------------------------------------------
3. 启动goahead(如果上面的操作全部已经完成了但依然无法启动goahead,则可尝试cd到goahead所在的目录再尝试启动),在浏览器中输入192.168.1.239/index.html(笔者开发板的IP地址为192.168.1.239),然后在显示的页面中点击“ok”,如果能够正确显示系统时间则说明goahead移植成功且已正确配置。
点击“ok”按钮后:
最近的项目需要在cubieboard3上布署一个web server,用于与设备进行交互,实现通过移动设备的网页控制设备的功能。web server选用了goahead 3.4.3。
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,代码如下:
<HTML>
<HEAD>
<TITLE>Time Setting</TITLE>
<SCRIPT language=JavaScript>
function js_getObjectByNameFromForm(form,name)
{
for(var i=0;i<form.length;i++)
{
if(form[i].name == name)
return (form[i]);
}
return (null);
}
function clickedSetButton(form)
{
var date;
var year;
var mon;
var day;
var hour;
var min;
var sec;
year = js_getObjectByNameFromForm(form,"year");
mon = js_getObjectByNameFromForm(form,"month");
day = js_getObjectByNameFromForm(form,"day");
hour = js_getObjectByNameFromForm(form,"hour");
min = js_getObjectByNameFromForm(form,"minute");
sec = js_getObjectByNameFromForm(form,"second");
date = new Date();
year.value=date.getFullYear();
mon.value =date.getMonth()+1;
day.value =date.getDate();
hour.value=date.getHours();
min.value =date.getMinutes();
sec.value =date.getSeconds();
return false;
}
</SCRIPT>
</HEAD>
<BODY text=#000000 vLink=#000080 alink=#000080 link=#000080 bgColor=#FFFFFF onload="">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR align=left>
<TD vAlign=bottom>
<FONT size=+2 >
<STRONG>
<h1>设置终端时间</h1>
</STRONG>
</FONT>
</TD>
</TR>
</TBODY>
</TABLE>
<P>点击“获取终端时间”可查看终端时间,点击“获取本地时间”可得到当前系统时间 “设置终端时间”,用当前各输入框内的数据更新终端时间,即时生效
</P>
<FORM id="" action=/goform/formSetTermTime method=POST target="id_iframe">
<TABLE>
<TBODY>
<TR>
<%GetTermTime();%>
</TR>
</TBODY>
</TABLE>
<BR>
<INPUT onClick="location.reload()" type=button value=获取终端时间 name=reloadp >
<INPUT onClick="" type=submit value=设置终端时间 name=Modify>
<INPUT onClick="clickedSetButton(form);" type=button value="获取本地时间" name=B2>
</FORM>
<iframe id="id_iframe" name="id_iframe" style="display:none;"></iframe>
</BODY>
</HTML>
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,"<TD noWrap><INPUT maxlength=4 size=6 title=时间年 value=%d name=year>年</TD>\n",1900+timeinfo->tm_year);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间月 value=%d name=month>月</TD>\n",1+timeinfo->tm_mon);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间日 value=%d name=day>日</TD>\n",timeinfo->tm_mday);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间时 value=%d name=hour>点</TD>\n",timeinfo->tm_hour);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间分 value=%d name=minute>分</TD>\n",timeinfo->tm_min);
websWrite(wp,"<TD noWrap><INPUT maxlength=2 size=4 title=时间秒 value=%d name=second>秒</TD>\n",timeinfo->tm_sec);
return 1;
}
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,("<script>location.href='../%s'</script>"), url);
websFooter(wp);
websSetStatus(wp, 200);
websDone(wp);
}
void websReportError(webs_t wp, const char *dsc, const char *url)
{
websHeader(wp);
websWrite(wp,("<script>alert('%s');history.back();</script>"), dsc);
websFooter(wp);
websSetStatus(wp, 200);
websDone(wp);
}
3.到目前为止,通过<%GetTermTime();%>得到服务端的数据,它对应的C函数是aspGetTermTime。
通过form的action="goform/formSetTermTime "实现将网页的数据提交到后台的formSetTermTime。正常情况下这时页面会跳转到goform/formSetTermTime
的页面。这是提交刷新的方式。
我这边要讲的是form提交但不刷新本页的方式。
方法如下,修改settime.jst文件:
<FORM id="" action=/goform/formSetTermTime method=POST target="id_iframe">
.................................
<INPUT onClick="" type=submit value=设置终端时间 name=Modify>
</FORM>
<iframe id="id_iframe" name="id_iframe" style="display:none;"></iframe>
这在网页设计上叫提交到隐藏的iframe页面,实现form提交但不刷新的目的。
注意事项:iframe 的id与Form的target要一致。
iframe的style要设置成display:none
相关资料参考:可以百度一下以下关键字,不过这些GoAhead的版本都比3.4.3低,有些API的用法不太一样,大家看的时候可以选择性的看。
相关文章推荐
- Go语言截取字符串
- Go语言正则表达式
- GO语言下载、安装、配置
- 深入研究 Visual Studio Code for Golang
- 【GOF】代理模式(proxy)之静态代理
- Sublime3安装PackageControl,然后安装GoSublime
- Xidian oj 1120: Gold of Orz Pandas 贪心
- POJ2195 Going Home
- mongoid--查询的注意事项
- mongoid--2d索引简介(index)
- 设计模式-建造者模式(Go语言描述)
- Zygote,SystemServer启动分析
- Googlehacking 信息收集
- LET'S DJ:web.py无缝迁移到django
- 使用GO语言创建一个Web应用
- googleHacking基础
- Windows7下面手把手教你安装Django
- GO语言初识与编程环境配置
- 谷歌浏览器插件“开眼”访问google、facebook等
- 九、Go语言库之strconv包--GO语言笔记