Flex Sample App: 建立 Restaurant Finder
关于这个教程
即使您没有Flex的基础,也可以学习此教程, 这不是一个传统的"Getting started" 教程 .这个教程的目标是:
此教程用到的一些技术:
在这个教程 , 我们将建立一个餐厅门户应用 . 应用有二个模块 :
这是最终用户查找餐厅的模块 . 用户能使用地点(一种基于地图的选择) 和类别来查找餐厅 . 您能看到顾客的留言并能撰写自己的留言 .在这个教程, 我们从应用分析建立 .
这是模块用于管理员 . 管理员能添加, 更新, 并且删除餐厅, 在地图上标记餐厅的地理位置, 等等 . 这是一种典型的数据库维护应用 .我将提供管理模块为你做作为参考应用 . 在以下教程中,我将教你如何配置管理模块 .
运行这个教程, 您需要下载和安装以下软件和文件 .
c:\mysql\bin>mysqld
c:\mysql\bin>mysqladmin – u root create restaurant
c:\mysql\bin>mysql – u root restaurant < restaurant.sql
3. 复制mysql-connector-java-3.0.14-production-bin.jar 到 [ webapp_root ]\WEB-INF\lib .
注: jar文件的名字也许根据您的下载的驱动版本号不同 .
本地[webapp_root ] 是您使用的Flex服务器应用的根目录 .例如, 如果您使用的是JRUN服务器, webapp_root是: Program Files\Macromedia\Flex\jrun4\servers\default\flex(译注:根据自己的applcation server而不同)
此餐厅应用有二个模块:
在此教程, 您将自己建立用户模块 . 我提供管理模块为您作参考应用 .
3. 测试程序 .例如, 如果您选择了JRUN服务器, 浏览管理模块在: http://localhost:8700/flex/restaurantadmin/admin.mxml .
如果您没有修改RemoteObject的whitelist, 将出现以下错误:
这是因为Flex的默认安装后就有很高的安全级别 .您必须编辑RemoteObject的whitelist才能在application server中访问Java class, 修改步骤如下 .
<remote-objects>
条目 .samples.*
包到 whitelist 的 unnamed
.<remote-objects>
<!--
Other
entries
-->
<whitelist>
<unnamed>
<source>samples.*</source>
</unnamed>
添加以上语句之后 , client application 能访问 samples 包下的所以类 .
安装资源文件(图象、样式表, 等 .) 在这个教程 .
使用Flex, 您能选择三个不同的方法访问后台数据 .
使用HTTPService, 您的client application可以发送传统HTTP requests到服务器和接收response . 虽然能使用HTTPService 接收响应不同的类型响应, 典型就是使用XML (HTTP的XML) . 您能使用HTTPService 发送请求到任一后台系统: JSP, Servlet, ASP, ColdFustion, CGI, PHP, 等等 .
使用RemoteObject, 您的client application可以在应用服务器里调用Java对象的method,并能接收method的返回值 .返回值可以是value of primitive data type, an object, a collection of objects,等等 .
使用WebService 组件, 您的client application可以在应用服务器里和网络的所有地方调用web services的mothod, 并能接收method的返回值 .返回值可以是value of primitive data type, an object, a collection of objects,等等 .
在这个部分, 您将试验以这三种不同方法访问后台数据 . 您将建立一个餐厅名单在DataGrid 上显示的一种程序 . 将连续地使用HTTPService 、RemoteObject, 和WebService 去查看餐厅名单 .
在这个模块的完成后应用看起来像图4:
使用HTTPService, 您的client application可以发送传统HTTP requests到服务器和接收response .虽然能使用HTTPService 接收响应不同的类型响应, 典型就是使用XML (HTTP的XML) . 您能使用HTTPService 发送请求到任一后台系统: JSP, Servlet, ASP, ColdFustion, CGI, PHP, 等等 .
在这个实验中, 您使用HTTPService 查询餐厅名单 . HTTPService 发送一个请求到JSP, 使用XML返回餐厅的数据 .
<?xml
version="1.0"
encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.macromedia.com/2003/mxml">
</mx:Application>
<mx:HTTPService
id="srv"
url="restaurantlist.jsp"/>
<mx:Button
label="Get
Data"
click="srv.send()"/>
<mx:DataGrid
id="dg"
dataProvider="{srv.result.list.restaurant}"
widthFlex="1"
heightFlex="1"/>
注: 注意那 srv.result
指向HTTP 请求的回应, 当 list
并且 restaurant
对应于XML文件的节点(参见restaurantlist.jsp) .
7. 测试程序: http://localhost:8700/flex/restaurant/restaurant1.mxml
如果您没有修改HTTPService的whitelist, 将出现以下错误:
这是因为Flex的默认安装后就有很高的安全级别 .您必须编辑HTTPservice的whitelist才能在application server中访问Java class, 修改步骤如下 .
<http-service-proxy>条目
10. 在whitelist-unnamed-URL中添加 http://{localserver}/*
.
<http-service-proxy>
<!--
Other
entries
-->
<whitelist>
<unnamed>
<url>http://{localserver}/*</url>
</unnamed>
这样设置后, client application 可以访问服务器上的任何一URL .
11. 再测试程序 .
http://localhost:8700/flex/restaurant/restaurant1.mxml
<mx:DataGrid
id="dg"
dataProvider="{srv.result.list.restaurant}"
widthFlex="1"
heightFlex="1">
<mx:columns>
<mx:Array>
<mx:DataGridColumn
columnName="name"
headerText="Name"/>
<mx:DataGridColumn
columnName="city"
headerText="City"/>
<mx:DataGridColumn
columnName="phone"
headerText="Phone"/>
</mx:Array>
</mx:columns>
</mx:DataGrid>
<mx:Panel
title="Restaurant
List">
<!--
DataGrid
Here
-->
<mx:ControlBar>
<mx:Button
label="Get
Data"
click="srv.send()"/>
</mx:ControlBar>
</mx:Panel>
使用RemoteObject, 您的client application可以在应用服务器里调用Java对象的method,并能接收method的返回值 .返回值可以是value of primitive data type, an object, a collection of objects,等等 .
在这个模块里, 您将修改restaurant application使用RemoteObject替代HTTPService查询餐厅名单 .您使用 您的应用服务器里的RestaurantService类的 getRestaurantList()
方法 . getRestaurantList()
方法将返回一个restaurant对象 .
getRestaurantList()
方法 . 注意 , 方法返回 Restaurant 对象的一个数组 . 3. 删除 HTTPService
标签,加入 RemoteObject
标签 . Remote class是 samples.restaurant.RestaurantService
并且使用方法 getRestaurantList()
返回餐厅的数据.
<mx:RemoteObject
id="srv"
source="samples.restaurant.RestaurantService">
<mx:method
name="getRestaurantList"/>
</mx:RemoteObject>
4. 改变按钮Get Data的触发事件为:调用RestaurantService类的 getRestaurantList()+
.
<mx:Button
label="Get
Data"
click="srv.getRestaurantList()"/>
5. 改变 dataProvider
的参数为 DataGrid
. 并把RestaurantService类的 getRestaurantList()
方法的结果绑定到 DataGrid
上 .
<mx:DataGrid
id="dg"
dataProvider="{srv.getRestaurantList.result}" w
idthFlex="1"
heightFlex="1">
注: 每当您的程序调用一个远程方法,Flex建立结果集 . 结果集是指定方法的返回值 .
6. 测试应用: http://localhost:8700/flex/restaurant/restaurant2.mxml .
如果您没有修改RemoteObject的whitelist, 将出现以下错误:
<remote-objects>
条目 9. 在whitelist-unnamed-URL中添加 samples.*
包 .
<remote-objects>
<!--
Other
entries
-->
<whitelist>
<unnamed>
<source>samples.*</source>
</unnamed>
这将允许客户应用访问任一类在样品包裹 .
这样设置后, client application 可以访问服务器上sample包下的所有类 .
使用WebService组件, 您的client application可以在应用服务器里和网络的所有地方调用web services的mothod, 并能接收method的返回值 .返回值可以是value of primitive data type, an object, a collection of objects,等等 .
在这个实验中,修改restaurant application使用WebService 代替RemoteObject 查询餐厅数据 .
Flex中集成了Apache web services engine的Axis, 在没有提供web services的application server中更容易把Java 类作为web services .在这个部分, 您将使用Axis engine把RestaurantService类放到上一个模块中 .
注: 使用Flex WebService
标签, 您能连接到任何已经发布的web service .
发布RestaurantService类作为web service, 步骤如下:
2. 发布 RestaurantService
类名字为 RestaurantWS
的web service,使用以下 <service>
声明 .
<service
name="RestaurantWS"
provider="java:RPC">
<parameter
name="methodName"
value="*"/>
<parameter
name="className"
value="samples.restaurant.RestaurantService"/>
<beanMapping
languageSpecificType="java:samples.restaurant.Restaurant"
qname="ns1:Restaurant"
mlns:ns1="http://www.macromedia.com/samples"/>
</service>
http://localhost:8700/flex/flex-ws/RestaurantWS?wsdl .
3. 删除 RemoteObject标签
,并添加 WebService标签并
指向第一步建立的web server: RestaurantWS
.
<mx:WebService
id="srv"
wsdl="@ContextRoot()/flex-ws/RestaurantWS?wsdl">
<mx:operation
name="getRestaurantList"/>
</mx:WebService>
4. 测试应用: http://localhost:8700/flex/restaurant/restaurant3.mxml .
如果您没有修改WebService的whitelist, 将出现以下错误:
<web-service-proxy>
条目 http://localhost:8700/* 到
whitelist 的 unnamed 中 .<web-service-proxy>
<!--
Other
entries
-->
<whitelist>
<unnamed>
<url>http://localhost:8700/*</url>
</unnamed>
这样设置后, client application可以访问由Axis engine发布的所有web service .
在不同服务端下,为了使你client application无缝的访问后台数据,Flex提供不同的数据存取方法 .
如果您性能和数据量有要求, 在此建议您使用 RemoteObject
与 Action Message Format (AMF) (binary ) 内码 .
<mx:Model>
<mx:Model>
标签 .注: 确定您拷贝的是restaurant2.mxml (使用RemoteObject的application版本) .
3. 添加一个Model标签在 RemoteObject标签后面
. 把RemoteObject的 getRestaurantList()
绑定到Model中 .
<mx:Model
id="restaurantList">{srv.getRestaurantList.result}</mx:Model>
4. 改变DataGrid 的 dataProvider
参数 . 绑定DataGrid到restaurantList Model上 .
<mx:DataGrid
id="dg"
dataProvider="{restaurantList}"
widthFlex="1"
heightFlex="1">
<mx:columns>
<mx:Array>
<mx:DataGridColumn
columnName="name"
headerText="Name"/>
<mx:DataGridColumn
columnName="city"