嵌入式CGI 與HTML的數據交換

最近,在做嵌入式開發的一個項目,要在A8板子上,嵌入boa服務器,通過網頁獲取傳感器信息和控制風扇,電機等器件。網頁的製作,使用HTML和CGI,使用C語言編寫CGI。在網上找到了一個CGIC庫——CGIC250,這個庫中有CGI的常用接口和方法,實現HTML頁面和後臺服務的數據交互。
使用HTML中的表單form,提交表單到CGJ中,CGI接收數據,操作數據庫,實現信息的傳遞。但是要將數據庫中的數據實時的顯示到HTML頁面上,CGI庫中卻沒有直接的方法來實現,在網上找了很多方法,都沒有實現,,無奈,,最後,使用比較麻煩的Cookie來傳遞數據。如果,大家有更好的辦法,或者有更好的CGI庫,歡迎大家跟我聯繫QQ:958129405。下面跟大家詳細介紹一下我的CGI和HTML信息雙向交互的方法。

一,從HTML獲取數據到CGI

建一個HTML網頁發送form表單到CGI:
HTML代碼:

<html>
 <head>
 <title>Test</title>
 </head>
<body>
  <form action="cgi-bin/out.cgi" method="get">
        <input type="text" name="number" value='123465'>
       <input type="text" name="text" value='dsdhfghsdg'>
     <input type="submit" value="提交 &rarr;">
    </form>
 </body>
 </html>

點擊“提交”就將form表單提交到out.cgi中,CGI獲取表單數據發來的數據的方式有兩種:

1,直接接收整個表單信息:

