繁体中文
设为首页
加入收藏
当前位置:ASP技术首页 >> XML相关 >> 第三种途径---基于XML的ASP留言板

第三种途径---基于XML的ASP留言板

2004-10-01 08:26:10  作者:  来源:互联网  浏览次数:68  文字大小:【】【】【
简介:坦白地说,对于ASP我一直都不怎么感兴趣。如果要我写这种服务器端程序的话, 我会选择JSP。所以,本人一直都想在网上弄个便宜点的JSP空间;可是正如miles 前辈所说,连贵一点的都没有,更不用说便宜的了。没办法...

坦白地说,对于ASP我一直都不怎么感兴趣。如果要我写这种服务器端程序的话,

我会选择JSP。所以,本人一直都想在网上弄个便宜点的JSP空间;可是正如miles

前辈所说,连贵一点的都没有,更不用说便宜的了。没办法,只好用ASP了,

对于用ASP写留言板的主要途径,只要是地球人就都知道,用得最多的无外乎就

是文件组件与数据库组件;而大多提供ASP的服务商基于安全都禁用了文件组件,

也有的禁用了数据库组件。当然,就算用不了这两个组件,也并不代表我们就不

能用脚本来创建文件和修改文件了,我们还有第三种途径:MSXML组件。

以下是我用MSXML组件写的一个留言本程序,主要文件有guest.xml、guest.asp、

include.asp、certain.asp,另加一些图像文件,分别为1.jpg,2.jpg,……图像

文件放在pic目录下。这个脚本在ASP的各版本中均已测试通过,以下是所有的源

代码与讲解,肯请指正。

----------------------------------------------------------------------

◆1◆ guest.xml 该文件用来保存留言的数据文件,相当于数据库。

----------------------------------------------------------------------

<殷亮的留言本>

<留言>

<昵称>殷亮

<头像>pic/20.jpg

<来自>湖北荆门

<时间>2002-10-17 22:48:01

<信箱>ask10@msn.com

<内容>这是一个基于XML的留言本

<留言>

<昵称>黄娟

<头像>pic/7.jpg

<来自>湖北武汉

<时间>2002-10-17 22:48:01

<信箱>fengzhongluwei@hotmail.com

<内容>你好吗?

-------------------------------------------------------------------------

上面的XML文件记录了两条留言,可以用任何文本编辑工具编辑,如果没有语法错误,

在浏览器中输入该文件名即可显示XML所独有的树状页面。因为是文本形式的,所以

从创建到修改都比专门的数据库要方便。而XML文档的规则与格式也非常自由,如果

你要创建一个新的XML文件,只需一字不改地照写第一行“

encoding="gb2312"?>”,而后面的标签与标签之间的text就可以很随意,仅仅遵守

以下规则即可:

1.首标签与尾标签必须对应,可以重复,但不可以嵌套。

2.标签的命名规则与JAVA/C/C++等程序语言的变量命名规则相似,区分大小写。

3.一个文档只能有一个根元素,如实例中的“<殷亮的留言本>”

4.唯一的关键字“XML”,标签不能以这三个字母开头。

如果文档与规则有所冲突,将导制XML文档在浏览器中无法正常显示,且当ASP脚本调

用该文档时也会出现错误,所以强烈建议将写好的XML文件先在浏览器中预览,没有

发现错误时,再开始编写ASP脚本。

下面是关于ASP中读写XML文件的相关语句:(以上面的XML文件为例)

应用组件,读入文件:

set guestXml = Server.CreateObject("MSXML.DOMDocument")

guestXml.load Server.MapPath("guest.xml")

显示第一条留言中的“殷亮”

<%=guestXml.documentelement.childNodes.item(0).childNodes.item(0).text%>

可以解释为:XML对象.XML根标签.子标签集合.第一条.子标签集合.第一条.文本

这样,通过一级一级的访问,最终定位到了第三级标签上。

当然,我们也可以先用 set root = guestXml.documentelement.childNodes

