SSI经常和CGI配合使用,这点不仅是在Enet_io这个例程中可以看到,在S2E例程中也是可以看到的。
在Enet_io例程中,我们在提交表单中的参数之后,CGI 的参数提取函数会提取参数,然后依据参数对设备进行相关的设置或控制,然后要返回同一个页面:io_cgi.ssi
定义CGI默认返回的页面:
#define DEFAULT_CGI_RESPONSE "/io_cgi.ssi"
这个定义在enet_io.c里可以找到的。
这个默认的.ssi格式的返回页面为什么能够显示执行了CGI函数后的信息呢?
其实原理很简单,我们在设计网页的时候就预先放置了SSI tag。
<tr> <td align="left" valign="top">LED State</td> <td align="center" valign="top"><!--#LEDtxt--></td> <td align="center" valign="top"><input name="LEDOn" value="1" type="checkbox"></td> </tr> <tr>
其中的<!--#LEDtxt-->就是一个SSI tag。但它在浏览器上是不会显示出来的。
在这个enet_io例程的fs文件夹下的io_cgi.ssi中一共有5个SSI tag。你可以试着找找其它四个。网页文件都在fs文件夹下。
所以当web服务器准备向浏览器发送这个页面的时候,检查到是ssi后缀的网页文件,它就会对其进行扫描,扫描到<!--#后,就认为是找到了一个SSI tag,根据tag的名称获取信息,并在SSI tag的后边插入这些信息,再发送给浏览器。
所以你看到的是修改过的网页。这就是基本的原理。具体的细节你可以去看程序,然后有问题可以在下面发帖一起讨论。
其它的SSI tag都是类似的方法。
可以看到这个页面不是我们常见的html后缀,而是.ssi,其实也还可以是:
const char *g_pcSSIExtensions[] = { ".shtml", ".shtm", ".ssi", ".xml" }; 中的一种扩展名。
只要我们编写的网页最后以这些后缀命名,在发送前就会去扫描其中的SSI tag并由SSIHandler()插入信息。
当然,还有一些相关的工作是需要去做的,我这里只是提一下思路。帮助理解原理。只要原理搞清楚了,就不会觉得那么神秘了,在开发的时候就知道要去修改哪些地方。
我想这也就是TI Stellaris提供的例程能够加快开发进程的原因之一吧。
[ 本帖最后由 academic 于 2010-11-25 18:09 编辑 ] |