Flex 4 最佳集成实践
FLEX4_Flex4教程

Flex 应用的构建形式 尽管用 Flex 开发 RIA 有多种形式,但现在主流的架构是:Flex 作为 Client(客户端),Java、PHP、 Asp、Ruby 等技术作为 Server(服务器端)。
本教程之后的内容主要介绍 Flex 与 Java 技术的整合。
Flex 访问服务器端数据的 3 种方式 既然 Flex 可以和 Java 等 Sever 端技术整合,那么它们之间怎样实现通信的呢?Flex 通过 HTTPService,WebService 和 RemoteObject 这 3 个组件实现与 Server 端的通信。
外观与样式设计 使用 CSS 和图形属性编辑器自定义应用程序外观。快速设置最常用的属性,并在“Design”(设计) 视图中预览结果。使用新的 Theme Browser(主题浏览器)浏览可用主题,并将它们应用于您的项目。
与 Adobe Creative Suite 设计工具集成 导入使用 Adobe Flash Professional、Illustrator®、Photoshop® 或 Fireworks® 软件创建的设计 资源,或导入使用 Flash Catalyst 创建的整个应用程序用户界面。Flash Professional 与 Flash Builder 之间的新工作流程简化了自定义 Flex 组件的导入和更新。
HTTPService 组件
HTTPService 组件允许你与 HTTP 服务交互,可以是接收 HTTP 请求和发送 HTTP 响应的任何 HTTP URI。 你可以通过 HTTPService 组件调用任何类型的 Server 端技术,包括 PHP pages, ColdFusion Pages, JavaServer Pages, Java servlets, Ruby on Rails 和 ASP pages。 HTTPService 组件允许你发送 HTTP GET、POST、HEAD、OPTIONS、PUT、TRACE 和 DELETE 请求,并典 型的以 XML 形式返回。
flex4.0学习记录

在Flex4.0中使用正则表达式正则表达式可以高效地匹配查找字符串数据。
可方便地定义复杂的规则。
对于复杂的规则,若采用代码来表示,会产生较多的代码行,并且逻辑复杂、容易出错。
另外,使用正则表达式远比自定义算法效率要高。
1.使用RegExp类用以定义和处理正则表达式。
语法有两种方式。
一种是使用“/“符定义正则表达式:var RegExp变量:RegExp=/正则表达式语句/;一种是使用字符串定义正则表达式:var RegExp变量:RegExp=new RegExp(“正则表达式”);2.使用RegExp类匹配数据一种是使用RegExp类的exec( )方法匹配数据。
用于匹配字符串,并返回匹配结果数组。
RegExp变量.Exec(字符串数据);如:var r : RegExp=/\d+/;var arr : Array=r.exec(“4256@322”);trace(arr); 结果为“4256“、”“322“两个子串。
一种是使用RegExp类的test()方法匹配数据。
用于匹配字符串,并返回布尔值。
如:var r : RegExp=/\d+/;var flag: boolean=r.exec(“4256@322”);trace(arr);一种是使用String类的match()方法匹配数据,用于匹配字符串并返回结果数组。
如:var r : RegExp=/\d+/;var s : String = “4256@322”;var arr : Array=s.match(r);trace(arr);数据传输与交互Flex4.0中的数据传输方式包括内部数据传输、文件流方式传输、xml方式传输、其他方式传输。
应用程序内部的数据传输大多通过变量传递来实现。
外部文件的数据可分为简单文本数据、xml数据和复杂数据。
对于简单的文本数据可以采用文件流方式传输。
对于xml数据可采用xml方式传输。
对于复杂的数据,如大型数据库中的数据,需要通过其他程序来辅助数据传输。
FLEX NETWORK 外部输入 输出模块使用手册说明书

