制作WAP留言本(ASP教程)

测试工具:WAP模拟器(如Opera,M3GATE,等),支持WAP的手机。

一直以来都有朋友在WAP的中文变量传递上面遇到问题,这里给出简单的WAP留言本的制作过程,也解决了WAP的中文传递问题。

WAP网站也和传统网站类似,同样是PC电脑来进行后台的管理。只是不同的是一个是用手机浏览,一个是用电脑浏览。前台显示页面用手机浏览,后台管理页面用IE浏览器进行查看,管理就可以了。

如果你已经能写简单的留言本程序,那么制作WAP留言本已经很简单的事情了,只是把HTML换成WML这么简单,至于WML的语法,看看教程就会了,比HTML还简单,具体教程google一下。

一些WAP教程。

http://www.itsalon.net/wap/
http://www.wapease.com/class/tip2/
http://tech.sina.com.cn/wap/school/index.shtml

其他就自己找找吧。

留言本的程序包括:发贴,保存,显示,编辑,回复,删除。

整个的后台管理+前台显示,也就这几个功能。

注意:以下代码,如果你是使用EditPlus编写的,请在保存的时候选择,另存为“UTF-8”编码。如果不这么做,你就会遇到WML中传递中文变量,出现乱码的问题了。

以ASP为例。那我们就先从发贴页面做起,add.asp

指定ASP页面所用的脚本和编码,CODEPAGE="65001"这个一定不能少,是表示UTF-8编码,GB2312是CODEPAGE="936"。

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>

先声名WML的头文件信息,这样即使你用的是虚拟的空间,也不用在IIS或者是Apache里面映射MIME文件类型。

<% Response.ContentType="text/vnd.wap.wml;charset=UTF-8" %>

声名WML的头文件信息,这个是规定,规定了WAP的版本和采用的标准,如果不明白就这么写就行了,不变的,但是必须要加上。 其中encoding也是指定编码。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">

接下来就是页面的显示代码了

<card id="add" title="经典WAP留言本">
<p>
昵称:<br/>
<input name="Name" emptyok="false" size="10" maxlength="10"/><br/>
标题:<br/>
<input name="Title" emptyok="false" maxlength="40"/><br/>
内容:<br/>
<input name="Content" format="false" maxlength="150"/><br/>
</p>
</card>

简单介绍一下:wml类似html标签,card代表一个卡片,这里简单理解为一个页面就行了,注意:所有的显示的内容都要放在<p> </p>标签里面,一定要注意这点,要不然就会出错。

< meta http-equiv="Cache-Control" content="max-age=0"/>
< meta http-equiv="Cache-Control" content="no-cache"/>

在meta中指定不缓存页面。

< input name="Title" emptyok="false" maxlength="40"/>< br/>
emptyok不允许为空,maxlength允许输入的文字最大长度。

WML的表单提交有点不同,<postfile name="title" value="($title:n)" />是把input表单的值附给title变量,name="title" 是变量名, value="($title:n)"是变量,即input中输入的信息,content也是一样。

注:这里($title:n)是WML变量的写法,以$符号开头,类似PHP的变量声名,WML中表单提交有:n,:e,:u,和空,四种状态, 其中:n是强制不进行URL转义;:e是转义;:u是反转义;如果为空,在有的手机上默认是不转义,有的是转义, 规范不统一,安全期间,如果不转义,还是写上:n为好。

WAP的变量提交也分两种情况,GET和POST,使用GET方法,对中文的支持并不是很好,所以有使用到表单提交的地方,都改为POST方式提交,代码格式为:

<anchor>POST方式提交
<go href="save.asp" _fcksavedurl=""save.asp"" method="post">
<postfield name="Name" value="$(Name:n)" />
<postfield name="Title" value="$(Title:n)" />
<postfield name="Content" value="$(Content:n)" />
<postfield name="Method" value="POST" />
</go>
</anchor>

当然对于英文和数字,简单的,使用GET方式提交会比较方便一些,代码格式为:

