Felx之HTTPService
与Adobe ColdFusion,PHP或者是相似的服务器技术创建的程序不同,Flex程序并能直接与一个数据库进行交互。他们使用服务与数据进行交互。例如,我们可以在Flex文件中插入一个HTTP服务来与ColdFusion文件进行交互,从而从一个MySQL数据取得数据,转换成为XML,然后发送到我们的Flex程序。
在这一节,我们将会创建一个简单的获取最近留言并且允许用户读取留言的最前几条的BlogReader程序。我们可以使用一个名为HTTPService的RPC服务组件从一个RSS获取数据,然后我们将数据绑定到一个Label,DataGrid,TextArea和LinkButton控件。
在我们开始这一节之前,我们完成下面的任务:
如果我们没有创建工程,创建Lessons工程。
确保打开了自动构建选项。
出于安全的原因,运行在客户端计算机上的Flash播放中的程序只有在满足下面的条件时才可以访问远程数据源:
1 我们程序所编译的SWF文件与远程数据源在同一个域。
2 我们使用代理并且我们的SWF文件与代理在同一个服务器上。
Adobe Flex数据服务为Flex程序提供了一个完整的代理管理系统。我们也可以使用Web脚本语言,例如ColdFusion,JSP,PHP或者ASP创建一个简单的代理服务。
3 在远程数据源的服务器上安装一个crossdomain.xml文件。crossdomain.xml文件允许其他域的SWF文件
在这一节所使用的数据源位于一个配置了crossdomain.xml文件的域。所以,Flash播放器可以访问远程数据。
在这一节,我们创建我们的Blog-Reader程序的布局。
1 在浏览视图中选择Lessons工程,选择File>New>MXML Application创建一个名为BlogReader.mxml的程序文件。
2 通过在浏览视图中右击这个文件并从弹了菜单中选择Set As Default Appliction将设置为默认编译的程序文件。
3 在MXML编辑器的设计模式中,从内容视图的布局类中拖放一个面板容器,并且将其设置为如下面的属性:
Title: Blog Reader
Width: 475
Height: 400
X: 10
Y: 10
4 在设计模式中,通过在组件视图中拖放添加如下的控件:
DataGrid
TextArea
LinkButton
5 使用鼠标将这些控件布局为垂直,左对齐的列。
6 选择DataGrid控件设置为如下的属性:
Id: dgPosts
X: 20
Y: 20
7 选择TextArea控件设置为如下的属性:
X: 20
Y: 175
Width: 400
8 选择LinkButton控件设置如下的属性:
Label: Read Full Post
X: 20
Y: 225
布局效果如下图所示:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Panel x="10" y="10" width="475" height="400" layout="absolute" title="Blog Reader">
<mx:DataGrid id="dgPosts" x="20" y="20" width="400">
<mx:columns>
<mx:DataGridColumn headerText="Column 1" dataField="col1"/>
<mx:DataGridColumn headerText="Column 2" dataField="col2"/>
<mx:DataGridColumn headerText="Column 3" dataField="col3"/>
</mx:columns>
</mx:DataGrid>
<mx:LinkButton x="20" y="225" label="Read Full Post"/>
</mx:Panel>
</mx:Application>
程序运行效果如下图所示:

对于这一节的BlogReader程序,我们将会从Matt Chotion的Bloghttp://www.adobe.com/go/mchotinblog获取留言信息。Matt是Flex开发团队的产品经理,并且在他的Blog写有关Flex的内容。
我们可以使用HTTPService组件来访问Blog的XML并且获取最近的留言信息。这个组件可以让我们发送一个GET或是POST请求,然后获取响应中的数据。
1 在代码模式中,在<mx:Application>标签之后加入下面的<mx:HTTPService>标签。
<mx:HTTPService
id="feedRequest"
url="http://weblogs.macromedia.com/mchotin/index.xml"
useProxy="false"/>
url属性指定了请求文件的位置,在这种情况下是Matt Chotion Blog的RSS 2.0。在编写本指南时,这个URL是可用的,但是我们应检测是否发生了改变。我们可以使用在http://www.adobe.com/go/mchotinblog列出的最新的RSS2.0的地址。
useProxy指明了我们不希望使用服务器上的代理。Matt的Blog位于一个配置了crossdomain.xml的域,所以Flash播放器可以访问这个服务器上的远程数据源,包括RSS。
下一步就是要让程序向指定的URL发送一个请求。我们决定在程序启动时自动发送一个请求。如下面所示。
2 在<mx:Application>标签中添加下面的creationComplete属性:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="feedRequest.send()">
当我们的程序启动完成时,HTTPService组件的send()方法就会被调用。这个方法向指定的URL发送了一个GET或是POST语法,并且会返回一个HTTP响应。在这种情况下,RSS返回XML数据。
下一步,我们希望检测程序是否成功的取得了RSS数据。我们可以通过将数据绑定到Label控件来做到,如下所示。
3 在<mx:Panel>标签中,将title属性替换为下面的绑定表达式:
title="{feedRequest.lastResult.rss.channel.title}"
这个表达式将title域绑定到Panel控件。这个表达式反映了XML的结构。当XML返回到HTTPService组件时,这个组件将其解析成名为lastResult的ActionScript对象。lastResult的结构是XML文档结构的镜像。为了检测XML的结构,下载RSS的XML文件(http://www.adobe.com/go/flex_blogfeed)并且在浏览器中打开。
XML的通常结构如下所示:

<channel>
<title>
other child nodes of <channel>
<item>
<title>
other child nodes of <item>
</item>
...
一些节点具有包含数据的孩子节节点,包括channel节点的"title"孩子节点。HTTPService组件的lastResult对象反映了这种结构:
feedRequest.lastResult.rss.channel.title
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="feedRequest.send()" layout="absolute">
id="feedRequest"
url="http://weblogs.macromedia.com/mchotin/index.xml"
useProxy="false" />
<mx:columns>
<mx:DataGridColumn headerText="Column 1" dataField="col1"/>
<mx:DataGridColumn headerText="Column 2" dataField="col2"/>
<mx:DataGridColumn headerText="Column 3" dataField="col3"/>
</mx:columns>
</mx:DataGrid>
<mx:LinkButton x="20" y="225" label="Read Full Post"/>
</mx:Panel>
</mx:Application>
这样就会打开浏览器来运行这个程序。Blog的标题,Matt Chotin,就会作为Panel控件的标题出现,这样就表这个程序成功的从RSS取得了相应的数据信息。
在我们的程序中,我们希望DataGrid控件显示最近留言的标题以及发表日期。
1 在代码模式中,在<mx:DataGrid>标签中添加下面的dataProvider属性:
<mx:DataGrid x="20" y="20" id="dgPosts" width="400" dataProvider="{feedRequest.lastResult.rss.channel.item}">
我们希望名为item的XML节点向DataGrid控件提供数据。这个节点在XML中是重复的,所以在DataGrid也是重复的。
2 在第一个<mx:DataGridColumn>标签中,添加下面的headerText和dataField属性值:
<mx:DataGridColumn headerText="Posts" dataField="title"/>
3 在第二个<mx:DataGridColumn>标签中,输入下面的headerText,dataField以及width属性值:
<mx:DataGridColumn headerText="Date" dataField="pubDate" width="150"/>
我们希望在DataGrid的第二列显示留言发表的日期。在这种情况下,包含数据的域名为pubDate。
4 删除第三个<mx:DataGridColumn>标签,因为我们并不需要第三列。
最终的程序看起来应是如下的样子:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="feedRequest.send()" layout="absolute">
id="feedRequest"
url="http://weblogs.macromedia.com/mchotin/index.xml"
useProxy="false"/>
<mx:columns>
<mx:DataGridColumn headerText="Posts" dataField="title"/>
<mx:DataGridColumn headerText="Date" dataField="pubDate" width="150"/>
</mx:columns>
</mx:DataGrid>
<mx:LinkButton x="20" y="225" label="Read Full Post"/>
</mx:Panel>
</mx:Application>
5 保存文件,待到程序编译完成时,运行这个程序。
程序的运行效果如下:

当用户在DataGrid控件中选择了一条留言,我们希望程序在TextArea控件中显示这条留言的最前几行。在XML的item节点中,这些信息包含在名为description的域中。
1 在源码模式下,在<mx:TextArea>标签中输入下面的htmlText属性:
<mx:TextArea x="20" y="175" width="400"
htmlText="{dgPosts.selectedItem.description}" />
2 保存文件,待到程序编译完成时,运行程序。
点击DataGrid控件中的条目时,每条留言的最前几行就会出现在TextArea控件中。

creationComplete="feedRequest.send()" layout="absolute">
id="feedRequest"
url="http://weblogs.macromedia.com/mchotin/index.xml"
useProxy="false" />
<mx:columns>
<mx:DataGridColumn headerText="Posts" dataField="title"/>
<mx:DataGridColumn headerText="Date" dataField="pubDate" width="150" />
</mx:columns>
</mx:DataGrid>
<mx:TextArea x="20" y="175" width="400"/>
</mx:Panel>
</mx:Application>
2 保存文件,待到Flex Builder完成程序编译时,运行这个程序。
点击DataGrid控件中的一个条目并且点击Read Full Post链接时,就会打开一个新的浏览器窗口并且显示全部的留言信息。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="feedRequest.send()"
layout="absolute">
<mx:HTTPService id="feedRequest"
url="http://weblogs.macromedia.com/mchotin/index.xml" useProxy="false"/>
<mx:Panel x="10" y="10" width="475" height="400" layout="absolute"
title="{feedRequest.lastResult.rss.channel.title}">
<mx:DataGrid x="20" y="20" id="dgPosts" width="400"
dataProvider="{feedRequest.lastResult.rss.channel.item}">
<mx:columns>
<mx:DataGridColumn headerText="Posts" dataField="title"/>
<mx:DataGridColumn headerText="Date" dataField="pubDate"
width="150"/>
</mx:columns>
</mx:DataGrid>
<mx:TextArea x="20" y="175" width="400" htmlText="{dgPosts.selectedItem.description}"/>
<mx:LinkButton x="20" y="225" label="Read Full Post" click="navigateToURL(new URLRequest(dgPosts.selectedItem.link))"/>
</mx:Panel>
</mx:Application>
Felx之HTTPService的更多相关文章
- Flex HTTPService json
import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.http.HTTPService; i ...
- osgi: HttpService A null service reference is not allowed.
最近在学习osgi,在练习HttpService的过程中,一直出现“A null service reference is not allowed”这样的报错,代码本身没有问题,在网上也搜了不少地方, ...
- Flex httpservice返回值类型和处理 (转)
这两天在考虑flex与后端java服务交互的问题.在采用BlazeDS的Remote Object方式,还是传统的http service方式之间徘徊了一段时间 采用BlazeDS的Remote Ob ...
- Flex之HTTPService组件调用
1.采用<s:HTTPService>标签来实现: <?xml version="1.0" encoding="utf-8"?>< ...
- 基于Flex的HTTPService(GET和POST)
一.基于GET的HTTPService: <?xml version="1.0" encoding="utf-8"?><mx:Applicat ...
- HttpService
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...
- HttpService与WebService的差异
httpservice通过post和get得到你想要的东西webservice就是使用soap协议得到你想要的东西,相比httpservice能处理些更加复杂的数据类型 当你要调用一个你本服务的内容的 ...
- Flex远程访问获取数据--HTTPService
编写service类: package services { import com.adobe.serialization.json.JSON; import log.LogUtil; import ...
- Felx之菜单导航
Felx之菜单导航 环境搭建:MyEclipse 6.5+Flex Builder 3 Plug-in <?xml version="1.0" encoding=" ...
随机推荐
- 【转】C# 正则表达式大全
[转]C# 正则表达式大全 前言 在网上看到一个不错的简易版正则匹配和替换的工具,现在补充进来,感觉还不错,效果如下(输入验证中文汉字的正则表达式) 在线下载 密码:5tpt 注:好像也是一位园友 ...
- angularjs 事件向上向下传播
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- Hadoop 框架基础(四)
** Hadoop 框架基础(四) 上一节虽然大概了解了一下 mapreduce,徒手抓了海胆,不对,徒手写了 mapreduce 代码,也运行了出来.但是没有做更深入的理解和探讨. 那么…… 本节目 ...
- 继承—Car
编写一个Car类,具有final类型的属性品牌,具有功能drive: 定义其子类Aodi和Benchi,具有属性:价格.型号:具有功能:变速: 定义主类E,在其main方法中分别创建Aodi和Benc ...
- [ Git ] [ GitHub ] 如何刪除自己github上面的Repository-轉載
http://www.winwu.cc/2013/03/githubrepository.html
- 原生js实现发送验证码
var form = { myfun:function(){ var el = form.config().el; var button = form.config().button; var tim ...
- hp服务器安装exsi5.5
启动按f8进入raid制造页面: 1. 插入exsi5.5光盘 2. 按下开机键(开机比较慢需要等待一段时间) 3. 进入启动项目界面(插入光盘后启动会让你选择启动项.选择1光盘启动) 接下来按 ...
- Linux系统启动U盘制作工具
1.UNetbootin UNetbootin 让你创建 Ubuntu 或者其他 Linux 发行版的可引导 Live U 盘,而无需烧录 CD. 你既能让 UNetbootin 为你下载众多开箱即用 ...
- NodeJS学习笔记 (24)本地路径处理-path(ok)
模块概览 在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块.部分因为文档说的不够清晰,部分因为接口的平台差异性. 将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了. 获取 ...
- [洛谷P1939]【模板】矩阵加速(数列)
题目大意:给你一个数列a,规定$a[1]=a[2]=a[3]=1$,$a[i]=a[i-1]+a[i-3](i>3)$求$a[n]\ mod\ 10^9+7$的值. 解题思路:这题看似是很简单的 ...