嵌入式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>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获取表单数据发来的数据的方式有两种:

1,直接接收整个表单信息:

#include 
    #include "cgic.h"
    #include <string.h>
    #include 
     extern char *cgiQueryString;
    int cgiMain() {
        cgiHeaderContentType("text/html");
        fprintf(cgiOut, "\n");
       fprintf(cgiOut,FormMessage</TITLE</HEAD>\n<span class="hljs-string">");
       fprintf(cgiOut, "</span><BODY><span class="hljs-string">");
       fprintf(cgiOut, "</span><H1>%s</H1><span class="hljs-string">",cgiQueryString);
      fprintf(cgiOut, "</span></BODY>\n<span class="hljs-string">");
      fprintf(cgiOut, "</span></HTML>\n<span class="hljs-string">");
       return 0;
       }</span></code></pre> 
  <p>通过声明extern char *cgiQueryString表单传到out.cgi的数据,自动保存在cgiQuerString中,上面的程序将接收的表单数据打印在HTML上了。</p> 
  <h2 id="2获取表单中的参数值">2.获取表单中的参数值</h2> 
  <p>使用igcformString,cgiformInteger.以String或者Integer的格式获取form表单中表单控件的数据,方法的参数类型:</p> 
  <pre><code>cgiFormResultType cgiFormString( char *name, char *result, int max)
</code></pre> 
  <p>name:指定的输入域的名称(form中表单控件的name值)</p> 
  <p>max:将要拷贝的字节数,最多为max-1个字节,因为字符串最 后还将被加上一个null终止符。</p> 
  <p>result:指向取得的值,即保存值的buffer。若字符串比result长,则字符串将被截断。</p> 
  <pre><code>cgiFormResultType cgiFormInteger( char *name, int *result, int defaultV)
</code></pre> 
  <p>name:指定的输入域的名称(form中表单控件的name值)</p> 
  <p>result:指向取得的值,即保存值的buffer</p> 
  <p>defaultV:设定的默认值</p> 
  <p>代码如下:</p> 
  <pre class="prettyprint"><code class=" hljs cpp">      <span class="hljs-preprocessor">#include "cgic.h"</span>
       <span class="hljs-preprocessor">#include <stdio.h></span>
       <span class="hljs-preprocessor">#include <string.h></span>
       <span class="hljs-preprocessor">#include <stdlib.h></span>
       <span class="hljs-keyword">extern</span> <span class="hljs-keyword">char</span> *cgiQueryString;
       <span class="hljs-keyword">int</span> cgiMain() {
       <span class="hljs-keyword">char</span> name[<span class="hljs-number">241</span>];
       <span class="hljs-keyword">char</span> number[<span class="hljs-number">241</span>];
       <span class="hljs-keyword">int</span> numb;
       cgiHeaderContentType(<span class="hljs-string">"text/html"</span>);
       <span class="hljs-built_in">fprintf</span>(cgiOut, <span class="hljs-string">"<HTML><HEAD>\n"</span>);
       <span class="hljs-built_in">fprintf</span>(cgiOut, <span class="hljs-string">"<TITLE>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

通过CGI可以重新打印一个HTML页面,例如:打印一个简单的HTML登录网页:嵌入式CGI 与HTML的数据交换_第1张图片
代码如下:

 #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, "
用户名" name="username"
"
); fprintf(cgiOut, "密  码" name="passwd"
\n"
); fprintf(cgiOut, ""name="Login">\n"
); fprintf(cgiOut, "
" size="" style="" name="regedit">
\n"
); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\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 
      #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。

  • 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中的数据,

你可能感兴趣的:(嵌入式CGI 与HTML的数据交换)