Flex BlazeDS Java JDBC MySql 快速配置

从下往上:image

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.

This entry was posted in ActionScript, Flex, Java and tagged , , , , , . Bookmark the permalink.

7 Responses to Flex BlazeDS Java JDBC MySql 快速配置

  1. lazarus says:

    为什么我ListFriend.dataProvider=evt.result as ArrayCollection;
    的时候写进ListFriend的时候是[object,Object]
    请回复到我的邮件好吗?

  2. 老李 says:

    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();
    }

  3. 道瓜 says:

    支持哥哥

  4. emeraldfish says:

    Appcontext 是怎么来的?我就是没看明白,可能把这个实例的源码给我参考一下,谢谢!

  5. emeraldfish says:

    at.addResponder(this); //为本实例增加responder

    Severity and Description Path Resource Location Creation Time Id
    1067: com.esri.solutions.flexviewer:loadEmployeeInfo 类型值的隐式强制指令的目标是非相关类型 mx.rpc:IResponder。

    别的都好了,就在这句话报这个错。楼主能帮我解决一下这个问题吗?是什么引起的?

  6. emeraldfish says:

    搞定了,但是不是用你的这种方法,有空了把你的源码给我参考参考,看看哪种方法好!

  7. emeraldfish says:

    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’);
    }

    我直接这么做的。

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>