最近,在做嵌入式开发的一个项目,要在A8板子上,嵌入boa服务器,通过网页获取传感器信息和控制风扇,电机等器件。网页的制作,使用HTML和CGI,使用C语言编写CGI。在网上找到了一个CGIC库——CGIC250,这个库中有CGI的常用接口和方法,实现HTML页面和后台服务的数据交互。
使用HTML中的表单form,提交表单到CGJ中,CGI接收数据,操作数据库,实现信息的传递。但是要将数据库中的数据实时的显示到HTML页面上,CGI库中却没有直接的方法来实现,在网上找了很多方法,都没有实现,,无奈,,最后,使用比较麻烦的Cookie来传递数据。如果,大家有更好的办法,或者有更好的CGI库,欢迎大家跟我联系QQ:958129405。下面跟大家详细介绍一下我的CGI和HTML信息双向交互的方法。
建一个HTML网页发送form表单到CGI:
HTML代码:
<html>
<head>
<title>Testtitle>
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获取表单数据发来的数据的方式有两种:
#include
#include "cgic.h"
#include <string.h>
#include
extern char *cgiQueryString;
int cgiMain() {
cgiHeaderContentType("text/html");
fprintf(cgiOut, "\n");
fprintf(cgiOut,FormMessage \n");
fprintf(cgiOut, "");
fprintf(cgiOut, "%s
",cgiQueryString);
fprintf(cgiOut, "\n");
fprintf(cgiOut, "\n");
return 0;
}
通过声明extern char *cgiQueryString表单传到out.cgi的数据,自动保存在cgiQuerString中,上面的程序将接收的表单数据打印在HTML上了。
使用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
#include
#include
extern char *cgiQueryString;
int cgiMain() {
char name[241];
char number[241];
int numb;
cgiHeaderContentType("text/html");
fprintf(cgiOut, "\n");
fprintf(cgiOut, "My CGI \n"
fprintf(cgiOut, "");
//获取数据
cgiFormString("text", name, 241);
cgiFormString("number", number, 241);
cgiFormInteger("number", numb, 0);
//打印数据
fprintf(cgiOut, "%s
",name);
fprintf(cgiOut, "%s
",number);
fprintf(cgiOut, "number = %d",numb);
fprintf(cgiOut, "\n");
fprintf(cgiOut, "\n");
return 0;
}
通过CGI可以重新打印一个HTML页面,例如:打印一个简单的HTML登录网页:
代码如下:
#include "cgic.h"
#include
#include
#include
extern char *cgiQueryString;
int cgiMain() {
cgiHeaderContentType("text/html");
fprintf(cgiOut, "\n");
fprintf(cgiOut, "欢迎登录 \n"
fprintf(cgiOut, "");
fprintf(cgiOut, "欢迎登录*******网站
\n");
fprintf(cgiOut, "username"
");
fprintf(cgiOut, "密 码" name="passwd"
\n");
fprintf(cgiOut, ""name="Login">\n");
fprintf(cgiOut, "" style="" name="regedit">
\n");
fprintf(cgiOut, "\n");
fprintf(cgiOut, "\n");
return 0;
}
这种方式方式对于简单的的网页,还可以适用,但对于较大的网页显然不行,而且不过灵活,因此,想到了,HTML页面跳转时用来传递数据的Cookie来实现,数据的传递。
cookie(储存在用户本地终端上的数据):Cookie的详细介绍去百度百科搜索就知道了,这里我们只说CGI中Cookie怎么用。
首先,我我们在CGI中设置Cookie,然后打印一个HTML跳转到想要跳转的页面,在目标页面中获取Cookie的值,显示在HTML控件中就可以了。
详细步骤:
:
<html>
<head>
<title>获取CGI数据title>
head>
<body>
<form action="cgi-bin/getdata.cgi" method="get">
<input type="submit" value="获取CGI中的数据 →">
form>
body>
html>
#include
#include "cgic.h"
#include
#include
int cgiMain() {
fprintf(cgiOut,"Set-Cookie: %s=%s; path=/\r\n","Data","abcd");
//设置一个名为Data数据为"abcd"的Cookie
cgiHeaderContentType("text/html");
fprintf(cgiOut, "\n");
fprintf(cgiOut, ");
//设置跳转到当前目录下的showCookie.html页面
fprintf(cgiOut, "Cookie \n"
fprintf(cgiOut, "");
fprintf(cgiOut, "\n");
fprintf(cgiOut, "\n");
return 0;
}
C代码:fprintf(cgiOut,”SetCookie:%s=%s;path=/\r\n”,”Data”,”abcd”);用来设置一个Cookie,Cookie 的内容是”Data=”abcd”“。Cookie是以键值对的方式存在于浏览器中,在HTML中使用Set—Cookie来设置一个Cookie。
<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中的数据,声明嵌套的是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页面上。