Ajax-goahead局部刷新页面

  • A+
所属分类:C语言
摘要

软件开发最常用的方法是:C/S,B/S。如果嵌入式设备中使用Ajax,那么既可以使用C/S方式,也可以使用B/S开发上位机。最近公司的一个项目需要异步获取后台数据,使用form更新数据时会有空白卡顿不会很流畅,需要重新加载整个页面。在网上搜了一些资料,发现没有封装好的函数(本来想偷懒呢),都是简单介绍了一下用法。下面是自己封装的goahead-2-5中Ajax 的函数,可以直接使用的;可以在go-ahead 中使用cJson 对上通信。嵌入式设备中cJson/xml/html 三种数据格式,cjson 的代码只有 1000+ 行, 而且只是简单的几个函数的调用,相对于其他两种更节省资源,更易使用;

[摘要]本文是对Ajax-goahead局部刷新页面的讲解,对学习C编程技术有所帮助,与大家分享。

软件开发最常用的方法是:C/S,B/S。如果嵌入式设备中使用Ajax,那么既可以使用C/S方式,也可以使用B/S开发上位机。最近公司的一个项目需要异步获取后台数据,使用form更新数据时会有空白卡顿不会很流畅,需要重新加载整个页面。在网上搜了一些资料,发现没有封装好的函数(本来想偷懒呢),都是简单介绍了一下用法。下面是自己封装的goahead-2-5中Ajax 的函数,可以直接使用的;可以在go-ahead 中使用cJson 对上通信。嵌入式设备中cJson//html 三种数据格式,cjson 的代码只有 1000+ 行, 而且只是简单的几个函数的调用,相对于其他两种更节省资源,更易使用;

  goahead-2-5中Ajax 方法的封装类似于form,Asp的封装,用法相对于前两种更简单

  
  /********************************** Description *******************************/
  
  /*
   *    This module implements the /ajax handler.  emulates CGI processing
   *    but performs this in-process and not as an external process. This enables
   *    a very high performance implementation with easy parsing and decoding 
   *    of query strings and posted data.
   */
  
  /*********************************** Includes *********************************/
  
  #include    "wsIntrn.h"
  
  /************************************ Locals **********************************/
  
  static sym_fd_t    ajaxSymtab = -1;            /* Symbol table for ajax handlers */
  
  
  /************************************* Code ***********************************/
  static int websAjaxHandlerDone(webs_t wp);
  static void websAjaxHeader(webs_t wp);
  /************************************* globle ***********************************/
  /*
   *    Process a ajax request. Returns 1 always to indicate  handled the URL
   */
  int websAjaxHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, 
      char_t *url, char_t *path, char_t *query)
  {
      sym_t        *sp;
      char_t        ajaxBuf[FNAMESIZE];
      char_t        *cp, *ajaxName;
      int            (*fn)(void *sock, char_t *path, char_t *args);
  
      a_assert(websValid(wp));
      a_assert(url && *url);
      a_assert(path && *path == '/');
  
  /*
   *    Extract the ajax name
   */
      gstrncpy(ajaxBuf, path, TSZ(ajaxBuf));
      if ((ajaxName = gstrchr(&ajaxBuf[1], '/')) == NULL) {
          websError(wp, 200, T("Missing ajax name"));
          return 1;
      }
      ajaxName++;
      if ((cp = gstrchr(ajaxName, '/')) != NULL) {
          *cp = '/0';
      }
  
  /*
   *    Lookup the C ajax function first and then try tcl (no  support 
   *    yet).
   */
      sp = symLookup(ajaxSymtab, ajaxName);
      if (sp == NULL) {
          websError(wp, 404, T("Ajax %s is not defined"), ajaxName);
      } else {
          fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;
          a_assert(fn);
          if (fn) {
  /*
   *            For good practice, ajaxs must call websDone()
   */
              websAjaxHeader(wp); 
              (*fn)((void*) wp, ajaxName, query); //调用实现函数
              websAjaxHandlerDone(wp); 
  
  /*
   *            Remove the test to force websDone, since this prevents
   *            the server "push" from a ajax>
   */
  #if 0 /* push */
              if (websValid(wp)) {
                  websError(wp, 200, T("Ajax didn't call websDone"));
              }
  #endif /* push */
          }
      }
      return 1;
  }
  /******************************************************************************/
  /*
   *    Define a ajax function in the "ajax" map space.
   */
  
  int websAjaxDefine(char_t *name, void (*fn)(webs_t wp, char_t *path, 
      char_t *query))
  {
      a_assert(name && *name);
      a_assert(fn);
  
      if (fn == NULL) {
          return -1;
      }
  
      symEnter(ajaxSymtab, name, valueInteger((int) fn), (int) NULL);
      return 0;
  }
  
  /******************************************************************************/
  
  /*
   *    Open the symbol table for ajaxs.
   */
  
  void websAjaxOpen()
  {
      ajaxSymtab = symOpen(WEBS_SYM_INIT*2);
  }
  
  /******************************************************************************/
  /*
   *    Close the symbol table for ajaxs.
   */
  
  void websAjaxClose()
  {
      if (ajaxSymtab != -1) {
          symClose(ajaxSymtab);
          ajaxSymtab = -1;
      }
  }
  /**********************************Local********************************************/
  /*
   *    Write a webs header. This is a convenience routine to write a common
   *    header for a Ajax back to the browser.
   */
  
  static void websAjaxHeader(webs_t wp)
  {
      a_assert(websValid(wp));
      websWrite(wp, T("HTTP/1.0 200 OK/n"));
  /*
   *    By license terms the following line of code must not be modified
   */
      websWrite(wp, T("Server: %s/r/n"), WEBS_NAME);
  
      websWrite(wp, T("Pragma: no-cache/n"));
      websWrite(wp, T("Cache-control: no-cache/n"));
      websWrite(wp, T("Content-Type: text/html/n"));
      websWrite(wp, T("/n"));
  
  }
  /******************************************************************************/
  /*
   * ajax respone ok
   */
  static int websAjaxHandlerDone(webs_t wp)
  {
      websDone(wp,200);
  }
