Chinaunix首页 | 论坛 | 博客
  • 博客访问: 497549
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 508
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-10 13:18
个人简介

Keep looking Donot settle

文章分类

全部博文(144)

文章存档

2019年(1)

2016年(31)

2015年(51)

2014年(61)

分类: 嵌入式

2015-04-02 20:12:42

最近的项目需要在cubieboard3上布署一个web server,用于与设备进行交互,实现通过移动设备的网页控制设备的功能。web server选用了goahead 3.4.3。

        GoAHead的前端页面的实现有两种方式:

       一种是所有的HTML代码全部由C语言实现。

       另一种是一种类似于asp风格的方式,静态相关的网页由HTML编辑器实现,交互部分采用类似这种<%GetTermTime();%>宏的 方式实现。在客户端网页请求Goahead服务器网页的时候,GoAHead服务器网页浏览整个网页文件,看到这种宏,就用服务端的一段代码进行替换,最 后展现在客户端前面的页面就是替换过的网页文件。

      综合比较了一下,还是选用了第二种。第一种方式C语言的体力活太多,而且非常不容易维护,扩展性也比较差,不具有通用性。

     项目的交互主要分两个方面:

  1. 获取后台参数,并显示在前台页面上
  2. 设置页面的参数,并传递到后台,分两种方式(设置不跳转页面,设置跳转页面)

    所谓的后台也就是goahead的c语言处理部分。

1.修改后缀名

在src/route.txt中 :
把    route uri=/

改成route uri=/ extensions=jst,html handler=jst
这样前端访问的网页就支持.jst和.html两种格式了,否则默认是.jst的格式。如果客户端访问GoAhead服务器上的html文件,GoAhead服务器在浏览页面的时候,是不会用服务器端的代码去替换宏的,也就是没办法去获取后台数据。

2.我们用来测试的页面叫做settime.jst,代码如下:


 
  Time Setting
  
  
   
  
  


   
   
    
   
   
   

     
     
     

设置终端时间


     

     

    

   
   

点击“获取终端时间”可查看终端时间,点击“获取本地时间”可得到当前系统时间 “设置终端时间”,用当前各输入框内的数据更新终端时间,即时生效
   


   
   

   
     
      
       <%GetTermTime();%>
      
     
   

   

   
   
   
   

   
   
 
 

settime.jst中的GetTermTimeformSetTermTime ,就对应下面http.c中新增的aspGetTermTimeformSetTermTime 
 

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,"年\n",1900+timeinfo->tm_year);
 websWrite(wp,"月\n",1+timeinfo->tm_mon);
 
 websWrite(wp,"日\n",timeinfo->tm_mday);
 websWrite(wp,"点\n",timeinfo->tm_hour);
 
 websWrite(wp,"分\n",timeinfo->tm_min);
 websWrite(wp,"秒\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,(""), 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文件:

    

id_iframe">
    .................................      

    
   
   

这在网页设计上叫提交到隐藏的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
阅读(1422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~