< a href="save.asp?Name=$(Name:n)&Title=$(Title:n)&Content=$(Content:n)&Method=GET">GET方式提交< /a>

注:连接不同变量字符的&符号要写为&

发表留言页面add.asp的代码如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.ContentType="text/vnd.wap.wml;charset=UTF-8" %>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0"/>
<meta http-equiv="Cache-Control" content="no-cache"/>
</head>
<card id="add" title="经典WAP留言本">
<p>
昵称:<br/>
<input name="Name" emptyok="false" size="10" maxlength="10"/><br/>
标题:<br/>
<input name="Title" emptyok="false" maxlength="40"/><br/>
内容:<br/>
<input name="Content" format="false" maxlength="150"/><br/>
<br/><anchor>POST方式提交
<go href="save.asp" method="post">
<postfield name="Name" value="$(Name:n)" />
<postfield name="Title" value="$(Title:n)" />
<postfield name="Content" value="$(Content:n)" />
<postfield name="Method" value="POST" />
</go>
</anchor>
<br/><a href="save.asp?Name=$(Name:n)&Title=$(Title:n)&Content=$(Content: n)&Method=GET">GET方式提交</a><br/><br/>
<a href="index.asp">返回留言列表</a>
</p>
<p>
有任何疑问,请访问:http://www.designer5.net或<br/>
蓝色理想论坛WAP版:http://www.blueidea.com/bbs<br/>
广告:蓝色理想WAP网站改版了,使用手机访问<a href="http://wap.blueidea.com">http://wap.blueidea.com</a><br/>
如果您参考了此程序,有WAP站点,请做上http://wap.blueidea.com的链接。
</p>
<do type="prev" label="返回"><prev/></do>
</card>
</wml>

接下来是保存数据。

保存页面save.asp,代码如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!–#include file="conn.asp"–>
<%
Function inWML(str)
‘ 把字符串存入数据库,单引号过滤,‘==Chr(39)
sTemp = Replace(str, Chr(39), "‘") ‘单引号过滤
inWML = sTemp
End Function
IF Request("Method")<>"" Then
Name=inWML(Trim(Request("Name")))
Title=inWML(Trim(Request("Title")))
Content=inWML(Trim(Request("Content")))
Method=Request("Method")

Sql = "INSERT INTO guestbook(Name, Title, Content, Method) values(‘"&Name&"‘, ‘"&Title&"‘, ‘"&Content&"‘, ‘"&Method&"‘)"
Conn.Execute Sql
End IF
Response.Redirect ("index.asp")
%>

最后是显示把留言的内容显示出来。

显示数据的时候需要注意字符的替换,因为有些字符是不能直接显示的,需要转换为Ascii码,在WML里面“$”符号是表示变量,如果要显示“$”,需要写为“$$”,例:“一共有$$315元RMB”,显示为“一共有$315元RMB”。

必须要替换的字符,已经写为函数,方便大家使用。

Function outHTM(str)
‘ 把字符串进行HTM解码,输出字符串
Dim sTemp
sTemp = str
outHTM = ""
If IsNull(sTemp) Then
Exit Function
End If
sTemp = Replace(sTemp, "‘", "‘") ‘还原单引号
sTemp = Replace(sTemp, "&", "&")
sTemp = Replace(sTemp, "<", "<")
sTemp = Replace(sTemp, ">", ">")
sTemp = Replace(sTemp, "$", "$$")
sTemp = Replace(sTemp, "", " ")
sTemp = Replace(sTemp, Chr(10), "<br/>")
outHTM = sTemp
End Function