用法:
1. 进程初始化时调用 websAjaxOpen();
  进程退出时调用 websAjaxClose();
2. 服务器端实现XMLHttpRequest应答:
注册Ajax handle函数:
  websUrlHandlerDefine(T("/ajax"), NULL, 0, websAjaxHandler, 0);
  注册实现方法:
websAjaxDefine("AjaxTest",AjaxTest);
3.实现方法:
int AjaxTest(char_t *name, void (*fn)(webs_t wp, char_t *path,
char_t *query))
  {
    printf("data:%s/n",query); //接收到的数据
    websWrite("AjaxTest"); //发送的数据
  }
web端调用:
可以自己实现xmlhttprequest方法,也可以使用jq中的Ajax方法,本人使用的是jq中的方法:
    function HttpPostData(data){    
          //显示等待提示img
                $("#loadgif").show();  5                 $.ajax({
                    type: "POST",
                    contentType: "application/json",
                    url: "/ajax/AjaxTest",
                    data: data,
                    beforeSend:function() {
                        document.getElementById("Before").innerHTML = "正在更新数据请稍后......";   //等待提示字样                  
                    },          
                    complete: function () {
              //接收完成
                        $("#loadgif").hide();
                                    },                                             
                    error: function(){
                           document.getElementById("result").innerHTML = "数据更新失败,稍后更新";      
                          $("#loadgif").hide();                                    
                                        },
                    success: function(result) {
               //接收数据
                        document.getElementById("result").innerHTML=result;
                    }
                });
    }
 
 //jq中Ajax使用的是utf-8编码格式,gbk方式会出现乱码,故goahead发送中文时需要进行转码;
 //后面会更新C#中http的相关例程
希望各位博友多多指教 mail:1003278902@qq.com

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: