嵌入式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页面上。

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