这样,当我们要显示“殷亮”的时候,就可以用:

<%=root.item(0).childNodes.item(0).text%>

显示第二条留言中的“湖北武汉”

<%=guestXml.documentelement.childNodes.item(1).childNodes.item(2).text%>

和数组类似,XML的下标也是由0开始。

显示一个标签中所有子标签的个数,如显示留言总数:

<%=guestXml.documentelement.childNodes.length%>

显示第一条留言中的项目数:

<%=guestXml.documentelement.childNodes.item(0).childNodes.length%>

对文件修改后,保存XML文件,使修改生效:

<%guestXml.save%>

在第一条留言中添加一个子标签“<主题>a test

<%

set titleTag = guestXml.createelement("主题") ''''先创建一个标签

titleTag.text= "a test" '''''设定标签中的文本

guestXml.documentelement.childNodes.item(1).appendchild titleTag

'''''添加到指定的标签下

guestXml.save

%>

当你再次打开guest.xml文件时,你会发现添加已经成功。

MSXML对象的相关语法不止这些,但有了这几个关键的,已经足够我们写留言本了。

--------------------------------------------------------------------------

◆2◆ guest.asp 该文件为留言本的主页面,包括显示留言的总数与总页数

--------------------------------------------------------------------------

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

<% '使浏览器每次都从服务器载入网页

Response.Expires = -1

Response.AddHeader "Pragma","no-cache"

Response.AddHeader "cache-control","no-store"

%>

【殷亮的留言本】谨以此留言板献给WISHES

<% '''''打开数据文件test.xml

set guestXml = Server.CreateObject("MSXML.DOMDocument")

guestXml.load Server.MapPath("guest.xml")

set root = guestXml.documentelement.childNodes

num = root.length '''''获得留言总数

%>

殷 亮 的 留 言 本 】

<%

for i=1 to (num-1)\5+1 '''''因为是每5条留言为1页,所以总页数就是(num-1)\5+1

Response.Write("")

Response.Write(" 第 "&i&" 页 |") '''''通过此循环便制定了一个页间的导航。

Response.Write("") '''''相当于HTML代码 第1页

next

%>

头像列表

|

留言赠语 您的名字:

您在何方:

align="center">

<% '''''在浏览器的状态栏中显示类似"当前共有8条留言,分2页显示,最近留言的人是陈树"

status = "当前共有"& num &"条留言,分"& (num-1)\5+1 &"页显示,最近留言的人是"& guestXml.documentelement.lastchild.firstchild.text

Response.Write("")

%>

------------------------------------------------------------------------------

◆ 3 ◆ include.asp 该文件嵌入在主页面中,用来显示留言。

------------------------------------------------------------------------------

<% '使浏览器每次都从服务器载入内容

Response.Expires = -1

Response.AddHeader "Pragma","no-cache"

Response.AddHeader "cache-control","no-store"

%>

留言赠语

<% '''''打开留言本数据文件

set guestXml = Server.CreateObject("MSXML.DOMDocument")

guestXml.load(Server.MapPath("guest.xml"))

set root = guestXml.documentelement

num = root.childNodes.length

page=Request.QueryString("page")

if page=Empty then '''''如果没有参数传递,即http://…/include.asp时的情况。

thispage = (num-1)\5+1 '''''每页显示5条留言,用thispage表示当前页码,无参数传递时显示最后一页。

if num mod 5 = 0 then

msgTotal = 5 '''''变量 msgTotal 表示当前页应该显示的留言数量

else

msgTotal = num mod 5

end if

else

thispage = page '''''类似于http://…/include.asp?page=1时的情况

if StrComp(thispage,(num-1)\5+1,1)=0 then

msgTotal = num mod 5

else

msgTotal = 5

end if

end if

msgNum = (thisPage-1)*5+msgTotal ''''msgNum表示当前页显示的留言是总条数的第N条

''''因为是倒序显示,所以第一条留言应该是(thisPage-1)*5+msgTotal

