最近,在做嵌入式開發的一個項目,要在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="提交 →">
</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, "密  碼<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中的數據 →">
</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頁面上。