传统的Web应用开发局限于有限的静态页面(HTML静态页面),不利于系统的扩展,不能提供及时信息,而且修改维护麻烦,所以建立一个动态Web应用程序尤为重要。一方面根据访问者的不同请求返回不同的访问信息,即满足服务的多样性;另一方面,可以直接通过后台管理页面发布和修改信息即可,再也不需要修改页面程序。

  下面介绍一种简单的创建动态页面的方法和技术:

  CGI:Common Gateway Interface,公共网关接口

  CGI, 一种基于浏览器的输入、在Web服务器上运行的程序方法。CGI脚本简单地讲是个运行在Web服务器上的程序, 有浏览器的输入触发. 这个脚本通常象服务器和系统中其他程序如数据库的桥梁。CGI是一种接口的标准,并不区分编程语言,也就是说,CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。CGI会将标准输出重定向到给http的response,返回给浏览器。其操作流程如下图:

首先用户需要在浏览器地址栏输入URL地址,或者单击链接来调用相应的CGI程序,例如chenbjin.tk/cgi-bin/test.cgi。通过URL地址,客户端取得与域名为chenbjin.tk的服务器主机连接,通过Web服务器调用cgi-bin目录下的test.cgi程序,然后将动态生成的HTML页面输出,最后由Web服务器通过网络将生成的HTML页面返回给客户端浏览器。

  CGI程序在服务器端执行,并可以和Web服务器在同一主机上。常用的CGI语言有Perl、shell、Python,在windows上也可以用C、C++或Java等进行编写。下面简单介绍shell编写CGI程序。涉及web服务器的搭建,以及具体CGI环境的配置,这里不做详细介绍,有兴趣的朋友可看文章最后的链接。

#!/bin/sh

echo "Content-type:text/html"
echo
echo '<html>'
echo '<head>'
echo '<title>Hello World - First CGI Program</title>'
echo '</head>'
echo '<body>'
echo '<h2>Hello World! This is my first CGI program</h2>'
echo '</body>'
echo '</html>'

  第一行是个特殊的命令,告诉UNIX系统这是个shell脚本;

第三行是Web服务器用来告诉浏览器输出这个文本是什么类型的. 有关content-type解释可以见有关HTML的说明。有三个类型的头部: Content-type, Location, 和Status。其中 Content-type 最普遍的。注意content-type 后面必须跟一个空行. 如果你没有空行,服务器将无法搞清这个头部在哪里结束。

再接着下面是普通的html页面内容,相信大家都能看懂。

