`

Flex 经典例子: 建立Restaurant Finder

    博客分类:
  • Flex
阅读更多

Flex Sample App: 建立 Restaurant Finder

关于这个教程

即使您没有Flex的基础,也可以学习此教程, 这不是一个传统的"Getting started" 教程 .这个教程的目标是:

  • 展示 Flex Application 的架构的最好实践 .
  • 避免传统的缺点,开发您的第一个 Flex Application

此教程用到的一些技术:

  • 应用的区分
  • 应用之间的宽松联结
  • 事件通知
  • Model Classes 中使用 ActionScript Classess
  • 转换 Java 对象为 ActionScript 对象的类型
  • 通过客户端 ActionScript 调用 服务器端的 Java 方法

在这个教程 , 我们将建立一个餐厅门户应用 . 应用有二个模块 :

用户模块(The user module)

这是最终用户查找餐厅的模块 . 用户能使用地点(一种基于地图的选择) 和类别来查找餐厅 . 您能看到顾客的留言并能撰写自己的留言 .在这个教程, 我们从应用分析建立 .

 

1 . 用户模块

管理模块(The administration module)

这是模块用于管理员 . 管理员能添加, 更新, 并且删除餐厅, 在地图上标记餐厅的地理位置, 等等 . 这是一种典型的数据库维护应用 .我将提供管理模块为你做作为参考应用 . 在以下教程中,我将教你如何配置管理模块 .

 

2 . 管理模块

要求:

运行这个教程, 您需要下载和安装以下软件和文件 .

1. 安装Flex

  • 如果您没有 Flex, 去下载试用版或购买 .
  • 如果您还没有安装 Flex, 根据安装说明去安装它 .

2. 如果您没有安装MySql, 安装MySql

  1. 下载 MySql . 选择最新的版本 ( 本教程使用的是 4.0.20) .
  2. 解压 MySql 文件到一个临时目录 .
  3. 运行安装程序 (setup.exe) 并接受所有缺省选择 .

3. 建立餐厅数据库

  1. 开始 MySql .

c:\mysql\bin>mysqld

  1. 建立餐厅数据库 .

c:\mysql\bin>mysqladmin u root create restaurant

  1. 下载 restaurantadmin_sql.zip (ZIP, 12K) , 并复制其中 restaurant.sql mysql\bin 目录 .
  2. 建立数据库结构和插入数据 .

c:\mysql\bin>mysql u root restaurant < restaurant.sql

4. 安装MySql JDBC 驱动

  1. 下载 MySql JDBC 驱动 .
  2. 解压文件到一个临时目录 .

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而不同)

安装管理模块(Installing the Administration Module)

此餐厅应用有二个模块:

  • 用户模块
  • 管理模块

在此教程, 您将自己建立用户模块 . 我提供管理模块为您作参考应用 .

安装管理模块:

  1. 下载 restaurantadmin. zip (ZIP, 688K) .
  2. 解压 restaurantadmib.zip 在您的 Flex 服务器目录 . 例如 , 如果您使用的是 JRUN 服务器 , 解压 restaurantadmin.zip Program Files\Macromedia\Flex\jrun4\servers\default\flex

3. 测试程序 .例如, 如果您选择了JRUN服务器, 浏览管理模块在: http://localhost:8700/flex/restaurantadmin/admin.mxml .

如果您没有修改RemoteObject的whitelist, 将出现以下错误:

 

3 . 没有修改whitelist而出现的错误信息

这是因为Flex的默认安装后就有很高的安全级别 .您必须编辑RemoteObject的whitelist才能在application server中访问Java class, 修改步骤如下 .

  1. 编辑在 [ webapp_root ]\WEB-INF\flex 目录下的 flex-config.xml .
  2. 找到 <remote-objects> 条目 .
  3. 添加 samples.* 包到 whitelist unnamed .
<remote-objects>


<!--





Other 





entries





-->











<whitelist>























 











<unnamed>



































 











<source>samples.*</source>



































 











</unnamed>



































添加以上语句之后 , client application 能访问 samples 包下的所以类 .

  1. 再测试程序 , 使用 URL: http://localhost:8700/flex/restaurantadmin/admin.mxml . ( 根据您的配置使用不同的 URL .)

安装教程资源文件

安装资源文件(图象、样式表, 等 .) 在这个教程 .

  1. 下载 restaurant_tutorial .ZIP (ZIP, 460K) .
  2. 解压 restaurant_tutorial.zip 到您的 Flex 服务器目录 .

Data Services

使用Flex, 您能选择三个不同的方法访问后台数据 .

1. HTTPService

使用HTTPService, 您的client application可以发送传统HTTP requests到服务器和接收response . 虽然能使用HTTPService 接收响应不同的类型响应, 典型就是使用XML (HTTP的XML) . 您能使用HTTPService 发送请求到任一后台系统: JSP, Servlet, ASP, ColdFustion, CGI, PHP, 等等 .

2. RemoteObject

使用RemoteObject, 您的client application可以在应用服务器里调用Java对象的method,并能接收method的返回值 .返回值可以是value of primitive data type, an object, a collection of objects,等等 .

3. WebService

使用WebService 组件, 您的client application可以在应用服务器里和网络的所有地方调用web services的mothod, 并能接收method的返回值 .返回值可以是value of primitive data type, an object, a collection of objects,等等 .

在这个部分, 您将试验以这三种不同方法访问后台数据 . 您将建立一个餐厅名单在DataGrid 上显示的一种程序 . 将连续地使用HTTPService 、RemoteObject, 和WebService 去查看餐厅名单 .

在这个模块的完成后应用看起来像图4:

 

4 . 数据服务显示

实验1: 使用HTTPService

使用HTTPService, 您的client application可以发送传统HTTP requests到服务器和接收response .虽然能使用HTTPService 接收响应不同的类型响应, 典型就是使用XML (HTTP的XML) . 您能使用HTTPService 发送请求到任一后台系统: JSP, Servlet, ASP, ColdFustion, CGI, PHP, 等等 .

在这个实验中, 您使用HTTPService 查询餐厅名单 . HTTPService 发送一个请求到JSP, 使用XML返回餐厅的数据 .

  1. 打开 restaurantlist.jsp 文件 [ webapp_root ]/restaurant 并且使自己了解这个输出餐厅数据的 JSP .
  2. [ webapp_root ]/restaurant . 建立一个新文件 restaurant1.mxml .
  3. 编辑 restaurant1.mxml, 和键入以下代码 :
<?xml 











version="1.0" 











encoding="utf-8"?>




















<mx:Application 











xmlns:mx="http://www.macromedia.com/2003/mxml">




















</mx:Application>














  1. 定义 HTTPService 如下 , 以便 application 能查询由 jsp 生成的 XML 数据 .
<mx:HTTPService





 





id="srv" 











url="restaurantlist.jsp"/>




















  1. 添加一个 Button 标签 Get Data . 指定点击事件句柄以便发送 HTTP 请求到已定义的 HTTPService 上面 .
<mx:Button 











label="Get











Data" 











click="srv.send()"/>




















  1. 添加一个 DataGrid 组件并把它绑定到 HTTPService 的请求结果 .
<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, 将出现以下错误:

 

5 . 如果您没有修改whitelist将出现这个错误信息

这是因为Flex的默认安装后就有很高的安全级别 .您必须编辑HTTPservice的whitelist才能在application server中访问Java class, 修改步骤如下 .

  1. 编辑 [ webapp_root ]\WEB-INF\flex 目录下的 flex-config.xml .
  2. 找出 <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

  1. 修改 DataGrid 标记只显示显示 name, city, phone 三列 .
<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>














  1. 最后 , 改进用户界面 , DataGrid Button 放到 Panel . 确定您添加 Button Panel ControlBar .
<mx:Panel 











title="Restaurant 











List">




















<!--











DataGrid 











Here











-->




















<mx:ControlBar>




















<mx:Button 











label="Get 











Data" 











click="srv.send()"/>




















</mx:ControlBar>




















</mx:Panel>














  1. 再测试程序 . 注意:如果您改变浏览器窗口的大小 , 您的 Flex 程序也跟着改变大小 .

实验2: 使用RemoteObject

使用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对象 .

步骤1: 审查服务器组件

  1. 打开 [ webapp_root ]\WEB-INF\classes\samples\restaurant RestaurantService.Java 并且寻找 getRestaurantList() 方法 . 注意 , 方法返回 Restaurant 对象的一个数组 .
  2. 打开 [ webapp_root ]\WEB-INF\classes\samples\restaurant下的 Restaurant.java .并了解这个类的一些属性和方法 .

步骤2: 使用RemoteObject

  1. 复制一个 restaurant1.mxml 改名为 restaurant2.mxml .
  2. 编辑 restaurant2.mxml .

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, 将出现以下错误:

 

6. 如果您没有修改whitelist将出现这个错误信息

这是因为Flex的默认安装后就有很高的安全级别 .您必须编辑RemoteObject的whitelist才能在application server中访问RestaurantService类, 修改步骤如下 .

  1. 编辑 [ webapp_root ]\WEB-INF\flex 目录下的 flex-config.xml .
  2. 找出 <remote-objects> 条目

9. whitelist-unnamed-URL中添加 samples.* .

<remote-objects>














<!--











Other 











entries











-->




















 <whitelist>




















 <unnamed>




















 <source>samples.*</source>




















 </unnamed>




















这将允许客户应用访问任一类在样品包裹 .

这样设置后, client application 可以访问服务器上sample包下的所有类 .

  1. 再测试程序 : http://localhost:8700/flex/restaurant/restaurant2.mxml

实验3: 使用WebService

使用WebService组件, 您的client application可以在应用服务器里和网络的所有地方调用web services的mothod, 并能接收method的返回值 .返回值可以是value of primitive data type, an object, a collection of objects,等等 .

在这个实验中,修改restaurant application使用WebService 代替RemoteObject 查询餐厅数据 .

第一步: 把RestaurantService类作为Web Service

Flex中集成了Apache web services engine的Axis, 在没有提供web services的application server中更容易把Java 类作为web services .在这个部分, 您将使用Axis engine把RestaurantService类放到上一个模块中 .

: 使用Flex WebService 标签, 您能连接到任何已经发布的web service .

发布RestaurantService类作为web service, 步骤如下:

  1. 编辑 [webapp_root ]\WEB-INF\flex 目录下 flex-config.wsdd .

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>














  1. 重启服务 .
  2. 测试 web service: 确定 web service 被正确的定义后,在浏览器中正确输入以下 URL:

http://localhost:8700/flex/flex-ws/RestaurantWS?wsdl .

第二步: 使用web service

  1. 复制 restaurant2.mxml 并改名为 restaurant3.mxml .
  2. 编辑 restaurant3.mxml .

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, 将出现以下错误:

 

7 . 如果您没有修改whitelist将出现这个错误信息

这是因为Flex的默认安装后就有很高的安全级别 .您必须编辑WebService的whitelist才能在application server中访问WebService类, 修改步骤如下 .

  1. 编辑 [ webapp_root]\WEB-INF\flex 目录下的 flex-config.xml .
  2. 找到 <web-service-proxy> 条目
  3. 添加 http://localhost:8700/* whitelist unnamed .
<web-service-proxy>














 <!--











Other 











entries











-->




















 <whitelist>




















 <unnamed>




















 <url>http://localhost:8700/*</url>




















 </unnamed>




















这样设置后, client application可以访问由Axis engine发布的所有web service .

  1. 再测试程序 : http://localhost:8700/flex/restaurant/restaurant3 .mxml .

数据服务: 总结

在不同服务端下,为了使你client application无缝的访问后台数据,Flex提供不同的数据存取方法 .

最佳的实践

如果您性能和数据量有要求, 在此建议您使用 RemoteObject Action Message Format (AMF) (binary ) 内码 .

实验4: 使用 <mx:Model>

使用以下步使用 <mx:Model> 标签 .

  1. 复制 restaurant2.mxml 并改名 restaurant4.mxml .

: 确定您拷贝的是restaurant2.mxml (使用RemoteObject的application版本) .

  1. 编辑 restaurant4 .mxml .

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" 




















分享到:
评论

相关推荐

    Spring MVC+BlzeDS+Flex框架实践:HelloWorld篇

    在这个例子中,它与BlazeDS协作,提供数据给Flex客户端。 6. **BlazeDS**: - BlazeDS是Adobe提供的开源数据推送服务,它允许Flex客户端与Java后端进行双向通信,实现AMF(Action Message Format)数据交换。 7. ...

    Flex 布局教程:语法篇.md

    Flex 布局教程:语法篇.md

    Vue2 常用用法- flex + overflow:hidden

    css - flex + overflow:hidden

    Flex 布局教程:语法篇1

    Flex布局,全称为Flexible Box,是一种CSS布局模式,旨在提供最大的灵活性,以适应不同设备和屏幕尺寸的需求。自2009年由W3C提出以来,Flex布局已得到所有主流浏览器的支持,成为现代网页布局的首选方案。它克服了...

    Flex_4:开发RIA_应用程序.pdf

    ### Flex 4:开发RIA应用程序知识点总结 #### 一、Adobe Flex 4 简介与平台背景 **Adobe Flash Platform 简介** - **技术简介:** Adobe Flash Platform 是一套用于创建交互式内容的技术栈,其中包括了Adobe Flex...

    Flex 布局教程:语法篇.doc

    Flex 布局是一种现代网页和应用程序开发中的关键布局技术,它为开发者提供了极大的灵活性,使得复杂的二维布局变得简单易行。Flex布局的核心是通过`display`属性将一个容器设置为`flex`或`inline-flex`,从而使其...

    Flex_4:开发RIA_应用程序(中文版)

    ### Flex 4:开发RIA应用程序知识点详解 #### 一、Adobe RIA开发技术认证与教材概述 - **Adobe RIA开发技术认证**:是Adobe公司为开发者提供的专业认证,旨在帮助开发者掌握创建丰富的互联网应用程序(RIA)所需的...

    FLEX安装方法 集成到eclipse中

    * FLEX 例子:http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html * FLEX 视频教程:http://www.hellocto.com/bbs/index.asp?boardid=91 * 中文 FLEX 资料:http://blog.minidx.com/ * 上海 RIA...

    flex 利用mx:HTML标签加载pdf

    flex4 air开发中显示pdf,可以是本地pdf文件,也可以是服务端的资源文件。

    4个简单的Flex例子(包含custom-class-mapping)共享

    总共有4个例子: 1.http://127.0.0.1:8080/flexDemo/HelloWorld/HelloWorld.html 2.http://127.0.0.1:8080/flexDemo/HelloWorld/ReadList.html 3.http://127.0.0.1:8080/flexDemo/HelloWorld/ReadExample.html 4....

    flex&bison 英文PDF 及随书代码

    《Flex&Bison:编译器设计的利器》 Flex&Bison是两个强大的工具,用于创建解析器和词法分析器,广泛应用于编译器和解释器的开发中。本资源包含Flex&Bison的英文PDF文档及随书配套代码,旨在帮助用户深入理解和实践...

    flex 3D 例子及3D资源包

    在提供的“flex 3D 例子及3D资源包”中,你可能找到了以下内容: 1. 示例项目:这些项目展示了如何使用Flex 3D创建各种3D效果,比如旋转、缩放、平移的对象,以及更复杂的效果如3D模型的动画、碰撞检测和用户交互。...

    一个Flex例子自动补全

    Flex例子Flex例子Flex例子Flex例子Flex例子Flex例子

    flex HttpService 入门例子

    简单的 flex HttpService例子,可供初学者参考

    flex学习例子,本人学习过程中做的例子

    这个“flex学习例子”压缩包包含了作者在学习Flex过程中的实践项目,旨在帮助其他学习者通过实例来理解Flex的用法和功能。 1. Flex基础:Flex是一个开放源代码的开发框架,主要用于创建交互式、高性能的Web应用程序...

    Flex4:开发RIA应用程序

    8. 学习Flex: - 先决条件:建议开发者具备一定的编程基础,熟悉面向对象编程。 - 学习资源:可以通过官方文档、在线教程、培训课程和书籍来学习Flex。 以上知识点概述了Flex4开发RIA应用程序的核心概念,特点,...

    flex 字体自动放大缩小例子

    flex: 0 1 auto; /* 默认情况下,flex-grow: 0, flex-shrink: 1, flex-basis: auto */ flex-basis: 80%; /* 可以根据需求调整 */ } ``` 然后,为了使字体大小随容器大小变化,我们可以使用CSS的`vw`单位(视口...

    flex4 httpservice 例子

    Flex4是一种基于ActionScript 3.0的开源框架,用于构建富互联网应用程序(RIA)。它提供了强大的组件库、数据绑定和高级图形功能,使得开发者能够创建具有高度交互性和视觉吸引力的Web应用。在Flex4中,`HTTPService...

    Flex + Java简单例子

    这个例子旨在展示如何通过BlazeDS库在Flex前端和Java后端之间建立通信。 首先,我们需要一个软件环境,包括JDK 1.6.0_22、MyEclipse for Spring 6.8.0、Flash Builder 4以及Tomcat 6.0.29。此外,还需要BlazeDS的...

Global site tag (gtag.js) - Google Analytics