BlazeDS整合Spring,adobe开发者中心有文章介绍:
http://www.adobe.com/devnet/flex/articles/spring_blazeds_integration.html
http://www.adobe.com/devnet/livecycle/articles/blazeds_spring_05.html
前几天在IBM developerWorks看到一篇文章,自己更改了一下:
1.服务端编程
用myeclipse8.0下载flash build4插件。首先建一个flex project,使用WTP创建flex/java组合项目,点next,在LCDS war文件中,找到自己下载的blazeds-turnkey中的blazeds.war文件。
完成之后在WEB-INF目录下flex目录中找到services-config.xml添加:
<factories> <factory id="flexFactory" class="org.expressme.employee.mgmt.flex.FlexFactoryImpl"/> </factories>
在remoting-config.xml中添加:
<destination id="flexService"> <properties> <factory>flexFactory</factory> <source>flexService</source> <scope>application</scope> </properties> </destination>
注意这里的flexservice是Spring中的bean。不用spring需要写全路径。
FlexFactoryImpl.java实现如下:
public class FlexFactoryImpl implements FlexFactory { private Log log = LogFactory.getLog(getClass()); public FactoryInstance createFactoryInstance(String id, ConfigMap properties) { log.info("Create FactoryInstance."); SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties); instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId())); return instance; } public Object lookup(FactoryInstance instanceInfo) { log.info("Lookup service object."); return instanceInfo.lookup(); } public void initialize(String id, ConfigMap configMap) { } }
web.xml中添加spring支持就可以了,其他的不用更改。spring配置文件和以前的一样。具体代码在附件中。
2.客户端实现
EmployeeMgmt.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="queryAll();"> <fx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.rpc.events.ResultEvent; import org.expressme.employee.mgmt.Employee; [Bindable] private var employees : ArrayCollection = new ArrayCollection(); private function queryAll():void { ro.queryAll(); } private function resultHandler(event:ResultEvent):void { employees = new ArrayCollection(); for each (var o : Employee in event.result as Array) { employees.addItem(o); } } private function queryByName():void { var name : String = nameText.text; if (name.length==0) { queryAll(); }else{ ro.queryByName(name); } } private function preCreateEmployee():void { form_name.text = ""; form_title.selectedIndex = 0; form_gender_male.selected = false; form_gender_female.selected = false; form_birth.text = ""; form_panel.visible = true; } private function deleteEmployee():void { var item : Employee = employeeDataGrid.selectedItem as Employee; if (item==null) { Alert.show("Please select an employee first!", "Error"); }else { ro.deleteEmployee(item.id); employees.removeItemAt(employeeDataGrid.selectedIndex); } } private function createEmployee():void{ ro.createEmployee(form_name.text,form_title.selectedItem, form_gender_male.selected,form_birth.selectedDate); } ]]> </fx:Script> <fx:Declarations> <s:RemoteObject id="ro" destination="flexService" result="resultHandler(event)"/> </fx:Declarations> <s:Label x="10" y="10" text="Employee Management" fontSize="24"/> <s:TextInput x="10" y="53" width="322" id="nameText"/> <s:Button x="340" y="53" label="Query" click="queryByName()"/> <s:Button x="409" y="53" label="Create" click="preCreateEmployee()"/> <s:Button x="481" y="53" label="Delete" click="deleteEmployee()"/> <mx:DataGrid x="10" y="83" width="535" height="186" dataProvider="{employees}" id="employeeDataGrid"> <mx:columns> <mx:DataGridColumn headerText="ID" dataField="id"/> <mx:DataGridColumn headerText="Name" dataField="name"/> <mx:DataGridColumn headerText="Title" dataField="title"/> <mx:DataGridColumn headerText="Gender" dataField="gender"/> <mx:DataGridColumn headerText="Birth" dataField="birth"/> </mx:columns> </mx:DataGrid> <s:Panel x="128" y="160" width="298" height="191" title="Create New Employee" id="form_panel" visible="false"> <s:TextInput x="87" y="10" id="form_name"/> <s:Label x="37" y="12" text="Name:"/> <s:Label x="44" y="38" text="Title:"/> <s:Label x="28" y="64" text="Gender:"/> <s:Label x="43" y="90" text="Birth:"/> <s:ComboBox x="87" y="36" id="form_title"> <s:dataProvider> <mx:ArrayList> <fx:String>CEO</fx:String> <fx:String>Project Manager</fx:String> <fx:String>Architect</fx:String> <fx:String>Engineer</fx:String> <fx:String>Designer</fx:String> </mx:ArrayList> </s:dataProvider> </s:ComboBox> <s:RadioButton x="86" y="62" label="Male" groupName="grp_gender" id="form_gender_male" value="true"/> <s:RadioButton x="145" y="62" label="Female" groupName="grp_gender" id="form_gender_female" value="false"/> <mx:DateField x="87" y="88" width="160" id="form_birth"/> <s:Button x="87" y="118" label="Create" id="form_button_create" click="createEmployee()"/> <s:Button x="159" y="118" label="Cancel" id="form_button_cancel" click="form_panel.visible=false"/> </s:Panel> </s:Application>
Employee.as
package org.expressme.employee.mgmt { [RemoteClass(alias="org.expressme.employee.mgmt.Employee")] [Bindable] public class Employee { public var birth : Date; public var id : String; public var name : String; public var title : String; public var gender : Boolean; } }
客户端实现有点小问题,就是每个ro事件处理都是resultHandler处理,导致增删操作后表格没数据显示。我也懒得改了,读者自己试试怎么实现……