教程
【測試地址】:http://wap.blueidea.com/tutorial/wapguestbook/
後台管理地址:http://wap.blueidea.com/tutorial/wapguestbook/admin.asp
請大家測試的時候不要輸入非法和反動資訊,否則我就只有刪掉測試檔案了,謝謝大家的配合。
測試載入器:WAP模擬器(如Opera,M3GATE,等),支援WAP的手機。
一直以來都有朋友在WAP的中文變數傳遞上面遇到問題,這裡給出簡單的WAP留言本的製作過程,也解決了WAP的中文傳遞問題。
WAP網站也和傳統網站類似,同樣是PC電腦來進行背景管理。只是不同的是一個是用手機瀏覽,一個是用電腦瀏覽。前台顯示頁面用手機瀏覽,後台管理頁面用IE瀏覽器進行查看,管理就可以了。
如果你已經能寫簡單的留言本程式,那麼製作WAP留言本已經很簡單的事情了,只是把HTML換成WML這麼簡單,至於WML的文法,看看教程就會了,比HTML還簡單,具體教程google一下。
一些WAP教程。
www.itsalon.net/wap/
www.wapease.com/class/tip2/
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" 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">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/>
<%
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">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" 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" >
<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.nethttp://www.designer5.net"> <strong>http://www.designer5.net</strong></a> 或<strong><a href="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
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" >
<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
%>
源碼下載地址:點擊下載
其他說明:有任何疑問,請訪問:http://www.designer5.net或
藍色理想論壇WAP版:http://www.blueidea.com/bbs
廣告:藍色理想WAP網站改版了,使用手機訪問http://wap.blueidea.com
如果您參考了此程式,有WAP網站,請做上http://wap.blueidea.com的連結。