用Flash、Asp、XML来构建一个论坛。

  先来看看论坛的功能,有登陆,查看主题,查看正文,发表新主题,回复主题,删除,权限管理等等基本功能,根据需要在此基础上稍作修改,就可以实现一个功能比较完备的论坛了。下面就按顺序一个一个来实现论坛的功能,每一个介绍的内容都分为“传递的XML”、“Flash端”、“Asp端”三部分。

  点击附件下载本教程的源文件及代码

  一、登陆

  登陆就是将用户名和密码用XML格式发送到服务器端,服务器端将验证的结果用XML格式返回。

  A、传递的XML

  所谓传送的XML,就是在服务器端跟Flash端之间传送的XML字符串,也就是一般意义上的通讯报文了。

  1、请求报文


<LOGIN><USERNAME>用户名</USERNAME><PWD>密码</PWD></LOGIN>

  2、响应报文


<LOGIN name=”用户名” right=”权限”></LOGIN>

  B、Flash端

  1、在Flash MX 2004中新建一个Flash文件,在场景的第一帧的ActionScript面板上增加语句:

  stop();

  2、在第一帧的场景中用文本工具拉两个文本框,类型都为“Input type”,变量名var分别设置为“username”、“pwd”,这是用来输入用户名跟密码的。

  3、新建一个Button并拖到第一帧的场景中,摆放位置如图1所示。并在这个Button的ActionScript面板中增加如下语句:

on(release){
loginXml = new XML(); // 注释1
loginElement = loginXml.createElement("LOGIN"); // 注释2
// name node
nameElement = loginXml.createElement("USERNAME"); // 注释3
nameNode = loginXml.createTextNode("name"); // 注释4
nameNode.nodeValue = _root.username; // 注释5
nameElement.appendChild(nameNode); // 注释6
// pwd node
pwdElement = loginXml.createElement("PWD"); // 注释7
pwdNode = loginXml.createTextNode("pwd");
pwdNode.nodeValue = _root.pwd;
pwdElement.appendChild(pwdNode);
loginElement.appendChild(nameElement); // 注释8
loginElement.appendChild(pwdElement); // 注释9
loginXml.appendChild(loginElement); // 注释10

xmlRepley = new XML(); // 注释11
xmlRepley.onLoad = onLoginReply; // 注释12
function onLoginReply (success) {
if (success) { // 注释13
if (xmlRepley.firstChild.firstChild.attributes.right == "1") { // 注释14
_root.gotoAndPlay("main")
}else {
_root.username = "登陆失败";
}
}
}
loginXml.sendAndLoad("http://localhost/xmlbbs/login.asp", xmlRepley); // 注释15

注释1:新建一个XML对象,这是用来发送到服务器端的。

  注释2:创建一个LOGIN结点对象。

  注释3:创建一个USERNAME结点对象,注意不能直接在Element对象中放置文本内容,要在Text Node对象中才能放置文本内容。具体可以参见Flash帮助文件中有关XML.createElement()和XML.createTextNode() 中的内容。

  注释4:创建一个Text Node对象,用来放置USERNAME结点的文本内容。

  注释5:对Text Node结点赋值。

  注释6:将创建的Text Node结点插入到USERNAME结点对象中。

  注释7:分别创建一个PWD结点对象和Text Node,并将Text Node结点插入到PWD结点对象中。

  注释8:将USERNAME结点对象插入到LOGIN结点对象中。

  注释9:将PWD结点对象插入到LOGIN结点对象中。

  注释10:将LOGIN结点对象插入到所创建的XML对象中,从而构造一个完整的XML对象。注意这里在构建XML对象时,是从最里面开始构建的。

  注释11:新建一个XML对象,这里是用来放置接收到的XML对象的。

  注释12:设置接收XML对象的响应函数,当服务器端返回XML对象的时候触发。

  注释13:success是标示XML对象是否从服务器返回的标示位。

  注释14:判断返回的XML对象中的结点属性是否符合要求。

  注释15:利用sendAndLoad()函数,将Flash端的XML对象发送到服务器端,并接收从服务器端返回的XML对象。

  C、Asp端

  新建一个Asp文件,命名为login.asp,输入如下的内容:

<%
Set MyFileObject = Server.CreateObject("Scripting.FileSystemObject") ‘注释1
Set MyTextFile = MyFileObject.CreateTextFile("G:\写作\flashxmlbbs\login.xml", 8, TRUE) ‘注释2
MyTextFile.WriteLine(Request.Form) ‘注释3

set objDom = server.CreateObject("microsoft.xmldom") ‘注释4
objDom.loadxml(Request.Form) ‘注释5
set objname = objdom.documentElement.SelectSingleNode("//LOGIN/USERNAME") ‘注释6
username = objname.text ‘注释7

set objpwd = objdom.documentElement.SelectSingleNode("//LOGIN/PWD") ‘注释8
pwd = objpwd.text
righ = "-1"

'判断
set conn=Server.CreateObject("ADODB.Connection")
conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/xmlbbs/xmlbbs.mdb") ‘注释9
set rs=Server.CreateObject("ADODB.Recordset") ‘注释10
strSql="select * from UserInfo where username = '" & username & "' and userpwd = '" & pwd & "'" ‘注释11
rs.open strSql,conn, 1, 1 ‘注释12
if not(rs.bof and rs.eof) then ‘注释13
righ = rs("userright") ‘注释14
Else
righ = "0"
end if
rs.close
conn.close

'返回
response.write("<LOGIN><USRENAME name=""" & username & """ right=""" & righ & """>" & username & "</USERNAME></LOGIN>") ‘注释15
%>


 注释1:利用FileSystemObject组件建立一个文件对象,将通讯过程中传送的东西写在文件里面,方便调试。

  注释2:根据实际需要修改文件的路径。

  注释3:把Request.Form是传送进来的所有内容都写在文件里面,在服务器端留下痕迹。

  注释4:创建一个XML对象。可以在MS XML包中找到更多有关XML操作的信息。

  注释5:通过loadxml()函数,导入Flash端传送进来的XML格式字符串。

  注释6:建立USERNAME结点的对象。

  注释7:取得USERNAME结点的内容。

  注释8:建立PWD结点的对象,取得PWD结点的内容。

  注释9:建立一个数据库的ADO连接,这里用到的是Access 2000数据库,数据库的格式见后面的附录,请注意数据库的存放位置。

  注释10:建立一个数据库Recordset集合。

  注释11:根据取得的用户名和密码,构造一个SQL字符串。

  注释12:根据构造的SQL字符串去查询数据库。

  注释13:判断用户名及密码是否正确。

  注释14:用户名及密码正确,取得数据库中相应的权限。

  注释15:直接构造一个XML字符串,并通过write函数写到Flash端。


  二、查看主题

  查看主题就是Flash端向服务器端发送请求,服务器端将数据库中所保存的文章主题用XML格式发送到Flash端。

  A、传递的XML

  1、请求报文

  2、响应报文


<TITLE title1=”标题1” id1=”编号1” title2=”标题2” id2=”编号2” title3=”标题3” id3=”编号3” title4=”标题4” id4=”编号4” title5=”标题5” id5=”编号5” title6=”标题6” id6=”编号6” title7=”标题7” id7=”编号7” title8=”标题8” id8=”编号8” title9=”标题9” id9=”编号9” title10=”标题10” id10=”编号10”>< /TITLE >

  B、Flash端
1、在场景的第二帧上“插入关键帧”,将此帧命名为“main”,并在此帧的Action Script面板上增加如下语句:
fileNowId = "0";
fileId1 = "0";
fileId2 = "0";
fileId3 = "0";
fileId4 = "0";
fileId5 = "0";
fileId6 = "0";
fileId7 = "0";
fileId8 = "0";
fileId9 = "0";
fileId10 = "0";
stop();

  注释:上面这些变量都是为了保存从服务器端返回的Id号而设置的。

  2、在第二帧的场景中用文本框工具拉十个文本框,类型都设置为“Input Type”,变量var分别设置为“title1”、“title2”、“title3”、“title4”、“title5”、“title6”、“title7”、“title8”、“title9”、“title10”。

  3、在第二帧的场景中增加一个显示为“更新”Button,用来更新主题,在此Button的Action Script面板上增加如下语句:

on(release){
titleXml = new XML(); // 注释1
titleElement = titleXml.createElement("TITLE"); // 注释2
loginElement.appendChild(titleElement); // 注释3
titleXml.appendChild(titleElement);

titleRepley = new XML(); // 注释4
titleRepley.onLoad = onTitleReply; // 注释5
function onTitleReply (titlesuccess) {
if (titlesuccess) { // 注释6
_root.title1 = titleRepley.firstChild.attributes.title1; // 注释7
_root.title2 = titleRepley.firstChild.attributes.title2;
_root.title3 = titleRepley.firstChild.attributes.title3;
_root.title4 = titleRepley.firstChild.attributes.title4;
_root.title5 = titleRepley.firstChild.attributes.title5;
_root.title6 = titleRepley.firstChild.attributes.title6;
_root.title7 = titleRepley.firstChild.attributes.title7;
_root.title8 = titleRepley.firstChild.attributes.title8;
_root.title9 = titleRepley.firstChild.attributes.title9;
_root.title10 = titleRepley.firstChild.attributes.title10;
_root.fileId1 = titleRepley.firstChild.attributes.id1; //注释8
_root.fileId2 = titleRepley.firstChild.attributes.id2;
_root.fileId3 = titleRepley.firstChild.attributes.id3;
_root.fileId4 = titleRepley.firstChild.attributes.id4;
_root.fileId5 = titleRepley.firstChild.attributes.id5;
_root.fileId6 = titleRepley.firstChild.attributes.id6;
_root.fileId7 = titleRepley.firstChild.attributes.id7;
_root.fileId8 = titleRepley.firstChild.attributes.id8;
_root.fileId9 = titleRepley.firstChild.attributes.id9;
_root.fileId10 = titleRepley.firstChild.attributes.id10;
}
}
titleXml.sendAndLoad("http://localhost/xmlbbs/title.asp", titleRepley); // 注释9
}

 

  注释1:创建一个用来发送的XML对象。
  注释2:创建TITLE结点对象。
  注释3:将TITLE结点对象添加到XML对象中。
  注释4:创建一个响应的XML对象。
  注释5:设置响应XML对象的onLoad函数。
  注释6:titlesuccess标示是否从服务器端返回来的XML对象。
  注释7:将返回的标题属性显示在场景的文本框中。
  注释8:将返回的Id号保存在场景的变量中。
  注释9:利用sendAndLoad()函数,将Flash端的XML对象发送到服务器端,并接收从服务器端返回的XML对象。
C、Asp端

  新建一个Asp文件,命名为title.asp,输入如下的内容:

<%
Set MyFileObject = Server.CreateObject("Scripting.FileSystemObject") ‘ 注释1
Set MyTextFile = MyFileObject.CreateTextFile("G:\写作\flashxmlbbs\login.xml", 8, TRUE)
MyTextFile.WriteLine(Request.Form) ‘ 注释2

set objDom = server.CreateObject("microsoft.xmldom") ‘ 注释3
objDom.loadxml(Request.Form) ‘ 注释4
set objname = objdom.documentElement.SelectSingleNode("//TITLE") ‘ 注释5

'判断
set conn=Server.CreateObject("ADODB.Connection")
conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/xmlbbs/xmlbbs.mdb") ‘ 注释6
set rs=Server.CreateObject("ADODB.Recordset")
strSql="select * from fileinfo "
rs.open strSql,conn, 1, 1 ‘ 注释7
tempNum = 1
strResult = ""
do until tempNum = 11 ‘ 注释8
if rs.eof then ‘ 注释9
exit do
end if
strResult = strResult & " title" & tempNum & "=""" & rs("title") & """" & " id" & tempNum & "=""" & rs("ID") & """" ‘ 注释10
tempNum = tempNum + 1
rs.movenext ‘ 注释11
loop
rs.close
conn.close

'返回
response.write("<TITLE " & strResult & "></TITLE>") ‘ 注释12
%>

 


  注释1:创建一个文件对象。

  注释2:将从Flash端传送来的XML字符串写在临时文件中。

  注释3:创建一个XML对象。

  注释4:将Flash端传送来的XML字符串导入到XML对象中。

  注释5:创建TITLE结点对象。

  注释6:创建一个数据库的ADO连接,打开数据库。

  注释7:构造一个SQL字符串,在数据库中查询符合条件的记录。   注释8:循环读取Recordset记录集中的记录。

  注释9:如果到了记录集的末尾,退出循环。

  注释10:将从记录集中读出来的记录按格式拼凑成一个字符串。

  注释11:将Recordset记录集中的指针下移一步。

  注释12:将在循环中构造的字符串发送到Flash端。

posted on 2006-03-28 15:27  间歇博客  阅读(147)  评论(0编辑  收藏  举报