测试工具: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
%>

源码下载地址:点击下载

1、iis配置Wap环境

在作为wap站点的属性-->Http头-->MIME映射中添加新的文件类型,具体如下:
关联文件名 内容类型
wml text/vnd.wap.wml
wmlc application/vnd.wap.wamlc
wmls text/vnd.wap.wmlscript
wmlsc application/vnd.wap.wmlscript
wbmp image/vnd.wap.wbmp
编写一个wml文件或者使用asp编写一个动态网页
如果使用asp编写,在源码的开始添加
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%Response.ContentType = "text/vnd.wap.wml; charset=utf-8"%>
编码采用utf-8就可以使用模拟器进行浏览了。

2、wap中的编码比较严格,标签区分大小写。标签一定要对应。初学者经常犯这样的错误

3、说到标签对应就涉及到这样一个问题。当在一个表中查询记录的时候,在asp中没有记录就输出“没有记录提示”并response.end。但是在wap中不行,因为这样就不会输出</card></wml>等闭合标签。
我采用的方法是。得到记录集后

if rs.eof then
Wrong="暂时没有记录。。。"
else
‘正常的进行页面显示。。。。。
end if
respong.write Wrong

</p>
</card>
</wml>
这样可以避免标签不闭合。

4、图片下载中首先一定要做到

a、图片格式要正确:有的手机支持png 有的支持gif、bmp、jpg 。(联通CDMA的大部分都支持png)
b、图片的路径要正确:绝对路径 比如http://****/PicDown/aa.png
c、图片的大小要适当:预览的图片不能超过10kb,供下载的图片不能超过30kb。(这个我也不知道有没有标准,这是我在实际测试中得到的数据),下载有些手机支持图片或者铃声可能还要大 <50kb,但是为了照顾大多数手机所以,建议<30kb。
d、图片的大小一定要和图片的名称对应,也就是说 aa.png是多么大,在其size中就写多么大,这两个是对应的。
e、有的手机在手机内存储图片达到一定数量时候,就会提示“下载个数过多”等类似提示,有的手机有预览-->保存(如:MOTO)有的没有,下载后直接保存到手机中(LG8180)。
f、判断用户下载是否成功,可以在指定的文件中获得Status,if Status=‘ok’ 则表明下载成功,进行提示下载成功、下载次数+1等操作,否则,提示下载失败。

5、wap中的分页

分页和web中是一样的,只是有些功能比较简化了,下面是常用的分页,没有写成函数是方便大家修改。

在打开记录集后写,如下代码:

<%
filepath=request.servervariables("path_info")%>
<%page=1
page=request("page")
rs.PageSize = 8 ‘每页的记录的条数
if Not IsEmpty(trim(Request("Page"))) then
Page = CInt(Request("Page"))
if Page > rs.PageCount then
rs.AbsolutePage = rs.PageCount
elseif Page <= 0 then
Page = 1
else
rs.AbsolutePage = Page
end if
End if
%>

然后再想显示分页的地方,一般是在记录集循环输出完毕的后面写:

<%if rs.pagecount<>1 and rs.pagecount<>0 then%>
<br/>
<%if page>rs.pagecount then%>
<a title="确定" href="<%=filepath%>?Page=<% =page -1 %>">上一页</a>
<%else%>
<%if page<>1 then %>
<a title="确定" href="<%=filepath%>?Page=<% =page -1 %>">上一页</a><br/>
<% end if %>
<a title="确定" href="<%=filepath%>?Page=<% = page + 1%>">下一页</a>
<%end if %>
<%end if
response.Write "第"&page&"页 共"&rs.pagecount&"页"
%>

注意显示的时候首先显示下一页,然后再显示上一页这和web上的习惯不太一样。

