欢迎光临
我们一直在努力

第三种途径—基于XML的ASP留言板-ASP教程,XML相关

建站超值云服务器,限时71元/月

坦白地说,对于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 该文件用来保存留言的数据文件,相当于数据库。

———————————————————————-

<?xml version="1.0" encoding="gb2312"?>

<殷亮的留言本>

<留言>

<昵称>殷亮</昵称>

<头像>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文件,只需一字不改地照写第一行“<?xml version="1.0"

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"

%>

<html>

<head>

<meta name="generator" content="microsoft frontpage 5.0">

<meta name="progid" content="frontpage.editor.document">

<meta http-equiv="content-type" content="text/html; charset=gb2312">

<style type="text/css">

<!–

a:link {text-decoration:none;color:#000000}

a:active {text-decoration:none;color:#cc33ff}

a:visited {text-decoration:none;color:#000000}

a:hover {text-decoration:underline overline;color:#ccccff}

p, br, body, td, select, input, form, textarea, option{ font-family: 宋体; font-size: 9pt }

.input1 { font-size: 9pt; height: 18px; border: 1px #000000 solid; background-color: #ccccff}

.input2 { font-size: 9pt; height: 16px; border: 1px #000000 solid; background-color: #ccccff}

–></style>

<title>【殷亮的留言本】谨以此留言板献给wishes</title>

</head>

<body bgcolor="#cc33ff">

<center>

<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="750" id="autonumber3" height="45">

<tr>

<td width="100%" bgcolor="#9933ff" align="middle" height="21" colspan="2" style="font-size: 9pt; font-family: 宋体">&nbsp;【

殷 亮 的 留 言 本 】</td>

</tr>

<% 打开数据文件test.xml

set guestxml = server.createobject("msxml.domdocument")

guestxml.load server.mappath("guest.xml")

set root = guestxml.documentelement.childnodes

num = root.length 获得留言总数

%>

<tr>

<td width="77%" bgcolor="#9933ff" align="left" height="21" style="font-size: 9pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;

<%

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

response.write("<a href=include.asp?page="& i &" target=include>")

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

response.write("</a>") 相当于html代码 <a href=include.asp?page=1 target=include>第1页</a>

next

%>

</td>

<td width="23%" bgcolor="#9933ff" align="middle" height="21" style="font-size: 9pt; font-family: 宋体">&nbsp;<a href="piclist.html" target="_blank">头像列表</a>

| <label id=lab1 onclick="window.scroll(0,70)">书写留言</label></td>

</tr>

</table>

<p><iframe name="include" width="749" height="314" src="include.asp" style="border-right: #000000 1px double; padding-right: 4px; border-top: #000000 1px double; padding-left: 4px; padding-bottom: 1px; border-left: #000000 1px double; padding-top: 1px; border-bottom: #000000 1px double">

浏览器不支持嵌入式框架,或被配置为不显示嵌入式框架。</iframe></p>

<table border="1" cellpadding="0" cellspacing="0" bgcolor="#9933ff" style="border-collapse: collapse" bordercolor="#111111" width="750" id="autonumber4" height="1">

<form method="post" action="certain.asp">

<tr>

<td width="21" height="1" align="left" style="vertical-align: middle; line-height: 150%; letter-spacing: 3pt" rowspan="3">留言赠语</td>

<td width="96" height="25" align="middle">您的名字:</td>

<td width="171" height="25" align="middle">

<input size="20" name="textname" class="input1">

</td>

<td width="88" height="25" align="middle">您在何方:</td>

<td width="194" height="25" align="middle">

<input size="20" name="textadd" class="input1">

</td>

<td width="173" height="25" align="middle" colspan="2">

<input size="20" name="textmail" value="yourmail@" class="input1">

</td>

</tr>

<tr>

<td width="552" height="1" colspan="4" rowspan="2"

align="center">

<textarea style="border-style:double; border-width:3; width: 523px; height: 37px; background-color:#ccccff; overflow:hidden" cols="72" rows="1" name="textmsg" class="input1">

</textarea></td>

<td width="10" height="1" rowspan="2" align="center"><img border="0" src="pic/1.jpg" width="40" height="56" id=idface>

</td>

<td width="159" height="1" align="center">&nbsp;<select name="list" class="input1" style="width: 61;height:61" onchange="document.images[idface].src=options[selectedindex].value;">

<option value=pic/1.jpg selected>头像1

<script language=vbscript>

for i=2 to 15 循环,用以设定下拉列表中的另外14个文件

document.write("<option value=pic/"&i&".jpg>头像"&i)

next

</script>

</option>

</select>

<input style="width: 65px; height: 19px" type="button" value="头像列表" class="input2">

</td>

</tr>

<tr>

<td width="159" height="1" align="center"><input style="width: 65px; height: 19px" type="reset" size="25" value="清空" class="input2">

<input style="width: 65px; height: 19px" type="submit" value="提交" class="input2"></td>

</tr>

</form>

</table>

</center>

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

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

response.write("<script>")

response.write("window.status="&chr(34)& status &chr(34))

response.write("</script>")

%>

</body>

</html>

——————————————————————————

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

——————————————————————————

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

response.expires = -1

response.addheader "pragma","no-cache"

response.addheader "cache-control","no-store"

%>

<html>

<head>

<meta http-equiv="content-language" content="zh-cn">

<meta http-equiv="content-type" content="text/html; charset=gb2312">

<title>留言赠语</title>

<style>

<!–

p, br, body, td, select, input, form, textarea, option{ font-family: 宋体; font-size: 9pt }

table{border-style:double; border-width:3; padding:0; border-collapse: collapse}

.input1 { font-size: 9pt; border: 1px #000000 solid; background-color: #ccccff}

–>

</style>

</head>

<body bgcolor="#cc33ff">

<center>

<% 打开留言本数据文件

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变量表示留言内容。

%>

<table border="1" cellpadding="0" cellspacing="0" bordercolor="#111111" width="100%" height="106" bgcolor="#ffffff">

<tr>

<td width="14%" rowspan="3" height="106" align="center">

<img border="0"

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

<td width="9%" height="10" align="center" bgcolor="#99ccff">姓名</td>

<td width="31%" height="10" align="center" bgcolor="#ccccff"><%=name%></td>

<td width="10%" height="10" align="center" bgcolor="#99ccff">来自</td>

<td width="36%" height="10" align="center" bgcolor="#ccccff"><%=add%></td>

</tr>

<tr>

<td width="86%" height="83" colspan="4" align="center"

bgcolor="#9933ff"

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

<textarea name="textmsg" class="input1" rows="6" cols="87" readonly><%=msg%></textarea></td>

</tr>

<tr>

<td width="86%" height="11" colspan="4" align=right bgcolor="#ccccff">第<%=thispage%>页 | 第<%=msgtotal-i+1%>条 | <%=thistime%> |</td>

</tr>

</table>

<br>

<%

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

next 循环。

%>

</center>

</body>

</html>

————————————————————————-

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

————————————————————————-

<html>

<head>

<meta name="generator" content="microsoft frontpage 5.0">

<meta name="progid" content="frontpage.editor.document">

<meta http-equiv="content-type" content="text/html;

charset=gb2312">

<title>【殷亮的留言本】留言确认</title>

</head>

<script language=vbscript>

sub btn1_onclick 当按下"查看留言"时,将网页导至留言页面

window.location="guest.asp"

end sub

sub btn2_onclick

window.close

end sub

</script>

<body>

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

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+"&lt"

case ">"

result=result+"&gt"

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"))

%>

<embed width="350" height="200" src="pic/certain.swf" style="position: absolute; left: 214; top: 86">一个flash文件。

<input type="button" value="查看留言" name="btn1"

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

<input type="button" value="关闭此页" name="btn2"

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

</body>

</html>

———————————————————————————

备注:

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

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

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

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

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

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

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

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

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

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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 第三种途径—基于XML的ASP留言板-ASP教程,XML相关
分享到: 更多 (0)