
WAP建站入门教程
发布时间:2006-04-10 12:45:42 来源:天极网 网友评论 0 条六、动态输出WML页面
以下将要讲述的是使用各种服务器端脚本语言编写动态输出WML页面。这里主要以几种最常见服务器端编程方式为例子。其他的服务器端编程方式都可以依此类推。
无论使用哪种服务器端编程方式来动态输出WML页面,其关键就是输出Content-type为text/vnd.wap.wml。然后按照WML的语法格式输出WML内容就可以达到目的。当然其中针对不同的编程方式还有一些细节问题。
无论使用哪种服务器端编程方式来动态输出WML页面,其关键就是输出Content-type为text/vnd.wap.wml。然后按照WML的语法格式输出WML内容就可以达到目的。当然其中针对不同的编程方式还有一些细节问题。
使用ASP动态输出WML页面
- 使用记事本输入下面的ASP程序(图2-26):
<%@ Language=VBScript %>
<% Response.ContentType="text/vnd.wap.wml" %><?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main" title="ASP WML">
<p>
Hello
</p>
</card>
</wml>
<% Response.ContentType="text/vnd.wap.wml" %><?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main" title="ASP WML">
<p>
Hello
</p>
</card>
</wml>
图 2-26 Hello.asp
- 保存为hello.asp。并且是它和hello.wml在同一个子目录下。注意:记事本在保存的时候只识别txt文件扩展名,因此在保存之后应该手工修改文件扩展名。为了方便起见,可以使用其他的文本编辑工具,或者是使用专门的ASP编辑工具(例如:Viusal InterDev)。
- 启动IIS服务器管理。在“默认的Web站点”下找到“wap”目录,用鼠标右键点击它,选择属性“Properties”,就会弹出一个对话框,里面有好多配置选项。 在“虚拟目录”标签页当中有一项应用程序设置。将“许可”一项设置为:“执行(包括脚本)”。确定后,退出IIS Console。
- 打开WinWAP,马上Stop它,在URL栏里输入:“http://127.0.0.1/wap/hello.asp”,并按下回车。等着欣赏第一个ASP页面(图2-27)。
图 2-25 WinWAP测试结果显示
- 如果读者熟悉ASP,读者也许会注意到:为什么在<?xml version="1.0"?>并没有换行写。注意,这是必须的!否则,程序在WinWAP下可能没有任何问题,但是在其他模拟器上,可能就会导致编译错误!因为在<?xml version="1.0"?>前面不允许有多余的空格或者换行。
CGI编程时应该注意的问题
使用CGI程序生成动态WML页面和使用CGI编程生成动态HTML的方式基本一样。只是在返回WML页面前,先要输出Content-Type为text/vnd.wap.wml,然后再输出WML内容。
输出的返回格式:"Content-type: text/vnd.wap.wml/n/n"。
输出的返回格式:"Content-type: text/vnd.wap.wml/n/n"。
使用标准C动态输出WML页面
这里有一个非常简单的标准C例子,该例子适合于Windows和Unix。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void GenerateCGIHeader();
void GenerateCGIFooter();
/*--------------------------------------------------------------*/
int main(int argc, char* argv[])
{
char tmpBuf[128];
char strGET[]="GET";
if (getenv("REQUEST_METHOD") == NULL)
{
printf("This script is not intended to run from shell./n");
return -1;
}
// Check that the request method is GET (see CGI specs)
strcpy(tmpBuf, getenv("REQUEST_METHOD"));
if (strcmp(tmpBuf, strGET) != 0)
{
printf("This script requires use of GET-method./n");
return -1;
}
/* Create a header for our reply */
GenerateCGIHeader();
/* Display operating system-style date and time. */
_strtime( tmpBuf );
printf( "OS time:%s/n", tmpBuf );
_strdate( tmpBuf );
printf( "OS date:%s/n", tmpBuf );
/* Create a footer for our reply */
GenerateCGIFooter();
return 0;
}
/*--------------------------------------------------------------*/
void GenerateCGIHeader()
{
/* Generate header for CGI response */
printf("Status: 200/n");
printf("Content-type: text/vnd.wap.wml/n/n");
printf("<?xml version=/"1.0/"?>/n");
printf("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN");
printf("/" /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n");
printf("<wml>/n");
printf(" <template>/n");
printf(" <do type=/"prev/" label=/"Back/">/n");
printf(" <prev/>/n");
printf(" </do>/n");
printf(" </template>/n");
printf(" <card id=/"datecard/" title=/"CGIDate/">/n");
printf(" <p>/n");
}
/*--------------------------------------------------------------*/
void GenerateCGIFooter()
{
/* Generate footer for CGI response */
printf(" </p>/n");
printf(" </card>/n");
printf("</wml>/n");
}
#include <stdlib.h>
#include <time.h>
#include <string.h>
void GenerateCGIHeader();
void GenerateCGIFooter();
/*--------------------------------------------------------------*/
int main(int argc, char* argv[])
{
char tmpBuf[128];
char strGET[]="GET";
if (getenv("REQUEST_METHOD") == NULL)
{
printf("This script is not intended to run from shell./n");
return -1;
}
// Check that the request method is GET (see CGI specs)
strcpy(tmpBuf, getenv("REQUEST_METHOD"));
if (strcmp(tmpBuf, strGET) != 0)
{
printf("This script requires use of GET-method./n");
return -1;
}
/* Create a header for our reply */
GenerateCGIHeader();
/* Display operating system-style date and time. */
_strtime( tmpBuf );
printf( "OS time:%s/n", tmpBuf );
_strdate( tmpBuf );
printf( "OS date:%s/n", tmpBuf );
/* Create a footer for our reply */
GenerateCGIFooter();
return 0;
}
/*--------------------------------------------------------------*/
void GenerateCGIHeader()
{
/* Generate header for CGI response */
printf("Status: 200/n");
printf("Content-type: text/vnd.wap.wml/n/n");
printf("<?xml version=/"1.0/"?>/n");
printf("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN");
printf("/" /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n");
printf("<wml>/n");
printf(" <template>/n");
printf(" <do type=/"prev/" label=/"Back/">/n");
printf(" <prev/>/n");
printf(" </do>/n");
printf(" </template>/n");
printf(" <card id=/"datecard/" title=/"CGIDate/">/n");
printf(" <p>/n");
}
/*--------------------------------------------------------------*/
void GenerateCGIFooter()
{
/* Generate footer for CGI response */
printf(" </p>/n");
printf(" </card>/n");
printf("</wml>/n");
}
在Windows环境下,使用Viusal C&C++ 6.0创建一个Windows Console Application——WapCCGI。然后将该文件加入到项目中,编译生成WapCCGI.exe。将该可执行文件拷贝到wap子目录下。启动Nokia WAP Toolkit,在“Go”下选择“Open Location”,并输入URL地址(图2-28):
图 2-26 输入URL地址
在选择“OK”以后,模拟器上出现系统当前的日期和时间(图2-29):
图 2-27 测试结果显示
使用Perl动态输出WML页面
# HTTP header with correct MIME type
print "Content-type: text/vnd.wap.wml/n/n";
# WML starts here with the correct XML doc type declaration
print "<?xml version=/"1.0/"?>";
print "<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"";
print "/"http://www.wapforum.org/DTD/wml_1.1.xml/">";
……
更多的Perl 代码,输出WML页面内容。
……
print "Content-type: text/vnd.wap.wml/n/n";
# WML starts here with the correct XML doc type declaration
print "<?xml version=/"1.0/"?>";
print "<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"";
print "/"http://www.wapforum.org/DTD/wml_1.1.xml/">";
……
更多的Perl 代码,输出WML页面内容。
……
按照以上的程序开头便可以输出动态的WML页面。下面有一段更详细的教程,这个教程是为以下开发者准备的:
- 知道如何编写WML页面和卡片,并且了解自己的工作。
- 知道如何配置自己服务器,使之能够运行Perl。
- 有CGI的基本知识,并且了解Perl的语法。
从表面上来说,使用CGI来产生WML页面和产生HTML页面没有太大的区别。一旦读者仔细地看一下,就会明白WML所包含的新内容的确还是与其他的页面动态生成有所不同。
假设,老板需要做一个可以通过电话来访问电话目录。公司现在只有两个职员,但是将要不断扩大。因此,肯定不会去做一个固化的目录。相反将把数据保存在一个文本文件中,通过动态生成WML页面的来显示信息。
首先,将要建立一个“people_data.txt”,如下所示:
假设,老板需要做一个可以通过电话来访问电话目录。公司现在只有两个职员,但是将要不断扩大。因此,肯定不会去做一个固化的目录。相反将把数据保存在一个文本文件中,通过动态生成WML页面的来显示信息。
首先,将要建立一个“people_data.txt”,如下所示:
# Format is:
# Name|phone num|fax num|Title
Linus Smith|123-4567|098-7654|Director of OS Development
Jane Doe|123-4568|098-7655|Senior VP of OS Research
# Name|phone num|fax num|Title
Linus Smith|123-4567|098-7654|Director of OS Development
Jane Doe|123-4568|098-7655|Senior VP of OS Research
可以看出“|”符号是用来区别字段的。“#”是用来表示注释的。这些字符没有其他的意义,仅仅是一般的转换。
下面,需要决定最后的WML文件将是什么样子。在同老板商量之后,决定如下:
下面,需要决定最后的WML文件将是什么样子。在同老板商量之后,决定如下:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card title="Telephone Book" id="index">
<p>
Welcome to Widgets Inc. Telephone Book
<a href="#view">Click to view list</a>
</p>
</card>
<card title="List of Names" id="view">
<p>
<a href="#linus_info">Linus Smith - 123-4567</a>
<a href="#jane_info">Jane Doe - 123-4568</a>
</p>
</card>
<card title="Info for Linus Smith" id="linus_info">
<p>
Director of OS development
Phone number: 123-4567
Fax number: 098-7654
</p>
</card>
<card title="Info for Jane Doe" id="jane_info">
<p>
Senior VP of OS research
Phone number: 123-4568
Fax number: 098-7655
</p>
</card>
</wml>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card title="Telephone Book" id="index">
<p>
Welcome to Widgets Inc. Telephone Book
<a href="#view">Click to view list</a>
</p>
</card>
<card title="List of Names" id="view">
<p>
<a href="#linus_info">Linus Smith - 123-4567</a>
<a href="#jane_info">Jane Doe - 123-4568</a>
</p>
</card>
<card title="Info for Linus Smith" id="linus_info">
<p>
Director of OS development
Phone number: 123-4567
Fax number: 098-7654
</p>
</card>
<card title="Info for Jane Doe" id="jane_info">
<p>
Senior VP of OS research
Phone number: 123-4568
Fax number: 098-7655
</p>
</card>
</wml>
每当增加新成员的时候,都不得不重新修改文件。这不是一个好办法。但是如果向文本文件中增加内容,那将是一个不会编写WML页面的程序员也会的事情。为了实现这个目标,使用以下的脚本:
#!/usr/bin/perl –w
use strict;
use CGI qw/:standard/;
# Our CGI object
my $q = new CGI;
use strict;
use CGI qw/:standard/;
# Our CGI object
my $q = new CGI;
以上的内容是设置Perl环境。使用CGI模块来进行HTTP数据显示和处理。然而在这个例子当中,将使用尽量少的CGI模块,读者将会在将来的教程当中明白处理服务是多么的复杂。
# data file to get info from
my $data = "people_data.txt";
# Template for the title card
my $title_card = qq (
<card title="Telephone Book" id="index">
<p>
Welcome to Widgets Inc. Telephone Book<br/>
<a href="#view">Click to view list</a>
</p>
</card>
);
# Initial id of the first record
my $id = "a";
my $data = "people_data.txt";
# Template for the title card
my $title_card = qq (
<card title="Telephone Book" id="index">
<p>
Welcome to Widgets Inc. Telephone Book<br/>
<a href="#view">Click to view list</a>
</p>
</card>
);
# Initial id of the first record
my $id = "a";
这里已经创建了一个字符串,它将作为标题卡片。当然还有需要创建的动态ID。(选择‘a’,是因为它是一个简单的字符,可以很容易地增加)既然每个记录都有唯一的ID(因此可以把它作为头一个卡片)。ID将从‘a’开始,然后每找到一个新记录就增加一个。要一次性将所有的名字都生成卡片。然后使用一个初始化的缓冲区来显示成员的数据内容。
# Now iterate over the
data file building data dynamically
open(FILE,"$data") || die "Can't open $data: $!/n";
while (<FILE>) {
chomp;
next if (/^/#/);
my ($name, $phone, $fax, $position) = split(//|/);
data file building data dynamically
open(FILE,"$data") || die "Can't open $data: $!/n";
while (<FILE>) {
chomp;
next if (/^/#/);
my ($name, $phone, $fax, $position) = split(//|/);
打开自己的文件(当然要检查打开权限,保证能够打开),现在就可以读取了(注意:要跳过以“#”开头的行)。其他的部分,只需要从已经定义和产生的文件中读取就可以了。显然在读取的过程当中,需要做一定的检查,保证每个部分的确有数据。
# Build up the view card
$view_card .= build_view_card($name, $phone, $fax, $position);
# Build up info cards
$all_info_card .= build_info_card($name, $phone, $fax, $position);
}
$view_card .= build_view_card($name, $phone, $fax, $position);
# Build up info cards
$all_info_card .= build_info_card($name, $phone, $fax, $position);
}
这里,将从文件中提取的数据传给两个函数。他们将返回由这些参数所确定的卡片。注意到Perl的“.= ”操作符,函数返回的字符串将不断地扩充。
# Finish off the card
$view_card .= "</p> </card>";
my $header = qq (
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml.xml">
);
# Template for the entire deck
my $deck = qq(
$header
<wml>
$title_card
$view_card
$all_info_card
</wml>
);
print $q->header('text/vnd.wap.wml');
print $deck;
$view_card .= "</p> </card>";
my $header = qq (
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml.xml">
);
# Template for the entire deck
my $deck = qq(
$header
<wml>
$title_card
$view_card
$all_info_card
</wml>
);
print $q->header('text/vnd.wap.wml');
print $deck;
这里非常简单地将他们绑在一起。打印文件头,建立卡片,并且将他们动态地放在一起。当做好这一切之后,需要输出一个Content-type头 text/vnd.wap.wml。
现在来看一下建立卡片的两个子过程:
现在来看一下建立卡片的两个子过程:
sub build_view_card {
$id++;
my ($name, $phone, $fax, $position) = @_;
my $info_item = qq (
<a href="#$id">$name - $phone</a><br/>
);
return $info_item;
}
$id++;
my ($name, $phone, $fax, $position) = @_;
my $info_item = qq (
<a href="#$id">$name - $phone</a><br/>
);
return $info_item;
}
这个代码将接收信息,并把这些信息插入到一个简单的模板里面。一个非常重要的一点是每次都在增加“$id”变量的数值。这个保证每个记录都有唯一的id号。Perl允许直接使用“++”操作符,使得从‘a’增加到‘b’。
sub build_info_card {
# Template for card showing info for a single person
my ($name, $phone, $fax, $position) = @_;
my $info_card = qq (
<card title="Info for $name" id="$id">
<p>
$position<br/>
Phone number: $phone <br/>
Fax number: $fax <br/>
<do type="prev"><prev/></do>
</p>
</card>
);
return $info_card;
}
# Template for card showing info for a single person
my ($name, $phone, $fax, $position) = @_;
my $info_card = qq (
<card title="Info for $name" id="$id">
<p>
$position<br/>
Phone number: $phone <br/>
Fax number: $fax <br/>
<do type="prev"><prev/></do>
</p>
</card>
);
return $info_card;
}
在这个子过程当中,做了和前面一样的事情,只不过用了不同的模板。注意到已经在前面的函数中增加了“$id”的数值,因此,在这个函数中只需要返回一个新的卡片就可以了。
这就是全部过程,现在已经有了一个动态的电话本。当然这个教程不是一个很好的解决办法,至少他需要一个人手工来修改txt文件。另外,WML页面有大小的限制。但是无论如何,以上就是全部的过程。
这就是全部过程,现在已经有了一个动态的电话本。当然这个教程不是一个很好的解决办法,至少他需要一个人手工来修改txt文件。另外,WML页面有大小的限制。但是无论如何,以上就是全部的过程。
全站资源
- 微软官方入门教程19:轻松掌握Vista系统的快
- 微软2008大冲击,预借Vista SP1力促Vista市
- 在收件箱中获得 Windows Vista 的最新更新
- 微软官方Vista入门教程全集19篇(Vista学院
- Windows Vista 的成功将势不可挡
- 快快抛弃Vista,拥抱XP SP3!你觉得呢?
- 浅谈Vista系统关闭虚拟内存与使用内存盘加速
- 嘿嘿,按下键盘上面的三个键,马上让你的Vi
- Windows Vista的盗版率只有Windows XP的一半
- 3DMark和PCMark Vantage新版将只支持Vista系
阅读排行
- 淘宝网店“设计装修”技巧全攻略
- javascript函数库
- 我的地盘听我的 六大主流博客网站对比评测
- WAP建站入门教程
- 网页木马深度剖析以及手工清除
- WAP建站语言WML语法全接触
- 好事喜事送上祝福 电子请柬随网拈来
- 如何保存网页中的Flash文件?
- WAP建站WML语言语法基础
- 介绍几款WAP网页制作工具(提供下载)
最新技术文档
- 心得:漫谈网站改版的必要性
- 网页文字界面设计与穿衣搭配经验
- 让网页里的提交按钮变得更靓丽
- 小技巧:以图换字的几个方法及思路
- 巧用网页显示硬盘内容
- HTML在线编辑器的调用方法和使用方法
- 本地检验网页是否符合标准的几种方法
- 什么是uri 什么是url 两者的关系是什么?
- 网页中添加调用qq或者msn聊天窗口与客服进行
- 网页设计配色应用——色调
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
