在”解析六“中我们提到了利用URLRequest和URLLoader来读XML文件,并加载内容,然后有提到布置学生思考题的问题,这个坑貌似有点深,所以需要来帮忙填下。思考题内容就一个,如何利用FLEX来将评论内容写入到XML文件中,那样就可以保留数据了。
这里有个前提,我们做的FLEX应用都是WEB应用而不是桌面应用,所以想直接写文件肯定是行不通的了。这里就涉及到服务器端的应用了。教的学生其实是有基础的,他们的前导课程中开过JSP,所以应该说只要有了思路,实现基本上没难度的,只是稍微有点记忆压力,要回想起当初的课程内容。学霸应该表示压力==0。
因为我是教asp.net的,当然ASP也挺熟悉,所以我们就以简单的ASP来作为服务器端技术来实现XML文件的写入操作。JSP表示不熟,我想同学们是能分分钟搞定的。
原理很简单:
1、获取评论输入界面所输入的所有信息,这个在前面的”解析五“中 已经详细介绍;
2、将这些信息POST或者GET传输到服务器端页面(应该可以用前面提到的URLLoader或者HTTPSERVICE或者WEBSERVICE来实现,这里用最明了的方式,就是URLLoader的方式)
3、在服务器端进行写操作
4、回传状态码,或者回传数据内容(我这里只是回传状态码,根据状态码在FLEX里更新评论列表,而不是回传评论内容从而更新评论列表)
一步一步来实现。
第一步:代码如下,和”解析五“中一样:
var theNickName:String=cmtDialog.nickName.text;
var theContent:String=cmtDialog.content.text;
var theReNickName:String=cmtDialog.reNickName;
var theReFloor:int=cmtDialog.reFloor;
var theCommentID:int=commentXML.children().length()+1;
var theFloor:int=theCommentID; //这里不考虑中间评论被删除后ID会有空缺的情况
var theDate:Date=new Date();
var theAddTime:String=theDate.fullYear+"年"+(theDate.month+1)+"月"+theDate.date+"日 "+theDate.hours+":"+theDate.minutes;
//以下代码是为FLEX中更新数据准备的,在下面的第四步中有用到
var commentItemStr:String="<commentItem><commentID>"+theCommentID+"</commentID>";
commentItemStr+="<diaryID>1</diaryID>";
commentItemStr+="<floor>"+theFloor+"</floor>";
commentItemStr+="<nickName>"+theNickName+"</nickName>";
commentItemStr+="<reFloor>"+theReFloor+"</reFloor>";
commentItemStr+="<reNickName>"+theReNickName+"</reNickName>";
commentItemStr+="<content>"+theContent+"</content>";
commentItemStr+="<addTime>"+theAddTime+"</addTime></commentItem>";
commentItemXML=new XML(commentItemStr);
第二步:传输数据到服务器端,代码如下:
aspRequest=new URLRequest("../writeComment.asp");//请求的服务器页面,也就是发送数据到哪里
aspLoader=new URLLoader(aspRequest); //开始加载
aspRequest.method=URLRequestMethod.POST; //设定传输方式POST/GET,这里用了POST
var values:URLVariables=new URLVariables(); //设定传输的变量对象URLVariables类型
//以下分别设定传输变量名及对应的变量值
values.commentID=theCommentID;
values.diaryID=1;
values.floor=theFloor;
values.nickName=theNickName;
values.reFloor=theReFloor;
values.reNickName=theReNickName;
values.content=theContent;
values.addTime=theAddTime;
//变量设定结束
aspRequest.data=values; //设定传输的数据为上面设定好的URLVariables对象
aspLoader.dataFormat=URLLoaderDataFormat.VARIABLES;
//上面那句设定传输的数据格式为BINARY/TEXT/VARIABLES,这里设定为VARIABLES,即name1=value1&name2=value2...这种
aspLoader.load(aspRequest); //加载传输
aspLoader.addEventListener(Event.COMPLETE,msgSendCompliteHandler); //添加事件监听,监听是否有服务器端反馈
第三步:服务器端ASP代码:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
set xml = Server.CreateObject("MSXML2.domdocument")
xml.load Server.MapPath("shangle.net-debug/data/commentList.xml")
set nodeRoot = xml.documentElement
set nodeCommentItem = xml.createElement("commentItem")
nodeRoot.appendChild nodeCommentItem
set nodeCommentID = xml.createElement("commentID")
nodeCommentID.text=Request.Form("commentID")
nodeCommentItem.appendChild nodeCommentID
set nodeDiaryID = xml.createElement("diaryID")
nodeDiaryID.text = Request.Form("diaryID")
nodeCommentItem.appendChild nodeDiaryID
set nodeFloor = xml.createElement("floor")
nodeFloor.text = Request.Form("floor")
nodeCommentItem.appendChild nodeFloor
set nodeNickName=xml.createElement("nickName")
nodeNickName.text = Request.Form("nickName")
nodeCommentItem.appendChild nodeNickName
set nodeReFloor = xml.createElement("reFloor")
nodeReFloor.text=Request.Form("reFloor")
nodeCommentItem.appendChild nodeReFloor
set nodeReNickName= xml.createElement("reNickName")
nodeReNickName.text=Request.Form("reNickName")
nodeCommentItem.appendChild nodeReNickName
set nodeContent = xml.createElement("content")
nodeContent.text=Request.Form("content")
nodeCommentItem.appendChild nodeContent
set nodeAddTime = xml.createElement("addTime")
nodeAddTime.text=Request.Form("addTime")
nodeCommentItem.appendChild nodeAddTime
xml.save Server.MapPath("shangle.net-debug/data/commentList.xml")
set nodeCommentItem = nothing
set nodeRoot=nothing
set nodeCommentID = nothing
set nodeDiaryID = nothing
set nodeFloor = nothing
set nodeNickName = nothing
set nodeReFloor = nothing
set nodeReNickName = nothing
set nodeContent = nothing
set nodeAddTime = nothing
response.write "flag=1" '这里要注意的是就回传了flag=1,而没有判断错误状态下的回传内容,自己扩展
response.end()
%>
上面的代码分隔比较有规则,所以就不另作解释了,主要提下第一行是一个全局设定,ASP脚本代码为VBScript,编码65001表示UTF-8
第四步:根据ASP代码中那句response.write ”flag=1“,来获取回传过来的”flag=1“,然后判断flag的值是否为1,如果为1就表示加载成功,就可以更新评论列表了。代码主要写在第三步中添加的事件监听的对应函数中:
private function msgSendCompliteHandler(event:Event):void{
if(aspLoader.data.flag=="1")
{
commentXML.appendChild(commentItemXML); //这里的commentItemXML变量在第一步中有设定
dataSource=new XMLListCollection(new XMLList(commentXML.commentItem));//将这个变量作为子节点添加到原XML内容中去
commentList.dataProvider=dataSource.list;//重新绑定数据
}
else
{
Alert.show(aspLoader.data);
}
}
一套九阴九阳打完收工。大坑已变小坑,希望大家自己调试。
【待续】