30.4使用Flex Network的外部输入/输出30.4.1简介通过将FLEX NETWORK模块连接到GP,您不仅可以使用人机界面来远程控制外部输入/输出,还可以控制输入和输出外的其他事项。
您还可以添加多个FLEXNETWORK模块来增加输入/输出点的数量。
该模块有两条连接线,而向这两条连接线输出的是相同的通讯数据。
只要使用其中任意一条线,则线1和线2都可用。
使用一条线时,可以连接的最大站数是31。
使用两条线时,可以连接的最大站数是63。
一条线支持31站,另一条线支持32站。
有关配置的详细信息,请参阅“FLEX NETWORK用户手册”1.1节系统配置。
•FLEX NETWORK和GP的连接需要专用电缆。
FLEX NETWORK模块:型号和站数下面将介绍FLEX NETWORK模块的型号、点数和站数。
例如,如果您使用的是具有32个离散输入和32个离散输出的总计64点的输入/输出模块,且将S编号定义为1,那么该输入/输出模块将使用S编号1至4。
类型类型点数占用站数I/O FN-X16TS16点输入1站FN-X32TS32点输入2站FN-Y08RL8点输出1站FN-Y16SK16点输出1站FN-Y16SC16点输出1站FN-XY08TS8点输入1站8点输出FN-XY16SK16点输入1站16点输出FN-XY16SC16点输入1站16点输出FN-XY32SK32点输入4站32点输出模拟FN-AD02AH2chA/D1站FN-AD04AH4chA/D4站FN-DA02AH2chD/A1站FN-DA04AH4chD/A4站特殊定位FN-PC10SK-4站高速计数器FN-HC10SK41-8站30.4.2设置步骤下面是如何在FLEX NETWORK 模块中使用数字输入/输出(DIO)的示例。
1选择型号为AGP-XXXXX-FN1M 的人机界面。
FLEX NETWORK 驱动程序将自动安装。
2在[系统设置]窗口中,选择[输入/输出驱动程序]来显示如下画面。
最佳实践:Flex Spring JAVA BLAZEDS整合