显示留言的页面index.asp,代码如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!–#include file="conn.asp"–>
<%
Function outHTM(str)
‘ 把字符串进行HTM解码,输出字符串
Dim sTemp
sTemp = str
outHTM = ""
If IsNull(sTemp) Then
Exit Function
End If
sTemp = Replace(sTemp, "‘", "‘") ‘还原单引号
sTemp = Replace(sTemp, "&", "&")
sTemp = Replace(sTemp, "<", "<")
sTemp = Replace(sTemp, ">", ">")
sTemp = Replace(sTemp, "$", "$$")
sTemp = Replace(sTemp, "", " ")
sTemp = Replace(sTemp, Chr(10), "<br/>")
outHTM = sTemp End Function

Sql = "SELECT * FROM guestbook ORDER BY ID DESC "
Set Rs = Server.CreateObject("Adodb.Recordset")
Rs.Open Sql,conn,1,3
page = Request.QueryString("Page")
Rs.PageSize = 6 ‘一页6条记录

IF Not IsEmpty(Page) Then
IF Not IsNumeric(Page) Then ‘判断Page是否为数字
Page=1
Else
Page=Cint(Page) ‘转换成短整形Integer
End IF
IF Page > Rs.PageCount Then
Rs.AbsolutePage = Rs.PageCount ‘设置当前显示页等于最后一页
ElseIF Page <= 0 Then
Rs.AbsolutePage = 1 ‘设置当前页等于第一页
Else
Rs.AbsolutePage = Page ‘如果大于零,显示当前页等于接收的页数
End IF
Else
Rs.AbsolutePage = 1
End IF
Page = Rs.AbsolutePage
%>
<% Response.ContentType="text/vnd.wap.wml;charset=UTF-8" %>
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0"/>
<meta http-equiv="Cache-Control" content="no-cache"/>
</head>
<card id="add" title="经典WAP留言本">
<p>
<a href="add.asp">发表新贴</a><br/> _fcksavedurl=""add.asp">发表新贴</a><br/>"
<%
For i=1 to Rs.PageSize
If Rs.Eof Then
Response.Write "没有留言了!<br/>"
Exit For
End If
%>
(<%=Rs("ID")%>) <%=outHTM(Rs("Title"))%><br/>
内容:<%=outHTM(Rs("Content"))%><br/>
留言者:<%=outHTM(Rs("Name"))%><br/>
时间:<%=outHTM(Rs("CreatTime"))%><br/>
回复:<%
if Rs("Reply")<>""then
Response.Write outHTM(Rs("Reply"))
else
Response.Write "“暂无回复”"
end if
%><br/>
------<br/>
<%
Rs.MoveNext
Next
if page>=Rs.PageCount then
‘Response.Write ("[下一页]")
else
Response.Write("[<a href=‘index.asp?Page=" & (Page+1) & "‘>下一页</a>]")
end if
if page<=1 then
‘Response.Write ("[上一页] ")
else
Response.Write("[<a href=‘index.asp?Page=" & (Page-1) & "‘>上一页</a>]")
end if
%>
<br/><a href="add.asp">发表新贴</a>
</p>
<p>
有任何疑问,请访问:http://www.designer5.net 或<br/>
蓝色理想论坛WAP版:http://www.blueidea.com/bbs<br/>
广告:蓝色理想WAP网站改版了,<a href="http://wap.blueidea.com">http://wap.blueidea.com</a><br/>
如果您有WAP站点,并参考了此程序,请做上http://wap.blueidea.com的连接
</p>
</card>
</wml>

后台管理页面admin.asp,代码如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!–#include file="conn.asp"–>
<%
Function inWML(str)
‘ 把字符串存入数据库,单引号过滤
sTemp = Replace(str, Chr(39), "‘") ‘单引号过滤
inWML = sTemp
End Function
IF (Request.Form("Flag")="ReplySave") Then
Id = Request.Form("Id")
Name = inWml(Request.Form("Name"))
Title = inWml(Request.Form("Title"))
Content = inWml(Request.Form("Content"))
Reply = inWml(Request.Form("Reply"))
‘可修改用户留言,是为了避免用户输入非法信息
Sql = "UPDATE GuestBook SET Name = ‘"&Name&"‘, "
Sql = Sql + "Title = ‘"&Title&"‘, "
Sql = Sql + "Content = ‘"&Content&"‘, "
Sql = Sql + "Reply = ‘"&Reply&"‘ "
Sql = Sql + " WHERE Id = "&Id
Conn.ExeCute Sql
Conn.Close
Set Conn = Nothing
Response.Redirect("admin.asp")
End IF