#include <stdio.h>
    #include "cgic.h"
    #include <string.h>
    #include <stdlib.h>
     extern char *cgiQueryString;
    int cgiMain() {
        cgiHeaderContentType("text/html");
        fprintf(cgiOut, "<HTML><HEAD>\n");
       fprintf(cgiOut,<TITLE>FormMessage</TITLE</HEAD>\n");
       fprintf(cgiOut, "<BODY>");
       fprintf(cgiOut, "<H1>%s</H1>",cgiQueryString);
      fprintf(cgiOut, "</BODY>\n");
      fprintf(cgiOut, "</HTML>\n");
       return 0;
       }

通過聲明extern char *cgiQueryString表單傳到out.cgi的數據,自動保存在cgiQuerString中,上面的程序將接收的表單數據打印在HTML上了。

2.獲取表單中的參數值

使用igcformString,cgiformInteger.以String或者Integer的格式獲取form表單中表單控件的數據,方法的參數類型:

cgiFormResultType cgiFormString( char *name, char *result, int max)

name:指定的輸入域的名稱(form中表單控件的name值)

max:將要拷貝的字節數,最多爲max-1個字節,因爲字符串最 後還將被加上一個null終止符。

result:指向取得的值,即保存值的buffer。若字符串比result長,則字符串將被截斷。

cgiFormResultType cgiFormInteger( char *name, int *result, int defaultV)

name:指定的輸入域的名稱(form中表單控件的name值)

result:指向取得的值,即保存值的buffer

defaultV:設定的默認值

代碼如下:

      #include "cgic.h"
       #include <stdio.h>
       #include <string.h>
       #include <stdlib.h>
       extern char *cgiQueryString;
       int cgiMain() {
       char name[241];
       char number[241];
       int numb;
       cgiHeaderContentType("text/html");
       fprintf(cgiOut, "<HTML><HEAD>\n");
       fprintf(cgiOut, "<TITLE>My CGI</TITLE></HEAD>\n"
       fprintf(cgiOut, "<BODY>");
       //獲取數據
       cgiFormString("text", name, 241);
       cgiFormString("number", number, 241);
       cgiFormInteger("number", numb, 0);
       //打印數據
       fprintf(cgiOut, "<H1>%s</H1>",name);
       fprintf(cgiOut, "<H1>%s</H1>",number);
       fprintf(cgiOut, "number = %d",numb);
       fprintf(cgiOut, "</BODY>\n");
       fprintf(cgiOut, "</HTML>\n");
       return 0;
       }

二,CGI中的數據顯示在HTML

通過CGI可以重新打印一個HTML頁面,例如:打印一個簡單的HTML登錄網頁:簡單登錄網頁
代碼如下:

 #include "cgic.h"
       #include <stdio.h>
       #include <string.h>
       #include <stdlib.h>
       extern char *cgiQueryString;
       int cgiMain() {
       cgiHeaderContentType("text/html");
       fprintf(cgiOut, "<HTML><HEAD>\n");
       fprintf(cgiOut, "<TITLE>歡迎登錄</TITLE></HEAD>\n"
       fprintf(cgiOut, "<BODY>");
       fprintf(cgiOut, "<H1>歡迎登錄*******網站</H1>\n");
       fprintf(cgiOut, "<form>用戶名<input type=text value="請輸入用戶名" name="username"<br/>");
       fprintf(cgiOut, "密&#160;&#160;碼<input type=text value="請輸入密碼" name="passwd"<br/>\n");
       fprintf(cgiOut, "<input type=submit value="登錄"name="Login"></form>\n");
        fprintf(cgiOut, "<form><input type=submit value="註冊" size="" style="" name="regedit"><br/></form>\n");
       fprintf(cgiOut, "</BODY>\n");
       fprintf(cgiOut, "</HTML>\n");
       return 0;
       }

這種方式方式對於簡單的的網頁,還可以適用,但對於較大的網頁顯然不行,而且不過靈活,因此,想到了,HTML頁面跳轉時用來傳遞數據的Cookie來實現,數據的傳遞。

cookie(儲存在用戶本地終端上的數據):Cookie的詳細介紹去百度百科搜索就知道了,這裏我們只說CGI中Cookie怎麼用。

首先,我我們在CGI中設置Cookie,然後打印一個HTML跳轉到想要跳轉的頁面,在目標頁面中獲取Cookie的值,顯示在HTML控件中就可以了。
詳細步驟:

  • 1.設計一個HTML網頁,向CGI發送表單

<html>
 <head>
 <title>獲取CGI數據</title>
 </head>
<body>
  <form action="cgi-bin/getdata.cgi" method="get">
     <input type="submit" value="獲取CGI中的數據 &rarr;">
    </form>
 </body>
 </html>
  • 2.編寫CGI的C語言代碼(文件名是getdata.c)設置一個Cookie,打印一個HTML,跳轉到showCookie.html頁面。
      #include <stdio.h>
      #include "cgic.h"
       #include <string.h>
       #include <stdlib.h>
       int cgiMain() {
       fprintf(cgiOut,"Set-Cookie: %s=%s;  path=/\r\n","Data","abcd");
    //設置一個名爲Data數據爲"abcd"的Cookie
       cgiHeaderContentType("text/html");
       fprintf(cgiOut, "<HTML><HEAD>\n");
       fprintf(cgiOut, "<meta http-equiv=Refresh content=1;URL=./showCookie.html\n");   
//設置跳轉到當前目錄下的showCookie.html頁面
       fprintf(cgiOut, "<TITLE>Cookie</TITLE></HEAD>\n"
       fprintf(cgiOut, "<BODY>");
       fprintf(cgiOut, "</BODY>\n");
       fprintf(cgiOut, "</HTML>\n");
       return 0;
       }

C代碼:fprintf(cgiOut,”SetCookie:%s=%s;path=/\r\n”,”Data”,”abcd”);用來設置一個Cookie,Cookie 的內容是”Data=”abcd”“。Cookie是以鍵值對的方式存在於瀏覽器中,在HTML中使用Set—Cookie來設置一個Cookie。

  • 3.建一個html頁面接收顯示Cookie的數據:
    建文件名爲showCookie.html的HTML文件用來顯示
    HTML代碼:
<html>
 <head>
<script type="text/javascript" >
function getCookie(c_name)
{
    if (document.cookie.length>0)
    {
         c_start=document.cookie.indexOf(c_name + "=")
         if (c_start!=-1)
         { 
            c_start=c_start + c_name.length+1 
            c_end=document.cookie.indexOf(";",c_start)
         if (c_end==-1) c_end=document.cookie.length
         return unescape(document.cookie.substring(c_start,c_end))
        } 
    }
return ""
}
</script>
 <title>顯示Cookie數據</title>
 </head>
<body>
  <form >
顯示Cookie中的數據: Data=
    <input name="lignt_now" type="text" id="data_text"  />

    </form>
<script type="text/javascript" >
    bang_text= document.getElementById('data_text');            
    bang_text.value =getCookie('Data')
</script>
 </body>
 </html>

代碼中嵌套了JavaScript語言用來獲取Cookie中的數據,<script type="text/javascript" >聲明嵌套的是JavaScript語言下面是JavaScript代碼。

<script type="text/javascript" >
function getCookie(c_name)
{
    if (document.cookie.length>0)
    {
         c_start=document.cookie.indexOf(c_name + "=")
         if (c_start!=-1)
         { 
            c_start=c_start + c_name.length+1 
            c_end=document.cookie.indexOf(";",c_start)
         if (c_end==-1) c_end=document.cookie.length
         return unescape(document.cookie.substring(c_start,c_end))
        } 
    }
return ""
}
</script>

用來聲明一個getCookie函數,用來獲取Cookie中的數據。

<script type="text/javascript" >
    bang_text= document.getElementById('data_text');            
    bang_text.value =getCookie('Data')
</script>

用來獲取form中的ID是data_text(id=”data_text”)的form控件,然後設置該控件的value值爲:Cookie:Data的數據。顯示在HTML頁面上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章