如果用C写CGI程序,一般的代码就是这个样子:
#include <stdio.h>
main()
{
printf(″Contenttype:text/html/n/n″);
printf(″<html>/n″);
printf(″<head><title>An HTML Page From a CGI</title></head>/n″);
printf(″<body><br>/n″);
printf(″<h2> This is an HTML page generated from with i n a CGI program.. .</h2>/n″);
printf(″</body>/n″);
printf(″</html>/n″);
fflush(stdout);
}
上面的代码把html语句被写死在c程序里面,很难看。以后要修改html,不光美工没法下手,程序员也得亲自重新改写程序,重新编译。
这个html模板就是解决这个问题。
如何使用
怎么使用呢,很简单。比如要显示一个Color表格,第一行是标题Color,后面几行程序生成几个颜色。html编辑要做的事情就是提供一个如下的html文件。
===============test.htm===============
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<table>
<tr>
<td> {ColumnName} </td>
</tr>
<!--BeginBlockName-->
<tr>
<td> {ColumnValue} </td>
</tr>
<!--EndBlockName-->
</table>
</BODY>
</HTML>
程序员要做的事情就是写如下的代码:
===============test.cgi===============
HTLoadFile("test.htm");
HTSetVar("ColumnName", "Color");
HTSetVar("ColumnValue", "Red");
HTParse("BlockName", 0);
HTSetVar("ColumnValue", "Green");
HTParse("BlockName", 0);
HTSetVar("ColumnValue", "Blue");
HTParse("BlockName", 0);
HTFinish();
程序生成的输出如下所示:
===============output===============
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<table>
<tr>
<td> Color </td>
</tr>
<tr>
<td> Red </td>
</tr>
<tr>
<td> Green </td>
</tr>
<tr>
<td> Blue </td>
</tr>
</table>
</BODY>
</HTML>
关键字
变量
变量定义的语法是
{variable}
用{}把变量名括起来。
注意:变量区分大小写,名字字符不得超过32个字符长,并且支持空格。
合法的变量定义形式有:
{name}, {Name}, {NAME}, {my name}, { my name }, {$$my name##}等等。注意{my name}, { my name }是两个不同的变量名,因为第二个前后有空格。
非法的变量定义:
{na{me}, {nam}e}, {n<!--ame}
推荐的命名格式为
{name}, {Name}, {MyName}之类,注意大小写,尽量不要有空格,或者其他特殊字符。
变量的用法
比如上面例子里有{ColumnValue}这个变量,最开始这个变量的值是NULL,调用HTSetVar("ColumnValue", "Red");后这个变量的值就是Red,输出的时候,该变量将被替换为Red。
然后HTSetVar("ColumnValue", "Green");再次改变这个变量的值为Green,输出的时候,该变量将被替换为Green。
注意:变量的值不限制长度。
块
块定义的语法是
<!--BeginBlockName-->
.........
<!--EndBlockName-->
其中BlockName是块名,Begin和End的首字符一定要大写,建议不要有空格或者其他特殊字符。
注意:与变量不同,一个块仅能在模板中定义一次。
块的用法
模板库把html文件视为一个顶级的无名块,块可以嵌套。每个块在html中都仅仅是形式定义,只有调用HTParse才会实例化。
比如
<!--BeginBlockName-->
<tr>
<td> {ColumnValue} </td>
</tr>
<!--EndBlockName-->
这个块定义,如果HTParse("BlockName", 0)这个函数从来没有被调用过,那么最后输出这个块定义处将是空白。
下面调用
HTSetVar("ColumnValue", "Red");
HTParse("BlockName", 0);
这两个函数,其中HTParse的第二个参数表示,如果该块被输出多次,0表示按照先调用先输出的原则,1表示先调用后输出。
那么这个块将会实例化为
<tr>
<td> Red </td>
</tr>
再调用
HTSetVar("ColumnValue", "Green");
HTParse("BlockName", 0);
又被实例化一次,为
<tr>
<td> Green</td>
</tr>
以上的例子最终按顺序显示Red, Green, Blue,如果第二个参数为1,那么最终显示为Blue, Gree, Red。
接口
int HTLoadFile(char* File);
函数加载html模板文件,File指向文件名。文件不得超过32K大小。
void HTSetVar(char* Name, char* Value);
函数改变模板中所有名字为Name的变量的值为Value,不管该变量原来的值是什么。
void HTParse(char* Name, int ReverseFlag);
函数实例化名字为Name的块,ReverseFlag控制顺序输出还是反序输出。
void HTFinish();
输出文件,并释放资源。
顺便介绍CGL
CGL是一个很轻量级的CGI C库,提供了一些接口,让用户能很容易的操作动态网页,比如读取Session, Get, Post等变量。
#include <stdio.h>
main()
{
printf(″Contenttype:text/html/n/n″);
printf(″<html>/n″);
printf(″<head><title>An HTML Page From a CGI</title></head>/n″);
printf(″<body><br>/n″);
printf(″<h2> This is an HTML page generated from with i n a CGI program.. .</h2>/n″);
printf(″</body>/n″);
printf(″</html>/n″);
fflush(stdout);
}
上面的代码把html语句被写死在c程序里面,很难看。以后要修改html,不光美工没法下手,程序员也得亲自重新改写程序,重新编译。
这个html模板就是解决这个问题。
如何使用
怎么使用呢,很简单。比如要显示一个Color表格,第一行是标题Color,后面几行程序生成几个颜色。html编辑要做的事情就是提供一个如下的html文件。
===============test.htm===============
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<table>
<tr>
<td> {ColumnName} </td>
</tr>
<!--BeginBlockName-->
<tr>
<td> {ColumnValue} </td>
</tr>
<!--EndBlockName-->
</table>
</BODY>
</HTML>
程序员要做的事情就是写如下的代码:
===============test.cgi===============
HTLoadFile("test.htm");
HTSetVar("ColumnName", "Color");
HTSetVar("ColumnValue", "Red");
HTParse("BlockName", 0);
HTSetVar("ColumnValue", "Green");
HTParse("BlockName", 0);
HTSetVar("ColumnValue", "Blue");
HTParse("BlockName", 0);
HTFinish();
程序生成的输出如下所示:
===============output===============
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<table>
<tr>
<td> Color </td>
</tr>
<tr>
<td> Red </td>
</tr>
<tr>
<td> Green </td>
</tr>
<tr>
<td> Blue </td>
</tr>
</table>
</BODY>
</HTML>
关键字
变量
变量定义的语法是
{variable}
用{}把变量名括起来。
注意:变量区分大小写,名字字符不得超过32个字符长,并且支持空格。
合法的变量定义形式有:
{name}, {Name}, {NAME}, {my name}, { my name }, {$$my name##}等等。注意{my name}, { my name }是两个不同的变量名,因为第二个前后有空格。
非法的变量定义:
{na{me}, {nam}e}, {n<!--ame}
推荐的命名格式为
{name}, {Name}, {MyName}之类,注意大小写,尽量不要有空格,或者其他特殊字符。
变量的用法
比如上面例子里有{ColumnValue}这个变量,最开始这个变量的值是NULL,调用HTSetVar("ColumnValue", "Red");后这个变量的值就是Red,输出的时候,该变量将被替换为Red。
然后HTSetVar("ColumnValue", "Green");再次改变这个变量的值为Green,输出的时候,该变量将被替换为Green。
注意:变量的值不限制长度。
块
块定义的语法是
<!--BeginBlockName-->
.........
<!--EndBlockName-->
其中BlockName是块名,Begin和End的首字符一定要大写,建议不要有空格或者其他特殊字符。
注意:与变量不同,一个块仅能在模板中定义一次。
块的用法
模板库把html文件视为一个顶级的无名块,块可以嵌套。每个块在html中都仅仅是形式定义,只有调用HTParse才会实例化。
比如
<!--BeginBlockName-->
<tr>
<td> {ColumnValue} </td>
</tr>
<!--EndBlockName-->
这个块定义,如果HTParse("BlockName", 0)这个函数从来没有被调用过,那么最后输出这个块定义处将是空白。
下面调用
HTSetVar("ColumnValue", "Red");
HTParse("BlockName", 0);
这两个函数,其中HTParse的第二个参数表示,如果该块被输出多次,0表示按照先调用先输出的原则,1表示先调用后输出。
那么这个块将会实例化为
<tr>
<td> Red </td>
</tr>
再调用
HTSetVar("ColumnValue", "Green");
HTParse("BlockName", 0);
又被实例化一次,为
<tr>
<td> Green</td>
</tr>
以上的例子最终按顺序显示Red, Green, Blue,如果第二个参数为1,那么最终显示为Blue, Gree, Red。
接口
int HTLoadFile(char* File);
函数加载html模板文件,File指向文件名。文件不得超过32K大小。
void HTSetVar(char* Name, char* Value);
函数改变模板中所有名字为Name的变量的值为Value,不管该变量原来的值是什么。
void HTParse(char* Name, int ReverseFlag);
函数实例化名字为Name的块,ReverseFlag控制顺序输出还是反序输出。
void HTFinish();
输出文件,并释放资源。
顺便介绍CGL
CGL是一个很轻量级的CGI C库,提供了一些接口,让用户能很容易的操作动态网页,比如读取Session, Get, Post等变量。