IF (Request.QueryString("Action")="Del") Then
Sql = "DELETE FROM GuestBook WHERE Id=" & Request.QueryString("Id")
Conn.Execute Sql
Conn.Close
Set Conn = Nothing
Response.Redirect("admin.asp")
End IF
%>
<%
Set Rs=Server.CreateObject("adodb.Recordset")
Sql = "SELECT * FROM GuestBook ORDER BY Id Desc"
Rs.open Sql,conn,3,3
Page = Request.QueryString("Page")
Rs.PageSize = 10 ‘一页6条记录
IF Not IsEmpty(Page) Then
IF Not IsNumeric(Page) Then ‘判断Page是否为数字
Page=1
Else
Page=Cint(Page) ‘转换成短整形Integer
End IF
IF Page > Rs.PageCount Then
Rs.AbsolutePage = Rs.PageCount ‘设置当前显示页等于最后一页
ElseIF Page <= 0 Then
Rs.AbsolutePage = 1 ‘设置当前页等于第一页
Else
Rs.AbsolutePage = Page ‘如果大于零,显示当前页等于接收的页数
End IF
Else
Rs.AbsolutePage = 1
End IF
Page = Rs.AbsolutePage
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>经典WAP留言本</title>
<style type="text/css">
body, td{font-size:12px;}
p{line-height:22px;}
</style>
<script language="javascript" type="text/javascript" charset="utf-8">
<!–
function check_form1()
{
if (document.form1.Reply.value==""){
alert("请填写回复内容!");
document.form1.Reply.focus();
}
else{return true;}
return false;
}
–>
</script>
</head>
<body>
<table width="600" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#2D96FF">
<tr align="center" bgcolor="#D0E8FF">
<td height="70" colspan="8"><p><strong>经典WAP留言本</strong></p>
<p><strong>制作:</strong><strong><a href="http://www.designer5.net" _fcksavedurl=""http://www.designer5.net"" target="_blank">D5S工作室</a> 作者:yytcpt</strong></p>
</td>
</tr>
<tr align="center" bgcolor="#9BCDFF">
<td height="25"><strong>ID</strong></td>
<td><strong>留言者</strong></td>
<td><strong>标题</strong></td>
<td><strong>留言内容</strong></td>
<td><strong>提交方式</strong></td>
<td><strong>留言时间</strong></td>
<td width="34"><strong>回复</strong></td>
<td><strong>删除</strong></td>
</tr>
<%
For i=1 to Rs.PageSize
If Rs.Eof Then
Exit For
End If
%>
<tr bgcolor="#C8E3FF" onMouseOver="javascript:this.bgColor=‘#9BCDFF‘;" onMouseOut="javascript:this.bgColor=‘#C8E3FF‘;">
<td width="19" height="25" align="center"><%=Rs("Id")%></td>
<td width="48" align="center"><%=Rs("Name")%></td>
<td width="53" align="center"><%=Rs("Title")%></td>
<td width="247" align="left"><%=Rs("Content")%> </td>
<td width="53" align="center"><%=Rs("Method")%></td>
<td width="76" align="center"><%=Rs("CreatTime")%></td>
<td align="center"><a href="admin.asp?Action=Reply&Id=<%=Rs("Id")%>">回复</a></td>
<td width="45" align="center"><a href="javascript:if(confirm(‘确实要删除吗?‘))location=‘admin.asp?Action= Del&Id=<%=Rs("Id")%>‘">删除</a></td>
</tr>
<%
Rs.MoveNext
Next
%>
<tr align="center" bgcolor="#9BCDFF">
<td height="25" colspan="8">
<%
Response.Write("<form name=page method=get onsubmit=""document.location = ‘admin.asp?Page=‘+this.page.value;return false;"">")
if page<=1 then
Response.Write ("[首页] [上一页] ")
else
Response.Write("[<a href=admin.asp?Page=1>首页</a>] ")
Response.Write("[<a href=admin.asp?Page=" & (Page-1) & ">上一页</a>] ")
end if

