1.Java与XML的转换
1.概述:
(1)主服务器采用Java编写,客户端采用的是Flex语言,所以会选择XML进行两种语言的交互。
(2)将主服务器的JavaBean封装好的数据转换成XML进行交互(javax.xml和org.w3c.dom)
javax.xml包是根据XML规范所定义的,它具有XML核心的常量和功能。
org.w3c.dom包是为文档对象模型DOM提供接口,该模型是Java API for XML Processing的组件API。
2.Java与XML的转换分为三步
(1)初始化
protected DocumentBuilderFactory builderFactory=null; //定义解析器对象
protected DocumentBuilder builder = null; //定义DocumentBuilder对象
protected Document doucment = null;
public JavaXml() throws Exception{
builderFactory = DocumentBuilderFactory.newInstance();//生成解析器实例
builder = builderFactory.newDocumentBuilder();//获得实例
doucment = builder.newDocument();
}
(2)生成根节点
为了方便Flex解析,要创建一个根节点,再将其他数据节点作为根结点的子结点插入到XML文档中。
在生成根节点时候,还要引入Element类,定义一个新的Element。
创建好后便可以加入到Document实例之中去。
//生成根节点
root = document.createElement("root"); //生成根结点
document.appendChild(root); //将根结点加入到Document实例之中
(3)插入节点数据
在根结点创建好后,就可以创建新的数据结点,创建方法和创建根结点的方法相同,然后将JavaBean中封装的数据转化为数据节点的属性
//插入节点数据
Element newnode = document.createElement("newnode");//创建数据节点
//newnode.setAttribute("int",String.valueOf(JavaBean.getInt()));
//增加整型属性,要将整型数据转化为字符串
//newnode.setAttribute("string",JavaBean.getString());
//增加字符串属性
//将数据节点插入根结点,作为其子结点
root.appendChild(newnode);
2.XML的数据交互问题
由服务器采用Java,因此,直接使用Flex的<mx:HTTPService>组件进行数据收发
(1)组件的属性id是组件在Flex程序中的唯一标识,当用组件提供的send()方法发送数据时,要用组件id来确定发送哪个组件的数据
(2)组件的属性url定义了接收数据的服务器的位置,在本系统中就是servlet在服务器配置文件web.xml中所设置的映射
(3)服务器只接受post方法发来的HTTP请求,所以组件中的method属性应该设置为post
(4)组建的属性result用来确定接受此次请求所返回的结果由哪个函数进行处理
(5)如果所接收数据为复杂结构化XML文档,需要将属性resultFormat = xml,否则无法识别
HTTPService组件
<mx:HTTPService id = "httpService" url="http://localhost:8080/flex/heldServlet"
showBusyCursor ="true" method = "POST" result="resultHandle(event)" resultFormat="xml">
<mx:request>//requeset里面加载的为传输的数据内容
<service> //数据的名称
{serviceClass} //动态绑定数据内容
</service>
</mx:request>
</mx:HTTPService>
//发送请求
httpService.send(); //发送数据,httpService组件的ID属性
//处理请求结果的函数
private function resultHandle(e:ResultEvent):void{
//e.result.xml中的节点名用来取出节点内包含的数据
var value:String = e.result.root.node;
//e.result.xml中的节点名用来取出节点内包含的数据
var value:String = e.result.root.node.@attributeName;
}
服务端用Java编写
(1)发送XML数据时要对response对象进行设置,否则客户端无法识别
response.setContentType("text/xml"); //定义传输数据的类型
response.setCharacterEncoding("UTF-8"); //定义传输数据的字符集
(2)传输数据给请求服务的客户端,在客户端输出
PrintWriter out = response.getWriter(); //创建输出流
out.println();
3.共享数据的实现
采用Flex专门的共享对象来解决共享问题。
(1)页面初始化部分是共享数据出现的第一个位置,这里要做的是对共享数据的初始化工作,这样做的好处:可以在整个页面中随时调用共享数据。
数据共享的代码
import flash.net.SharedObject; //引入SharedObject用到的包
public var shareObject:ShareObject; //声明共享变量
private function init():void { //初始化函数
//设置从共享目录的根目录加载共享数据
shareObject = SharedObject.getLocal("userData","/");
//将共享写入共享数据文件,如果没有共享数据文件则自动创建
shareObject.flush();
}
创建或者获取共享对象调用的都是SharedObject的getLocal方法,只要所请求的共享数据存在,则获得其共享数据,不存在则创建共享数据。getLocal的方法中第一个参数表示共享数据名称,而第二个参数表示共享数据的存储目录,如果开发者未定义共享数据的存储目录,Flex将自动为共享数据创建一个与swf文件相同的目录存放共享数据,这会导致不同页面所产生的共享数据在不同的存储目录下,无法达到共享数据的目的。
正确的方法是设置第二个参数,这样共享数据的存储路径就都为Flex的共享数据根路径之下,达到数据共享的目的。
(2)有了共享数据对象之后,要为共享数据对象设置共享数据变量,并为其赋值,这样就可以在整个应用中随时调用共享变量中保存的共享数据值。
//为共享数据中的共享变量赋值,variable为变量名,value为数据值
shareObject.data.variable = value;
//将共享写入共享数据文件进行保存
shareObject.flush();
(3)一个包含共享数据值的共享数据对象已经被保存成功,如果在其他页面需要用到此变量值时,
//读取共享数据值
variable = shareObject.data.variable;
(4)在整个应用关闭时,可以根据用户需要将共享数据清除或者保存
//清除共享数据
shareObject.clear();