这一课,我们将通过增加新闻的回复功能了解WML表单的使用,深入了解WAP站点表单数据传输过程中应该注意的一些问题。
首先,打开NewsShow.asp文件,并在if pagecount>2 then response.write "<br/><input name=""page"" format=""*N""
value="""&page&""" type=""text"" maxlength=""5""/><br/><a href="""&gopage&"page=$(page)"">[跳转到该页]</a>" 和 Else 之间加入
以下代码:
Response.Write("<br/>=*=*=*=*=*=<br/>")
Response.Write ("快速回复:<br/>"&_
"<input name=""content"&ID&""" emptyok=""true"" type=""text""/><br/>"&_ 7WAP
"<anchor>马上回复"&_
"<go href=""SaveReply.asp"" method=""post"">"&_
"<postfield name=""ID"" value="""&ID&""" />"&_
"<postfield name=""content"" value=""$(content"&ID&":n)"" />"&_
"<postfield name=""Method"" value=""POST"" />"&_
"</go>"&_
"</anchor>")
代码解释:
这是WML用POST方式传输表单数据的代码。当然,输入框input可以有多个,并在<anchor></anchor>之间相应添加postfield就可以了,名字要一一对应!
emptyok=""true"" 是指该输入框可以为空,在一般情况下,建议加上这一句,否则有些手机在点别的链接的时候,总会提示出错。
(content"&ID&":n)加上"&ID&"是为了避免手机缓存致使每条新闻的回复框都出现之前输入的回复内容,你当然也可以将其改成($content:n) ($content:n)是WML变量的写法,以$符号开头,WML中表单提交有:n,:e,:u,和空,四种状态,其中:n是强制不进行URL转义;:e是转义;:u是反转义。
传输中文数据的时候,一定要用POST方式。如果你只传输英文或者数字,可以使用GET方式进行传输。格式如下:
<a href="SaveReply.asp?ID="& ID &"&content=$(content"&ID&")&Method=GET">马上回复</a>
在这里 $(content"&ID&") 里的:n和&Method=GET"可以省略掉。但是,&绝对不可以写成&,否则页面执行时将出错!
清楚上面的代码之后,我们来运行调试一下!打开Opera,输入网址:http://localhost/NewsShow.asp?ID=2 可以看到,多了一个如图6-1所示的快速回复框!
现在,我们来制作保存页面。新建一个文本文件,将文件名重命名为:SaveReply.asp,打开文件,将文件的编码保存为UTF-8,复制以下代码:
本文章首发:http://www.7wap.cn,WAP资讯网
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!--#include file="inc/config.asp"-->
<%
Response.ContentType="text/vnd.wap.wml;charset=UTF-8" '将文件的格式转换成wml,编码为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>
www.7wap.cn提供WAP资讯服务
<card id="SaveReply" title="保存回复">
<%
Dim ID,content
ID=int(Request.Form("ID"))
%>
<onevent type="ontimer"><go href="NewsShow.asp?ID=<%=ID%>" method="get"></go></onevent><timer value="30"/>
<p align="left"><!-- 页面居左对齐 -->
<%
If ID=0 Then
Response.Write ("参数传输出错!<br/>=*=*=*=*=*=<br/>")
Response.Write ("<anchor title=""返回上一页"">返回上一页<prev/></anchor><br/>") '这是WML中的goback代码,相当于Javascript中的history.goback
Response.Write ("<a href=""index.asp"">返回网站首页</a><br/>"& "</p></card></wml>")
Response.End '在这里结束代码的执行,避免下面的代码的相关操作会影响程序的执行效果
End IF
content=Replace(Request.Form("content"),Chr(39), "'") '获取content的内容,并讲单引号进行转换
If content="" Then
Response.Write ("内容不能为空!<br/>=*=*=*=*=*=<br/>")
Response.Write ("<anchor title=""返回上一页"">返回上一页<prev/></anchor><br/>")
Response.Write ("<a href=""NewsShow.asp?ID="& ID &""">返回新闻内容</a><br/>"&_
"<a href=""index.asp"">返回网站首页</a><br/>"&_
"</p></card></wml>") wap资源:www.7wap.cn
Response.End
End If
Call openConn() '打开数据库
Conn.Execute("Insert Into [NewsComment] (newsID,content) values("& ID &",'"& content &"')")
Call ConnClose()
Response.Write ("回复成功!<br/>=*=*=*=*=*=<br/>")
Response.Write ("<anchor title=""返回上一页"">返回上一页<prev/></anchor><br/>")
Response.Write ("<a href=""NewsShow.asp?ID="& ID &""">返回新闻内容</a><br/>"&_
"<a href=""index.asp"">返回网站首页</a><br/>"&_
"</p></card></wml>")
%>
上面这段代码都比较简单,我就不多加解释了,需要强调一点就是,每一个出错的提示,都必须有</p></card></wml>结尾,因为WML对代码完整性要求非常严格,另外,在每次提示出错时,要加上Response.End,否则,当有两个出错条件符合的时候,程序将会执行两个输出错误,进而让页面显示出错!
接下来,返回刚才打开的页面,http://localhost/NewsShow.asp?ID=2,在快速回复输入框中输入一些内容,进行调试!
最后,就是回复的显示跟回复列表文件了。
先打开NewsShow.asp文件,在快速回复上面,即Response.Write("<br/>=*=*=*=*=*=<br/>"),插入以下代码:
'//读取最后一条回复
Dim rsReply
Set rsReply=conn.execute("Select top 1 content from [NewsComment] where newsID="& ID &" order by ID desc") 7WAP
If Not rsReply.eof Then
Response.Write("<br/>=*=*=*=*=*=<br/>")
Response.Write ("最新回复:<br/>"&_
replaceStr(rsReply(0))&"<br/>"&_
"<a href=""ReplyList.asp?ID="& ID &""">阅读所有回复</a>")
End If
rsReply.close()
set rsReply=nothing
这段代码主要是读取回复表里关于这条新闻的最后一条回复。相信大家都对这段代码的意思非常清楚了,这里就不多罗索!
保存文件之后,回到刚才的调试页面,刷新页面看一看,嘿嘿,刚刚回复的内容就显示出来了!请看图6-2的效果。
新闻回复列表文件的完成:
同样是新建立一个文本文件,将文件名修改为ReplyList.asp,保存文件编码为UTF-8。复制以下代码:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!--#include file="inc/config.asp"-->
<%
Response.ContentType="text/vnd.wap.wml;charset=UTF-8" '将文件的格式转换成wml,编码为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="ReplyList" title="阅读回复">
<p align="left"><!-- 页面居左对齐 -->
阅读所有回复
<br/>=*=*=*=*=*=<br/>
<%
Dim ID,rs
ID=int(request.QueryString("ID"))
Call openConn() '打开数据库
Set rs=conn.execute("Select content From [NewsComment] where newsID="& ID &"") '读取新闻回复表
If Not rs.eof Then
Dim PageSize,i
PageSize=10 '每一页显示的条数
Dim Count,page,pagecount,gopage '定义相关变量
gopage="ReplyList.asp?ID="&ID&"&"
Count=conn.execute("Select count(ID) from [NewsComment] where newsID="& ID &"")(0) '读取回复总数
page=int(request.QueryString ("page"))
if page<=0 or page="" then page=1 '默认为第一页
pagecount=(count+pagesize-1)\pagesize '计算出页数
rs.move(pagesize*(page-1)) '将游标指到每一页的第一条记录
For i=1 To PageSize '根据每一页的条数进行循环
If rs.eof Then Exit For '如果循环到了尽头,则跳出循环
Response.Write (i+(PageSize*(page-1))&"."&replaceStr(rs(0))&_
"<br/>-=-=-=-=-=-<br/>")
rs.moveNext
Next
本文章首发:http://www.7wap.cn,WAP资讯网
response.write ("共:"&count&"条,"&page&"/"&pagecount&"页")
if page-pagecount<0 then response.write "<br/><a href="""&gopage&"page="&page+1&""">下页-</a><a
href="""&gopage&"page="&pagecount&""">尾页</a>"
if page>1 then response.write "<br/><a href="""&gopage&"page="&page-1&""">上页-</a><a href="""&gopage&"page=1"">首页
</a>"
'//下面这一句,是让用户通过输入框输入页数,然后通过链接直接转向该页
if pagecount>1 then response.write "<br/><input name=""page"" format=""*N"" value="""&page&""" type=""text""
maxlength=""5"" emptyok=""true""/><br/><a href="""&gopage&"page=$(page)"">[跳转到该页]</a>" wap资源:www.7wap.cn
Else
Response.Write ("暂无回复内容!")
End If
Call rsClose()
Call ConnClose()
Response.Write ("<br/>=*=*=*=*=*=<br/>")
Response.Write ("快速回复:<br/>"&_
"<input name=""content"&ID&""" emptyok=""true"" type=""text""/><br/>"&_
"<anchor>马上回复"&_
"<go href=""SaveReply.asp"" method=""post"">"&_
"<postfield name=""ID"" value="""&ID&""" />"&_
"<postfield name=""content"" value=""$(content"&ID&":n)"" />"&_
"<postfield name=""Method"" value=""POST"" />"&_
"</go>"&_
"</anchor>")
%>
<br/>=*=*=*=*=*=<br/>
<a href="NewsShow.asp?ID=<%=ID%>">返回新闻内容</a><br/>
<a href="index.asp">返回网站首页</a><br/>
</p>
</card>
</wml>
这些代码相信大家都非常熟悉,其实它跟新闻列表文件的代码几乎是一样的,只是读取的数据库跟数据库表不同而已!具体就不多讲了。
在本地调试无错误之后,我们把代码传送到远程空间,用手机测试一下!