另外,如果这页的内容是显示是通过上页传送来的参数,作为条件的,则在 类似
<a title="确定" href="<%=filepath%>?Page=<% = page + 1%>">下一页</a>
的地方都要加上该参数,否则进行下一页连接的时候就会把参数丢掉。
例如:从上页用户选择的新闻的种类,来显示新闻。在List.asp页面首先写,NewType=request.form("NewType")得到用户选择的新闻的类型。
然后SQL="Select ……….where NewType=‘"&NewType&"‘" 。完成记录集合的准备工作。注意:在进行下页面的时候要写成
<a title="确定" href="<%=filepath%>?Page=<% =page -1 %>&NewType=<%=NewType%>">上一页</a><br/>,
这样的形式,有多少条件后面跟多少条件。
但是这样就产生问题了,即时这样写NewType=request.form("NewType")也得不到NewType的值。所以在页首刚开始的地方应该写成NewType=request("NewType")。就可以实现把参数带到下一页的连接中了。

wap中上一条、下一条的问题。

在开发中,新闻、笑话、下载等业务为用户提供方便基本都需要在一条记录完成后,再提供下一条记录的操作,下面是简要的对下一条记录实现方法的描述。

比如显示新闻是国际新闻的记录,list.asp来进行显示,通过sql语句select * from NewsInfo where type=‘国际‘ ,来得到符合条件的记录集,用户在浏览过程中,当前记录的id=10,下一条记录的id是idnext=10+1=11,上一条记录的id是idpre= 10-1=9,然后<a href="list.asp?id=‘"&IdNext&"‘">上一条</a>,这样的做法是欠缺 的,仅仅适用与id是连续的,也就是说所有国际新闻的id是连续的,如果国际新闻和国内新闻在表中是穿插写入的,那么你的id-1很可能是国内新闻,条件 限制type=‘国际‘ 就不起作用了。

正确且简练的做法应该是这样的(可能大家还有更好的做法):

当前的id是IdNow,表NewsInfo是按照id自增的。
获得idnext=select top 1 from NewsInfo where type=‘国际‘ and id>‘"&IdNow&"‘
获得Idpre=select top 1 from NewsInfo where type=‘国际‘ and id<‘"&IdNow&"‘ order by id desc

剩下的问题,就不用说了吧,注意,先显示下一条,然后显示上一条,这样才方便用户。

wap中新闻等图片和文字混排

Wap开发中,图片和文字混排,可以采用ubb编码,原理就是自己定义一共特殊的格式,采用mid和replace函数进行转换。比如定义
string1all = Replace(string1all,"" title="看原大图" target="_blank">
string1all = Replace(string1all,"" class="ubb_img" onload="javascript:DrawImage(this);" alt="看原大图"/>
"," "" alt=""""/></p><p>")

会使得图片居中显示。

新闻小说的分页

在wap中过长的新闻和小说,会给大家带来很大的不方便。所以要求进行分页显示,比如按照每页显示300字来举例子。

pageWordNum=300 ‘ 每页显示的字数,这里300可以是变量
StartWord = 1
Length=len(Content) ‘要显示内容的总的长度
PageAll=(Length+PageWordNum-1)\PageWordNum ‘该篇新闻总共可分的总页数

i=request.QueryString("i") ‘第几页的标记
if isnull(i) or i="" then ‘如果是新闻的刚开始则默认i=0
i=0
end if
Content = mid(Content,StartWord+i*PageWordNum,PageWordNum) ‘利用mid函数进行新闻内容的截取(mid函数的含义:从字符串中返回指定数目的字符)




<%
‘开始进行分页操作
if 0<=i<PageAll then
if cint(i)<cint(PageAll)-1 then%>
<a href="ListFengshuiInfo.asp?i=<%=i+1%>">下一页</a><br/>
<%end if
if cint(i)>0 then%>
<a href="ListFengshuiInfo.asp?i=<%=i-1%>">上一页</a><br/>
<%end if
end if
%>

结束。

注意:1、 <a href="ListFengshuiInfo.asp?i=<%=i+1%>">下一页</a>< br/>中ListFengshuiInfo.asp?i=<%=i+1%>可以按照你的实际环境的需要添加变量。
2、Mid函数的解释说明:
从字符串中返回指定数目的字符。
Mid(string, start[, length])
参数
string
字符串表达式,从中返回字符。如果 string 包含 Null,则返回 Null。
Start
string 中被提取的字符部分的开始位置。如果 start 超过了 string 中字符的数目,Mid 将返回零长度字符串 ("")。
Length
要返回的字符数。如果省略或 length 超过文本的字符数(包括 start 处的字符),将返回字符串中从 start 到字符串结束的所有字符。