1. Java – JDBC – MySql
1. 装好MySql, 启动服务.
2. 将mysql-connector-java-5.1.7-bin.jar 拖入WEB-INF/lib下.
搞定.
2. Java端BlazeDS配置
1. Java端:
将BlazeDS压缩包内的WEB-INF里面的东西拷贝工程内的WEB-INF下的相应位置中.[ Flex目录下有四个xml配置文件, lib下是需要使用的jar] 包括web.xm
2. 配置services-config.xml中channels标签中的内容:
false
true
4
其中, http://localhost:8080/DepartmentManagement/ 是该Web工程的地址 [可在web-content下建立一空index.html, 运行后查看地址便可]
3. 编写Java类, 并配置remoting-config.xml文件的<service>标签下, 增加服务, 如下:
com.insprise.guoliang.DepartmentManagement
3. Flex端建立工程
1. 建立 Flex与Java通信载体RemoteObject
为方便在整个工程中使用, 可建立一个Singleton – 关于AS中的Singleton可见: http://liguoliang.com/2008/10/128/
在该类中建立RemoteObject.
首先需要确定RemoteObject的destination, 在本例中 为”DepartmentManagement”; – 在remoting-config.xml中已配置.
其次需要确定ro的channel – 本例中为:”http://localhost:8080/DepartmentManagement/messagebroker/amf"; - 在services-config.xml中已配置
代码:
public static const DEFAULT_DEST:String = "DepartmentManagement";
public static const DEFAULT_CHANNEL_URL:String = "http://localhost:8080/DepartmentManagement/messagebroker/amf";
private static var _ro:RemoteObject;
/**
* Constractor - Singleton
*/
public function AppContext():void {
throw new Error("AppContext is Singleton!");
}
/**
* Get RemoteObject
*/
public static function getRemoteObject():RemoteObject {
if(_ro == null) {
_ro = createRemoteObject(DEFAULT_DEST, DEFAULT_CHANNEL_URL);
}
return _ro;
}
/**
* Constructs a new remote object with new channel.
* @param roDestination Destination of the RemoteObject; should match a destination name in the services-config.xml file.
* @param channelURI the URI used to create the whole endpoint URI for this channel; this uri can be relative uri (to the folder containing the SWF).
* @param channelId the id of the channel, if set to null, a random Id will be assigned.
*/
protected static function createRemoteObject(roDestination:String, channelURI:String, channelId:String = null):RemoteObject {
var channelSet:ChannelSet = new ChannelSet();
var channel:AMFChannel = new AMFChannel(channelId == null ? "channel-" : channelId, channelURI); //Create new Channel
channelSet.addChannel(channel);
var ro:RemoteObject = new RemoteObject(roDestination);
ro.channelSet = channelSet;
return ro;
}
4 配置完成,.
在Java端建立相关的Class,
启动服务器.
在Flex端通过 Appcontext.getRemoteObject.getOperation(“方法名称”)来调用服务器端方法.
具体实例:
Java端的Class – 通过JDBC 读取 MySql中数据:
/**
* Load all Department and return an ArrayList
* @return
*/
public ArrayList loadDepartments() {
ArrayList departmentsAL = new ArrayList();
log.info("Loading Departments...");
try {
//Get Connection
Connection conn = JdbcUtilities.getConnection();
//Create statement
String sql = " SELECT * FROM Department d ORDER BY d.Department_ID";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet res = ps.executeQuery();
log.debug("Exectuing: " + sql);
while (res.next()) {
int id = res.getInt("Department_ID");
String name = res.getString("name");
Department dp = new Department();
dp.setId(id);
dp.setName(name);
departmentsAL.add(dp);
log.debug("从数据库获得部门: " + dp);
}
JdbcUtilities.closeConn(res, ps, conn);
log.info("加载部门信息结束, 共加载部门: " + departmentsAL.size());
} catch (Exception e) {
log.error("SQL Error", e);
throw new Error(e);
}
return departmentsAL;
}
Flex端的代码:
/**
* Load the Department's Employee
*/
private var op:AbstractOperation;
public function loadEmployees():void {
op = AppContext.getRemoteObject().getOperation("loadEmployees"); //获得Operation
op.arguments = [id]; //设定参数
var at:AsyncToken = op.send(); //Send
at.addResponder(this); //为本实例增加responder
}
Flex端responder剩余代码见:http://liguoliang.com/2009/02/777/
运行Flex工程, Flex取得RemoteObject, 然后通过channel建立到destination的连接,由Java读取数据库中信息, 并返回给Flex.



为什么我ListFriend.dataProvider=evt.result as ArrayCollection;
的时候写进ListFriend的时候是[object,Object]
请回复到我的邮件好吗?
Flex端需要实现 IExternalizable接口, 并实现writeExternal, readExternal方法
Java端实现Externalizable接口, 实现readExternal,writeExternal方法.
注意, 两端read与write必须配对, 如:
Java Write -> 向Flex端方法送:
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(id);
out.writeUTF(name);
}
Flex端read ->接收
public function readExternal(input:IDataInput):void {
_id = input.readInt();
_name = input.readUTF();
}
支持哥哥
Appcontext 是怎么来的?我就是没看明白,可能把这个实例的源码给我参考一下,谢谢!
at.addResponder(this); //为本实例增加responder
Severity and Description Path Resource Location Creation Time Id
1067: com.esri.solutions.flexviewer:loadEmployeeInfo 类型值的隐式强制指令的目标是非相关类型 mx.rpc:IResponder。
别的都好了,就在这句话报这个错。楼主能帮我解决一下这个问题吗?是什么引起的?
搞定了,但是不是用你的这种方法,有空了把你的源码给我参考参考,看看哪种方法好!
public var empList:ArrayCollection;
public var employeeRO:RemoteObject;
//取得人员列表信息;
public function useRemoteObject():void {
employeeRO = new RemoteObject();
employeeRO.destination = “loadEmployees”;
employeeRO.addEventListener(“result”, getListResultHandler);
employeeRO.addEventListener(“fault”, faultHandler);
employeeRO.LoadEmployee();
}
public function getListResultHandler(event:ResultEvent):void {
// Do something
empList=event.result as ArrayCollection;
Alert.show(empList.length.toString());
}
public function faultHandler (event:FaultEvent):void {
// Deal with event.fault.faultString, etc.
Alert.show(event.fault.faultString, ‘Error’);
}
我直接这么做的。
aladrey and I don’t think that is because my experience has not been valuable enough. I truly believe that mostly of this experience shared here is fair, deep and has a global impact. The only thing I would add to the technical list but that actually it’s more like an alternative solution, rather than a new idea , would be the Swiz framework as another main stream IOC/DI framework to build enterprise applications such as Parsley. It is quite lightweight framework, very robust, easy to setup, easy to use and the best thing in my opinion, it doesn’t impose any development structure or design pattern to get started. I have never used Parsley before, but according to people I have been talking and from what I have read, it is quite similar to Swiz in terms of features and functionalities.