if page>=Rs.PageCount then
Response.Write ("[下一页] [尾页]")
else
Response.Write("[<a href=admin.asp?Page=" & (Page+1) & ">下一页</a>] ")
Response.Write("[<a href=admin.asp?Page=" & Rs.PageCount & ">尾页</a>]")
end if
Response.Write("[页次:<font color=red>" & page & "</font>/" & Rs.PageCount)
Response.Write("] [共" & Rs.RecordCount & "条 <font color=red>"& Rs.PageSize & "</font>条/页]")
Response.Write(" 转到" & "<input name=page size=4 value=" & page & ">" & "页<input type=submit value=go></form>")
%>
</td>
</tr>
<tr align="center">
<td height="30" colspan="8" bgcolor="#C8E3FF"><p> 有任何疑问,请访问<a href="http://www.designer5.net"> <strong>http://www.designer5.net</strong></a> 或<strong><a href="http://www.blueidea.com/bbs" _fcksavedurl=""http://www.blueidea.com/bbs"" target="_blank"> </a></strong><a href="http://www.blueidea.com/bbs" target="_blank"><strong> </strong></a><strong><a href="http://www.blueidea.com/bbs" target="_blank">蓝色理想论坛WAP版块</a></strong><br/>
<strong>广告:</strong>蓝色理想WAP网站改版了,请使用手机访问<a href="http://wap.blueidea.com"><strong>http://wap.blueidea.com</strong></a><br/>
如果您有WAP站点,并参考了此程序,请做上http://wap.blueidea.com的连接</p></td>
</tr>
</table>
<p> </p>
<%
IF (Request.QueryString("Action")="Reply") Then
Set Rs=Server.CreateObject("adodb.Recordset")
Sql = "SELECT * FROM GuestBook WHERE Id ="&Request.QueryString("Id")
Rs.open Sql,conn,3,3
%>
<table width="333" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#C8E3FF">
<form name="form1" method="post" action="admin.asp" onsubmit="javascript:return check_form1()">
<tr>
<td width="69"><strong>ID</strong></td>
<td width="264"><%=Rs("Id")%></td>
</tr>
<tr>
<td><strong>留言者</strong></td>
<td>
<input name="Name" type="text" value="<%=Rs("Name")%>" size="20">
</td>
</tr>
<tr>
<td><strong>标题</strong></td>
<td><input name="Title" type="text" value="<%=Rs("Title")%>" size="20"></td>
</tr>
<tr>
<td><strong>留言时间</strong></td>
<td><%=Rs("CreatTime")%></td>
</tr>
<tr>
<td><strong>留言内容</strong></td>
<td><textarea name="Content" cols="30" rows="4"><%=Rs("Content")%></textarea></td>
</tr>
<tr>
<td><strong>本站回复</strong></td>
<td><textarea name="Reply" cols="30" rows="4"><%=Rs("Reply")%></textarea></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" name="Submit" value="提交">

<input type="reset" name="Submit" value="重置">
<input name="Id" type="hidden" value="<%=Rs("Id")%>">
<input name="Flag" type="hidden" value="ReplySave">
</td>
</tr>
</form>
</table>
<% End IF %>
</body>
</html>
<%
Rs.Close
Set Rs = Nothing
%>

连接数据库conn.asp,代码如下:

<%
Dim Conn, StrSQL
StrSQL = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("d5s.mdb")
set Conn = Server.Createobject("Adodb.Connection")
Conn.open StrSQL
%>

源码下载地址:点击下载

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Time limit is exhausted. Please reload CAPTCHA.