选择显示字体大小

利用cgi方式实现web查询

摘要:本文分析讨论了将web与后以数据源相连的方法之一——公共网关界面cgi的概念与特点,并以成绩查询系统作为实例详细分析了用c语言进行cgi程序设计的方法与过程。
关键词:cgiweb集成

cgi简述
公共网关界面(cgi)是一种编程标准,它规定了web服务器调用其它可执行程序(cgi程序)的接口协议标准。cgi程序通过web服务器与运行web服务器调用其它可执行程序交互,它接受web浏览器发送给web服务器的信息,并进行处理,然后将结果再送给web服务器web浏览器。cgi程序可以用任何程序设计语言编写,如shell、perl、c、java等,用c语言编写的cgi程序具有速度快、安全性高等特点。cgi程序
通常用于加入查询机制、搜索机制、交互式应用及其它一些应用。
cgi接口标准包括输入、环境变量、标准输出三部分,cgi程序可以通过标准输入stdin)从web服务器得到输入信息,例如从form中得到数据,这就是常用的post方法。由于不同的操作系统采用了不同的信息交换机制,其参数传递的处理过程也有别,在unix与dos中,环境信息反映着本级程序运行时的某些系统状况,可用于父序与子程序间的信息传递,cgi正是通过设量环境变量在服务器与客户机间传递数
据的,各操作系统都提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。web服务器cgi接口也设置了一些环境变量用以传递一些重要的参数。cgi程序通过标准输出(stdout)将输出信息传送给web服务器,传送给服务器的信息可以是html文本也可以是纯文本。本文将利用c语言编写一个cgi应用程序——学生成绩查询系统,并分析了cgi程序设计的方法、过程、技巧。

二、成绩查询系统介绍
一个在www环境下的学生成绩公布栏必将成为日后各类成绩发布的主要手段,每位学生交将有自己的密码,所以不必担心成绩上网之后的保密性。任何学生以任何形式上网进入本站点的成绩查询系统之后,只要输入自己的系列、班别、学号及密码,便可以利用这个学生绩查询系统查询自己的成绩,该设计思路与系统不仅适合各类校内部的成绩发布,也适合于全国高考、统考等大规模考试的成绩发布。本文介
绍的只是一个功能单一的查询系统,若需完善还需加入成绩维护部分,由成绩管理者进行内容维护,包括成绩输入、修改、删除等功能。

三、html form格式部分
3.1 form输放的分解
unix系统上,cgi信息是利用stdin/stdout方式传输的,所以若要编写一个c语言的cgi程序,就必须要了解如何解剖与截取stdin的cgi信息。当用户提交一个html form时,web浏览器首先对form中的数据以名字/值对的形式进行编码,并发送给web 服务器,然后再由web服务器传递给cgi程序,其格式如下:
name1=valuel&name2=value2&name3····
名字是form中定义的input,select等标置名字,值是用户输入或选择的标值,在程序中将对其进行分析与解码,将其分解成一组组的名字/值对,这个过程是通过在输入流中查找字符“=”与“&”来完成的,每当找到字符“=”,标志着一个form变量名字的结束,当找到字符“&”,标志着一个form变量值的结束。当名字/值对分解完之后,还须将输入中的一些特殊字符转换成相应的ascii字符,如需将“+”转换成空格符,将一些特殊字符转换成ascii字符,对以上分所分析的分解与转换过程,在下面的程序中有详细注明。
3.2html form文件
成绩查询系统的html文件p.htrnl
<title>学生成绩查询系统</title>
<h1>学生成绩查询系统</h1>
<form method=&quot;post&quot;action=&quot;url地址&quot;
<h3>系列:<selectname=&quot;department&quot;>
<option>计算机系
<option>英语系
<option>无线电系
</select><p>
学号:<inpnt type=&quot;text&quot;name=&quot;id&quot;><p>
密码:<inpnt type=&quot;password&quot;name&quot;password&quot;><p>
<inpnt type=&quot;submit&quot;value&quot;查询”>
<inpnt type+&quot;reset&quot;value=&quot;放弃”〉
</form>