%>

<%for i=1 to msgTotal%>

<%

set xmlNode = root.childNodes.item(msgNum-1).childNodes ''定位到要读取的留言

name = xmlNode.item(0).text '''''name变量表示留言人的姓名.

pic = xmlNode.item(1).text '''''pic变量表示头像的地址。

add = xmlNode.item(2).text '''''add变量表示留言人的地址。

thistime = xmlNode.item(3).text '''''this变量表示留言时间。

''''不显示留言人的EMAIL。

msg = xmlNode.item(5).text ''''msg变量表示留言内容。

%>

src=<%=pic%> width="100" height="143">

姓名 <%=name%> 来自 <%=add%>

bgcolor="#9933FF"

style="line-height: 150%; margin-left: 50; margin-right: 50">

第<%=thispage%>页 | 第<%=msgTotal-i+1%>条 | <%=thistime%> |


<%

msgNum = msgNum-1 ''''倒序显示,所以下一条留言的下标应是当前下标-1

next ''''循环。

%>

-------------------------------------------------------------------------

◆ 4 ◆ certain.asp 该文件用于向XML文件中添加记录,并确认留言。

-------------------------------------------------------------------------

【殷亮的留言本】留言确认

<% '定义一个函数,用于检取留言内容。

function htmlencode(str)

dim result

dim l

if isNULL(str) then

htmlencode=""

exit function

end if

l=len(str)

result=""

dim i

for i = 1 to l

select case mid(str,i,1)

case "<"

result=result+"<"

case ">"

result=result+">"

case else

result=result+mid(str,i,1)

end select

next

htmlencode=result

end function

set guestXml = Server.CreateObject("MSXML.DOMDocument")

guestXml.load(Server.MapPath("guest.xml"))

set root = guestXml.documentelement

name = Request.Form("textname") '''''检取表单的各项提交。

pic = Request.Form("list")

add = Request.Form("textadd")

email = Request.Form("textmail")

thistime = now()

msg = Request.Form("textmsg")

set newTag = guestXml.createelement("留言")

root.appendchild newTag

set currentTag = root.lastChild

set nameTag = guestXml.createelement("姓名")

nameTag.text=htmlencode(name)

currentTag.appendchild nameTag

set picTag = guestXml.createelement("头像")

picTag.text=pic

currentTag.appendchild picTag

set addTag = guestXml.createelement("来自")

addTag.text=htmlencode(add)

currentTag.appendchild addTag

set timeTag = guestXml.createelement("时间")

timeTag.text=thistime

currentTag.appendchild timeTag

set emailTag = guestXml.createelement("信箱")

emailTag.text=htmlencode(email)

currentTag.appendchild emailTag

set msgTag = guestXml.createelement("内容")

msgTag.text=htmlencode(msg)

currentTag.appendchild msgTag

guestXml.save(Server.MapPath("guest.xml"))

%>

'''''一个FLASH文件。

style="position: absolute; left: 282; top: 313; border-style: solid; border-width: 1; background-color: #ABB52F">

style="position: absolute; left: 414; top: 313; border-style: solid; border-width: 1; background-color: #ABB52F">

---------------------------------------------------------------------------------

备注:

由于我们是用XML文件保存数据,所以在添加数据时的HTML过滤是很重要的。在基于数据库的

留言本中不小心留下一个HTML标签也许不会造成什么太大的问题,但在XML中,后果是严重的

随便的一个标记,甚至随便的一个"<"都可以让你的留言本瘫痪。

如“<姓名>约翰<列浓”………………………

上面四个文件源代码都已经过测试,复制后便可使用。

如果你想看示例演示,可以点击后面的链接 示例

你也可以从http://0724.y365.com/guest.rar处

下载所有脚本文件与图像文件的压缩包。

旨在探讨,如有错漏,欢迎指正与讨论。

感谢站长miles这些日子来不倦的帮助,无以回报,唯有灌上此文。

责任编辑:admin
相关文章