《走近云计算》阅读笔记11--云登陆前的交互技术难点

来源:互联网 发布:大型网络手游 编辑:程序博客网 时间:2024/05/20 03:47
 

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();

 

原创粉丝点击