对于CGI而言,最主要就是接收到用户的请求,从请求中,解析出get或者post方法传递过来的参数。这点,我认为也是对于初学者最麻烦的地方,这里提供一个已经完成这种功能的脚本—proccgi.sh(http://www.fpx.de/fp/Software/proccgi.sh)。这个脚本可以直接解析出get和post方法传过来的数据。

这里以一个简单的form表单来描述:

<form action="http://chenbjin.tk/cgi-bin/test.cgi" method="post">
email: <input type="text" name="email"/>
user: <input type="text" name="user"/>
<input type="submit" value="submit"/>
</form>

提交邮箱及用户名到test.cgi,此时test.cgi便能获取表单中传递的数据。

使用方法:在test.cgi脚本中调用eval './proccgi.sh $*'语句,然后使用"$FORM_"和参数的key,就可以获得参数的值了,如email="$FORM_email"。

#!/bin/sh
eval 'proccgi.sh $*'
mail=$FORM_email
user=$FORM_user
echo Content-type: text/plain
echo
echo "传递的参数及其值:[mail,$mail] ,[user,$user]"
echo done.

  虽然CGI实现了网站动态性,但是CGI也存在很多不足之处:

1、需要为每个请求启动一个操作CGI程序的系统进程,如果请求非常频繁,开销会很大

  2、需要重复编写网络协议的代码以及进行编码,耗时长。

人往高处走,伟大的程序员都会寻求更优的途径来解决问题,既然CGI有不足,那自然会有新的技术出现解决这些问题。

---------------------------------------------------

  有兴趣的同学可通过以下链接进一步学习CGI:

1、CGI入门教程:http://www.jdon.com/idea/cgi.htm

  2、c语言写CGI程序:http://www.cs.tut.fi/~jkorpela/forms/cgic.html

  3、perl写CGI程序:http://www.yiibai.com/perl/perl_cgi.html

  4、python写CGI程序:http://www.yiibai.com/python/python_cgi_programming.html

  4、proccgi.sh源网址:http://www.fpx.de/fp/Software/ProcCGIsh.html

CGI实现页面的动态生成的更多相关文章

  1. SSI注入--嵌入HTML页面中的指令,类似jsp、asp对现有HTML页面增加动态生成内容,见后面例子

    SSI注入漏洞总结 from:https://www.mi1k7ea.com/2019/09/28/SSI%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E6%80%BB%E ...

  2. 抓取Js动态生成数据且以滚动页面方式分页的网页

    代码也可以从我的开源项目HtmlExtractor中获取. 当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢? 如类似今日头条这样的网 ...

  3. sitemap.xml 静态和动态生成页面 shopnc二次开发 动态生成sitemap.xml

    Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页.最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间.更改的 ...

  4. Javascript动态生成的页面信息爬取和openpyxl包FAQ小记

    最近,笔者在使用Requests模拟浏览器发送Post请求时,发现程序返回的html与浏览器F12观察到的略有不同,经过观察返回的response.text,cookies确认有效,因为我们可以看到返 ...

  5. 根据html页面模板动态生成html页面(c#类)

    本文转载自:http://www.cnblogs.com/yuanbao/archive/2008/01/06/1027985.html点击打开链接 一直以为动态生成静态页面不好做,昨天在网上找了下, ...

  6. 动态生成页面(一)——ASP.NET中Literal使用

    在页面中加入内容时,假设是静态内容.无需使用容器,能够直接将标记作为HTML直接加入到页面中:可是,假设是动态内容,则必须借助容器将内容加入到页面中.典型的容器有:Label控件.Literal控件. ...

  7. Python PageFactory-使用配置文件动态生成页面PageObject

    需求 在Python Selenium 的 PageObject模式中,一般每个页面需要写一个类, 一种PageObject的写法如下: class BaiduPageObject(object): ...

  8. C#.NET动态页面静态化生成

    一,动态页面生成静态也的思路是怎样呢? 1>首先我们都是需要有一个静态模板,这模板的作用就是静态页的最基本模板,如下代码: <!DOCTYPE HTML PUBLIC "-//W ...

  9. MVC:页面提交JQ动态生成的输入框的值得解决方案:

    一,动态生成JS写法 <script type="text/javascript"> , , , ); function Additional() { var num ...

随机推荐

  1. ruby开源项目之Octopress:像黑客一样写博客(zhuan)

    ruby开源项目之Octopress:像黑客一样写博客 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 今年一直推荐的一种写作方式.markdown语法快速成文,git ...

  2. 转: HTTP协议的头信息详解

    通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可 选的消息体组成.HTTP的头域包括通用头,请求头,响 ...

  3. 快排找第k大模板

    int get_kth(int l,int r) { if (l==r) return a[r]; ]; while (i<j) { while (a[i]<mid) i++; while ...

  4. node.js安装及grunt插件,如何进行脚本压缩

    http://gruntjs.com/pluginshttp://gruntjs.com/getting-startedhttp://gruntjs.com/configuring-tasks#glo ...

  5. IDEA调试javaScript

            谈起JavaScript调试,大家可能想到的就是FireFox下的FireBug,这毫无疑问,FireBug基本已经成为JavaScript开发人员的必备工具.在本文中,将向大家介绍如 ...

  6. JavaScript数字精度上代码。

    /**不能超过 9007199254740992 * floatObj 包含加减乘除四个方法,能确保浮点数运算不丢失精度 * * 我们知道计算机编程语言里浮点数计算会存在精度丢失问题(或称舍入误差), ...

  7. struts2 文件的上传下载 表单的重复提交 自定义拦截器

    文件上传中表单的准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设 ...

  8. 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案

    转自:http://www.jianshu.com/p/89687f618837 原因分析   当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下图所示的错误,报的错误 ...

  9. C# 开发XML Web Service与Java开发WebService

    一.web service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量 ...

  10. Unity4.3.3激活

    Unity4.X Win版本的破解方法: <ignore_js_op> 1.安装unity4.X,一路按提示下一步,要断网,直到激活运行软件后再联网2.将Unity 4.x Pro Pat ...