BlazeDS初始化时用于动态创建services, destinations, and adapters。
SpringRemotingDestinationBootstrapService扩展AbstractBootstrapService。
SpringRemotingDestinationBootstrapService 自动导出包含"@Service标注及以FlexService结尾"的Spring Bean为RemoteObject。
@SuppressWarnings("all")public class SpringRemotingDestinationBootstrapService extends AbstractBootstrapService {public static final String DEFAULT_INCLUDE_END_WITH_BEANS = "FlexService";private static Logger logger =LoggerFactory.getLogger(SpringRemotingDestinationBootstrapService.cla ss);private String destChannel;private String destSecurityConstraint;private String destScope;private String destAdapter;private String destFactory;private String serviceId;private String includeEndsWithBeans;@Override/***初始化入口*/public void initialize(String id, ConfigMap properties) { serviceId = properties.getPropertyAsString("service-id", "remoting-service");destFactory = properties.getPropertyAsString("dest-factory", "spring");destAdapter = properties.getProperty("dest-adapter");destScope = properties.getProperty("dest-scope");destSecurityConstraint =properties.getProperty("dest-security-constraint");destChannel = properties.getPropertyAsString("dest-channel", "my-amf");includeEndsWithBeans =properties.getPropertyAsString("includeEndsWithBeans",DEFAULT_INCLUDE_END_WITH_BEANS);Service remotingService = broker.getService(serviceId);if (remotingService == null)throw createServiceException("not found Service with serviceId:" + serviceId);createSpringDestinations(remotingService);}private ServiceException createServiceException(String message) {ServiceException ex = new ServiceException();ex.setMessage(message);return ex;}/***将Spring的Service Name自动定义为destination*/private void createSpringDestinations(Service remotingService) { WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(broker.getServletContext());List<String> addedBeanNames = new ArrayList();for (String beanName : wac.getBeanDefinitionNames()) {Class type = wac.getType(beanName);logger.debug("{}: {}", new Object[]{beanName,type.getName()});boolean isCreateSpringDestination = !type.isAnnotationPresent(com.grgbanking.platform.core.flex.NoneRemoti ngObject.class)|| beanName.endsWith(includeEndsWithBeans) || isCreateDestination(beanName, type);if (isCreateSpringDestination) {createSpringDestination(remotingService, beanName);addedBeanNames.add(beanName);}}("[Auto Export Spring toRemotingDestination],beanNames={}", addedBeanNames);}protected boolean isCreateDestination(String beanName, Class type) {return false;}/** <!-- 动态生成的配置内容 --> <destination id="sampleVerbose"><channels> <channel* ref="my-secure-amf" /> </channels> <adapter ref="java-object" /> * <security> <security-constraint ref="sample-users" /> </security> * <properties> <source>pany.SampleService</source>* <scope>session</scope> <factory>myJavaFactory</factory></properties>* </destination>*/protected void createSpringDestination(Service service, String destinationId) {flex.messaging.services.remoting.RemotingDestinationdestination = (flex.messaging.services.remoting.RemotingDestination) service.createDestination(destinationId);destination.setSource(destinationId);destination.setFactory(destFactory);if (destAdapter != null) {destination.createAdapter(destAdapter);}if (destScope != null) {destination.setScope(destScope);}if (destSecurityConstraint != null) {destination.setSecurityConstraint(destSecurityConstraint);}if (destChannel != null) {destination.addChannel(destChannel);}service.addDestination(destination);}2)修改SpringFactory并扩展FlexFactory根据destination的id,将Flex的destination映射为Spring的Beanpublic class SpringFactory implements FlexFactory {private static final String SOURCE = "source";/***This method can be used to initialize the factory itself.It is called*with configuration parameters from the factory tag which defines the id*of the factory.*/public void initialize(String id, ConfigMap configMap) {}/***This method is called when we initialize the definition of an instance*which will be looked up by this factory.It should validate that the*properties supplied are valid to define an instance.Any valid properties*used for this configuration must be accessed to avoid warnings about *unused configuration elements.If your factory is only used for *application scoped components,this method can simply return a factory*instance which delegates the creation of the component to the*FactoryInstance's lookup method.*/public FactoryInstance createFactoryInstance(String id, ConfigMap properties) {SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties);instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId()));return instance;} // end method createFactoryInstance()/***Returns the instance specified by the source and properties arguments.*For the factory,this may mean constructing a new instance, optionally*registering it in some other name space such as the session or JNDI, and*then returning it or it may mean creating a new instance and returning *it.This method is called for each request to operate on the given item*by the system so it should be relatively efficient.*<p>*If your factory does not support the scope property,it report an error*if scope is supplied in the properties for this instance.*/public Object lookup(FactoryInstance inst) {SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;return factoryInstance.lookup();}/***Spring工厂实例,执行实际的查找动作.**@author yrliang**/static class SpringFactoryInstance extends FactoryInstance { SpringFactoryInstance(SpringFactory factory, String id, ConfigMap properties) {super(factory, id, properties);}@Overridepublic String toString() {return"SpringFactory instance for id="+ getId() + " source=" + getSource() + " scope=" + getScope();}@Overridepublic Object lookup() {Logger logger =LoggerFactory.getLogger(SpringFactory.class);ApplicationContext appContext = WebApplicationContextUtils .getWebApplicationContext(flex.messaging.FlexContext.getServletCo nfig().getServletContext());String beanName = getSource();try {logger.debug("lookup(): bean id=" + beanName);//flex.messaging.FlexContext.getHttpRequest().getSession().getAttribute (arg0);return appContext.getBean(beanName);} catch (NoSuchBeanDefinitionException nexc) {ServiceException e = new ServiceException();String msg = "Spring service named '"+ beanName + "' does not exist.";e.setMessage(msg);e.setRootCause(nexc);e.setDetails(msg);e.setCode("Server.Processing");logger.error("",nexc);throw e;} catch (BeansException bexc) {ServiceException e = new ServiceException();String msg = "Unable to create Spring service named '" + beanName + "' ";e.setMessage(msg);e.setRootCause(bexc);e.setDetails(msg);e.setCode("Server.Processing");logger.error("",bexc);throw e;}}}}3)配置service-config.xml<?xml version="1.0" encoding="UTF-8"?><services-config><factories><factory id="spring"class="com.grgbanking.platform.core.flex.spring.SpringFactory"/> </factories><services><service-include file-path="remoting-config.xml" /><service-include file-path="proxy-config.xml" /><service-include file-path="messaging-config.xml" /><service id="spring-remoting-service"class="com.grgbanking.platform.core.flex.spring.SpringRemotingDestina tionBootstrapService"><!-- 其它生成的RemotingDestination默认属性<adapters><adapter-definition id="java-object"class="flex.messaging.services.remoting.adapters.JavaAdapter"default="true" /></adapters><default-channels><channel ref="my-amf" /></default-channels>--><properties><!--<service-id></service-id><dest-factory></dest-factory><dest-adapter></dest-adapter><dest-scope></dest-scope><dest-channel></dest-channel><dest-security-constraint></dest-security-constraint><includeEndsWithBeans></includeEndsWithBeans>--></properties></service></services>4)FLEX客户端调用this.blogFlexService = new RemoteObject("blogFlexService");//这里需要指定endpoint,因为是动态的RemotingDestination,而静态的RemotingDestination ,flex编译器会将endpoint编译进源代码.//这个也是flex编译器需要指定配置文件而导致使用flex经常会犯的错误之一.this.blogFlexService.endpoint = '../messagebroker/amf';3.公司应用案例这种整合最早是在2010年的FEEL View 5.0中使用,后台的统一平台,FEEL View5.1中都采用这种方法进行整合。
Flexray线控总线技术

高速
FlexRay支持高达10 Mbps的数据传 输速率,满足汽车中大量数据传输的 需求。
可靠性
FlexRay具有错误检测和纠正功能, 能够保证数据传输的可靠性。
工作原理
1 2
通信模式
FlexRay支持静态和动态两种通信模式,可以根 据实际需求进行选择。
拓扑结构
FlexRay支持星型和总线型两种拓扑结构,可以 根据汽车内部ECU的分布情况进行选择。
的领域,其优势可能无法充分发挥。
对实时性的 依赖
由于FlexRay总线的通信机制和硬件资源限制,其支 持的节点数量有限,可能不适合大规模分布式系统。
04
FlexRay线控总线与其他总线的比较
CAN总线
总结词
CAN总线是一种广泛应用于汽车行业的通信协议,具有高可靠性和良好的实时 性。
详细描述
CAN总线采用基于优先级的通信方式,支持多主节点同时通信,具有较高的数 据传输速率和较低的延迟时间。然而,CAN总线在处理大量数据和复杂通信时 可能会遇到带宽限制。
随着汽车电子化程度的不断提高,对汽车内部通信的要求也 越来越高,FlexRay总线技术正是在这样的背景下应运而生。
技术发展历程
FlexRay总线技术最初由BMW和戴姆勒-克莱斯勒于1999年联合开发,旨在为汽车 内部通信提供一种高性能、高可靠性的总线系统。
自推出以来,FlexRay总线技术得到了广泛的认可和应用,已成为汽车内部通信的标 准之一。
市场前景
增长的市场需求
竞争格局变化
未来发展方向
随着汽车电子化程度的不断提高,对 线控技术的需求也在不断增长。 FlexRay总线技术作为汽车线控技术 的关键组成部分,其市场需求将进一 步扩大。
《Flex 4 0 RIA开发宝典》读书笔记模板

第11章 Flex 1
可视化组件基 础
2
第12章 Flex 常用组件概览
3
第13章 Flex 程序设计进阶
4
第14章 Flex 模块化编程
5
第15章图表组 件
第11章 Flex可视化组件基础
11.1 Flex组件概述 11.2可视化组件的类结构 11.3 Flex组件生命周期 11.4 Flex可见组件 11.5 Libray和Definition标签 11.6小结
第15章图表组件
15.1图表组件开发基础图表数据 15.2图表组件常用属性 15.3图表事件 15.4复合坐标轴 15.5图表组件效果 15.6小结
1
第16章第一个 Flex程序
第17章使用多 2
种方法创建应 用程序
3 第18章
ActionScrip t 3.0程序结 构应用实例
4
第19章 Math 类应用实例
谢谢观看
第21章 String类应用实例
21.1使用字符串方法分割字符串 21.2使用字符串方法查找字符串 21.3使用字符串方法制作“打字效果”实例 21.4使用字符串方法制作“逐字逐句”实例 21.5小结
第22章 Date类和Timer类应用实例
22.1设计一个数字式电子表 22.2设计一个指针式盘表 22.3制作一个秒表计时器 22.4小结
第32章 Flex 开发企业局域 应用实例解析
第33章利用 Flex和PHP创 建站视频发布
系统
第32章 Flex开发企业局域应用实例解析
32.1实例工程设置 32.2 Spark Intranet SampIe App应用 32.3数据/服务视图、测试选项视图和Getter/Setter方法自动生成 32.4使用络监视器 32.5小结
集成Flex与AJAX的RIA设计与实现

rdg o ks ” > i e r c ! / < mx: plc to > / Ap i ai n
通 过 定 义 带 有 I tts D t et和 F r g o k 的 默 x AB i erc d
_
Fe l x应用 程 序 的效 果 例 如 。单 击 网 页 中 的 按 钮 ,l Fx e
< mb d s c ” l A AX. f / e e r= Fe J x s '> w ’
了 JvSr t aa c p 客户 端 的各 种 属 性 和方 法 。 i
Fe — J r g lx A AX B i e技 术 使 得 Fe d lx技 术 与 AJ X 技 A 术 的交 互 更 加 简 单 快 捷 。Fe — J X B ig lx A A r e技 术 最 大 d 的 特点 是 可 控 制 ne 用 程序 的组 件 外 观 .调用 Fe x应 lx 应用 程 序 中的 方 法 和 函数 。
来 开 发 实 现 , 这 只 是 一 种 理 想 状 态 。 多 时 候 我 们 还 但 很 是要 用 到 A A 我 们 经 常 需 要 将 嵌 入 到 A A 应用 程 JX JX
f c nen tA piain . I RihItre p l t s R A)的 出 现也 就是 为 了解 c o
作者 简介 : 梦 怡 ( 9 3 ) 女 , 南 南 阳人 , 士 , 究 方 向 为 网格 服 务 与分 布 式 计 算 技 术 廖 18 一 , 河 硕 研
@ 现 计 机 21. 代 算 015 o
开 发 案白
— — — — — — — — — —— — —— — —— — —— — —— — —— — —— — — — — —— — —— —— — —— — —— — —— — —— — —— — — —— —— — —— — —— — —— — —— — — —— —— — —— —— — —— — —— —
柔性制造系统的关键技术及发展趋势

概述了柔性制造技术的基本概念、优缺点、发展的支撑条件等,探讨了柔性制造技术发展的现状与趋势,并指出“柔性”“敏捷”“智能”和“集成”乃是现今制造设备和系统的主要发展方向。
1 柔性制造技术(FMT)1.1 基本概念柔性制造技术(FMT)可以表述为两个方面:一是系统适应外部环境变化的能力,可用系统满足新产品要求的程度来衡量:二是系统适应内部变化的能力。
可用在有干扰情况下系统的生产率与无干扰情况下的生产率期望值之比来衡量。
“柔性”是相对于“刚性”而言的。
传统的“刚性”自动化生产线主要实现单一品种的大批量生产,优点是生产率高,设备利用率高,单件产品成本低。
但只能加工一种或几种相类似的零件,难以应付多品种中小批量的生产。
随着批量生产时代逐渐被适应市场动态变化的生产所替换,一个制造自动化系统的生存能力和竞争能力在很大程度上取决于它是否能在很短的开发周期内生产出较低成本、较高质量的不同品种产品的能力。
在现实社会中,人们通常将用以生产产品的制造系统根据其一次投产的数量而分为大量、批量和单件生产3种类型。
近20年来.世界市场从相对稳定型转向动态多变型。
市场的需求和企业产品特点表现为:市场的竞争日益激烈、市场需求的多变性和不可预测性、产品生命周期日益缩短、产品需求趋于顾客化。
在这种动态竞争全球化的市场环境中,企业生存和可持续发展已成为必须首先考虑的问题,这迫使企业努力寻找一种具有高柔性、高生产率、高质量和低成本的产品零件加工制造系统来替代传统制造系统,以期用最短的生产周期对市场需求变化作出响应,并使包括厂房、设备及人力在内的资源得到最有效地利用,达到企业生产经营能力整体优化的目的。
FMT所采用的一些原理和技术途径包含有非常先进的制造哲理和技术观念。
柔性制造系统(FMS)是能够覆盖上述3类制造系统基本原理和概念的一种制造系统。
柔性制造设备或系统正成为制造业领域中极为重要的主力制造设备。
1.2 柔性柔性制造系统(FMS)必须以柔性制造设备,如托盘化CNC加工中心机床为基础,而不能由没有固有柔性(Flexibility)的设备,如专用机床来构成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Flex 4 最佳集成实践苏春波, 高级软件工程师, HP简介: Flex 受到越来越多人的青睐,同时一些问题也涌现出来了,比如,代码结构,不同层间的信息交换不是很清晰等,使后期维护成本升高。
本文将通过具体实例来解决这些问题。
前言对于一个 web 软件项目而言,实现客户需要的基本功能往往是最基本的需求,随着软件的进一步发展和人们审美水平的逐步提高,客户已经不仅仅只是能满足功能性需求那么简单了,他们有了进一步的追求,呵呵,功能不但要强大,而且还要有漂亮、易于操作,甚至是能减少视觉疲劳的界面,这样一来一大群 UI 设计者如雨后春笋般应势而生,UI 也变得复杂起来了。
软件的生命周期因此而有小幅增长,“天空一声霹雳响,诞生 Flex 来帮忙”借用一下顺溜里面的一句话,Flex 的出现是软件开发者的福音,用它设计的界面不但绚丽多彩而且开发起来也相对简单,不但能缩短软件开发周期,还能给用户有一种好的视觉享受。
Flex 4 新特性总结了一下 Flex 4 的新特性,有助于用户更好的使用,理解它。
1) 代码模板虽然现在我们也可以通过插件来实现代码模板,但是总还是原生支持来的更舒服。
代码模板还支持“环境变量”,例如你可以向模板中添加“${project_name}”,则这部分内容会被转化成工程名称。
代码模板可以在偏好 (Preference) 中进行配置。
2) 悬停时的 ASDoc 提示也是从 Eclipse 中“继承”下来的功能,支持 ASDoc 中的链结3) Getter & Setter方便地在代码中添加 Getter 和 Setter。
(这里有个小插曲,Heidi 在演示前忘了把代码恢复成没有 Setter 的状态,所以她不得不现场把代码改回去,还很可爱的对观众们说“别看” ^_^ )。
4) 自动生成 Event Handler这个功能比用代码模板要方便得多。
5) 包重构重构功能一直是我对 Flex Builder 比较不满意的地方。
说实话,基于包的重构应该是比较基本的功能了。
6) Run to Line有的时候我们调试时会发现断点设置的并不合理,例如断点位置离我们关注的代1.下载开发 Flex 的 SDK :/cfusion/entitlement/index.cfm?e=flex4sdk (注意:是 flex4sdk);2.Flex SDK 下载完后点击安装文件开始安装,安装完后激活即可使用;3.安装 web 环境,将下载的 Apache-Tomcat-6.0.18 解压到指定目录,如c:\tomcat6;4.下载 Spring Framework:/download;5.下载 BlazeDS:/wiki/display/blazeds/BlazeDS初识 Flex 4新建一个 flex project,命名为 flexProjectForIBM, Flex SKD version 选择Flex 4.1( 一定是 4 以上的版本,版本 3 和 4 有很多差别的 ),其他选项默认即可,Main source folder 选择默认,Output folder 为 bin-debug, Output folder URL 为 http://localhost:8080/flexProjectForIBM, 规则为服务器地址加上工程名称,之所以是工程名称是因为我们以工程名称为包名部署到服务器中的,然后我们编辑 flexProjectForIBM.mxml 文件,增加一个 label,一个输入框,一个按钮,label 文本内容为“请输入员工姓名”,按钮命名为“查询”,然后我们在浏览器中输入http://localhost:8080/flexProjectForIBM/bin-debug/flexProjectForIBM.h tml, 我们就可以看到应用的主页了,主页内容显示如下:图 1.Flex UIFlex project 我们已经成功部署到服务器。
下面我们看下 Flex 是怎样与BlazeDS 集成的。
Flex 4 与 BlazeDS 集成首先我们修改 web.xml 文件,增加一个监听,内容见清单 1,一个 Servlet,内容如清单 2 所示:清单 1. 增加的监听<listener><listener-class>flex.messaging.HttpFlexSession</listener-class></listener>清单 2. 增加的 servlet<servlet><servlet-name>MessageBrokerServlet</servlet-name><servlet-class>flex.messaging.MessageBrokerServlet</servlet-class> <init-param><param-name>services.configuration.file</param-name><param-value>/WEB-INF/flex/services-config.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>MessageBrokerServlet</servlet-name><url-pattern>/messagebroker/*</url-pattern></servlet-mapping>然后将 blazeds.war 解压到某个目录下,将 WEB-INF 下的 flex 和 lib 目录复制到 flexProjectForIBM 的 WEB-INF 下面,flex 目录下面包括 4 个文件,分别是messageing-config.xml,proxy-config.xml,remoting-config.xml,services-c onfig.xml,建议不要修改这 4 个文件的名称,他们的具体作用可以参考BlazeDS 的官方文档,这里不再描述了。
下面新建一个 java project 取名为serviceProjectForIBM, 然后新建一个接口 HelloWorld,并新建一个方法sayHelloToSomeone,新建一个 HelloWorld 的实现类 HelloWorldImpl,实现sayHelloToSomeone 方法,如清单 3 所示:清单 3.sayHelloToSomeone 实现方法package org.ibm.flex.service.impl;import org.ibm.flex.service.HelloWorld;public class HelloWorldImpl implements HelloWorld {@Overridepublic String sayHelloToSomeone(String name) {return "Hello "+name;}}后台的服务已经开发完毕,然后我们打成一个 service-for-flex.jar 包放到上面的 flexProjectForIBM 工程的 WAR 包里面。
然后我们在修改下flexProjectForIBM.mxml 文件,增加 4 个标签,一个输入框和一个命令按钮,详细命名与布局见清单 4 所示:清单 4. 与 BlazeDS 集成的 UI 变化<mx:Button x="324"y="103"label="Call remote method"click="remotingSayHello(event);"/> <mx:TextInput x="148"y="103"id="tiName"/><mx:Label x="98"y="105"text="name:"/><mx:Label text="{stResult}"x="52"y="162"width="448"height="71"id="lblView"color="#FCEE09"fontSize="20"fontWeight="bold"textDecoration="underline"fontStyle="normal"/><s:Label x="54" y="87" text="Remote service test:"/><s:Label x="54" y="142" text="Remote method result:"width="131"/>注意一下 lblView 的 text 值的设置。
我们这时候会发现清单 4 中的remotingSayHello 方法在上面也没有定义呀,你说对了,下面我们看下remotingSayHello 方法的定义,这是一个调用远程服务的方法,具体内容见清单 5 所示:清单 5. remotingSayHello 内容<fx:Script><![CDATA[function remotingSayHello(event:Event):void{var iname:String=tiName.text;say.sayHelloToSomeone(iname);}]]></fx:Script>注意上面的 say 是我们定义的一个远程对象,具体内容见清单 6 所示:清单 6. 定义远程对象<mx:RemoteObject id="say"destination="HelloWorld"endpoint="/flexProjectForIBM/messagebroker/amf"></mx:RemoteObject>注意上面的 endpoint 这个时候我们是一定要配置的,否则调用不到远程服务的,后面我们将会去掉这一冗余配置,destination 是我们在remoting-config.xml 定义的,详细内容见清单 7 所示:清单 7. remoting-config.xml 的配置<destination id="HelloWorld"><properties><source>org.ibm.flex.service.impl.HelloWorldImpl</source></properties></destination>以上步骤一定要仔细配置,有时候只是错了一小点,可是检查起来确是很困难的,那样的费时费力确实是使人很郁闷的。