四、学生成绩查询cgi程序
cgi程序分解、接收html form中提供的查询条件,然后查询出该学生的成绩并返回。学生成绩有两个数据文件,一个是***sub dat,其中含有学生的各个科目,*** 表示系别,如计算机系的科目文件是compsub dat,英语系的科目文件是engsub.dat,无线电系科目文件是elecsub.dat;另一个数据文件是***scoer.dat,该文件中包含有每个学生的学号、密码与成绩,***表示系别,如计算机系的学生成绩文件是compscore.dat,同理,其他系的学生成绩文件按此原则以此类推。当学生输入的学号及密码符合数据文件的内容时,就会显示该学生的成绩。
main(int argc,char*argv[])
{
register int i,m=0;
int len;
file*fp,*fpl,*fopen();
char filename1[100],filename2[100],title[100];/*设定资料变量*/
char subject[10][10];
char id[100][10],password[100][10];
int score[100][20],sum[100],allsum;
float avg[100],alltotalavg;
int rank,number,index,find,j,kind;
printf(&quot;content-type:text/html%c%c&quot;,10,10);
len=atoi(getenv(&quot;content_lengith&quot;));
for(i=0;len && (!feof(stdin));i++){
m=i
inputs[i].val=readdstdin(stdin,&,&len);/*读stdin信息*/
addtospace(inputs[i].val);
convert(inputs[i].val);
inputs[i].name=readdata(inputs[i].val,=);
}
strcpy(filename1,&quot;/score/setup/&quot;);
stucpy(filename2,&quot;/xcore/data/&quot;);
if(strcmp(inputs[o].val,&quot;计算机系/)==0
strcat(filename1,&quot;compusb.dat&quot;);
strcat(filename2,&quot;compscore.dat&quot;);
}
if(strcmp(inputs[o].val,&quot;英语系&quot;)==0
strcat(filenamel,&quot;engsub.dat&quot;);
strcat(filename2,&quot;engscore.dat&quot;);
}
if(strcmp(inputs[o].val,&quot;无线电系&quot;)==0
}
strcat(filename1,&quot;elecsub.dat&quot;);
strcat(filename2,&quot;elecscore.dat&quot;);
}
fp=fopen(filename1,&quot;r&quot;);/*打开文件*/
kind=0;
while(fscanf(fp,&quot;%s&quot;,subject[kind]!=eof
kind=kind+1;
fclose(fp);

fp1=fopen(filename2,&quot;r&quot;);/*打开文件*/
allsum=0;
for(i=0;i<100;i++)
{
numbde=i;
if(fscanf(fp1,&quot;%s%s&quot;,id[i],
password[i]!=eof){
sum[i]=0;
for{j=0;j<kind;j++){
fscanf(fp1,&quot;%d&quot;,&score[i][j]);
sum[i]+=score[i][j];
}
avg[i]=sum[i]/kind;
allsum+=sum[i];
}
else
break;
}
fclose(fp1);
find=0;
if(strcmp(inputs[2].val,id[i])==0&&
strcmp(inputs[3].val,password[i]==0){
index=i;
find=i;
}
}
if(find==0)
{
printf{&quot;<h>输入有误,请再输一次!</h1>\n&quot;);
}
else
{
rank=1
for(i=o;i<number;i++)
if(sum[index]<sum[i])
rank=rank+1;
slltotalavg=allsum/number;
printf(&quot;<center><h1>学生成绩查询系统</h1></center>&quot;);
pritf(&quot;\n<center>查询学生学号:%s</center>
&quot;,
inputs[2].val);
printf(&quot;\n<center>成绩如下:</certer><hr>&quot;);

for(i=0;i<kind;i++)
printf{&quot;%s\t&quot;,subject[kind]);
printf(&quot;总分
\n&quot;);
for(i=0;i<kind;i++)
printf(&quot;%d\t&quot;,score[index][i]);
printf[&quot;%d
\n&quot;,sum[index]);
}
}

五、结束语
本文以学竽成绩查询系统作为实例,详细分析了用c语言进行cgi程序设计的方法与过程,随着interet/intr.net应用的深入,将web与多台数据库联接的需求也日益迫切,cgi可以使得web能够能最低程序的复杂性与其后台信息集成,成为一种支持多种类型的通用环境,但是由于在cgi方式中每执行一次交互都需启动一个外部程序,因此其在实时应用方面受到了限制,因而,web sener api及jocbc等应用方式也正在成熟。

参考文献
1、华南理工大学信息网络工程研究中心编《inrte.net国际互连网》中山大学出版
社
2、蔡奇玉等《www上htmlcgi写作大全》北京理工大学出版社
3、肖治延用c语言进行cgi程序设计微电脑世界1996.5
4、[美]tim ritchey 《javascrip for.netscape》清华大学出版社   


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons