1. 程式人生 > >杜鵬的個人部落格 Flex使用Blazeds與Java互動及自定義物件轉換詳解

杜鵬的個人部落格 Flex使用Blazeds與Java互動及自定義物件轉換詳解

一、建立Flex與Java互動的工程。

  本文中講到的互動是利用Blazeds的,因為這個是免費的,呵呵,我是窮人。

  首先就是去下載Blazeds的壓縮包,這個可以從官網或者CSDN、JavaEye上下到。解壓縮這個包,將裡面的Blazeds.war解壓,後面建立工程時要使用。

  在MyEclipse中建立一個web工程,名為FlexTest。(注意:這個工程的JDK一定是1.5或以上版本,本文使用6.0

  將剛才解壓的Blazeds.war包中的“META-INF”與“WEB-INF”資料夾以及資料夾中的內容拷貝到工程的WebRoot下。WEB-INF中包含有Flex的配置檔案以及Blazeds需要的Jar包。這時我們就可以在這個工程中寫入Java程式碼了。本文以一個使用者列表為例,建立使用者實體類。程式碼如下:

package com.rocd.flex.entity;
 
  import java.io.Serializable;
 
 public class UserBean implements Serializable {
     private String userName;
     private String password;
     private int age;
     private String email;
 
     public String getUserName() {
         return userName;
     }
 
     public void setUserName(String userName) {
         this.userName = userName;
     }
 
     public String getPassword() {
         return password;
     }
 
     public void setPassword(String password) {
         this.password = password;
     }
 
     public int getAge() {
         return age;
     }
 
     public void setAge(int age) {
         this.age = age;
     }
 
     public String getEmail() {
         return email;
     }
 
     public void setEmail(String email) {
         this.email = email;
     }
 }


  注意,由於這個實體類需要當做Java程式碼中方法的返回值傳遞給Flex中的AS程式碼,所以需要繼承Serializable介面,否則將導致異常的發生。

  然後,在建立一個供Flex呼叫的Java類。程式碼如下

package com.rocd.flex.biz;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import com.rocd.flex.entity.UserBean;
 
 public class UserManager {
     public List<UserBean> getUserList() {
         List<UserBean> list = new ArrayList<UserBean>();
         for (int i = 0; i < 10; i++) {
             UserBean user = new UserBean();
             user.setUserName("使用者" + i);
             user.setPassword("123");
             user.setAge(20 + i);
             user.setEmail("user" + i + "@aaa.com");
             list.add(user);
         }
         return list;
     }
 }


  這裡就不連線資料庫去操作了,因為本文重點放在Flex呼叫Java上,所以寫個樁資料用以測試。

  寫完了這兩個類,就需要在WebRoot/WEB-INF/flex/remoting-config.xml中配置用以呼叫這個Java類的通道了。具體程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
 <service id="remoting-service" 
     class="flex.messaging.services.RemotingService">
     <adapters>
         <adapter-definition id="java-object" 
         class="flex.messaging.services.remoting.adapters.JavaAdapter" 
         default="true"/>
     </adapters>
     <default-channels>
         <channel ref="my-amf"/>
     </default-channels>
     <destination id="UserManager">
         <properties>
             <source>com.rocd.flex.biz.UserManager</source>
         </properties>
     </destination>
 </service>


  其中destination就是通道,properties是可以配置多個Java類,source是配置要呼叫Java類的包路徑。

  到此,Java部分的程式碼就寫完了。下面是Flex中的程式碼。

  在Flex Builder中建立一個Flex工程。名稱為FlexApp。如圖所示


  注意Project LocationFolder要選擇MyEclipse建立的Web工程的WebRoot下。Server technology選擇J2EE
點選[Next]按鈕進入下一頁。如圖


  注意Server location中Root folder要選擇Java Web工程的WebRoot路徑。Root URL是Java web工程的訪問路徑,由於使用的是Tomcat伺服器,工程名為FlexTest,所以路徑是http://localhost:8080/FlexTest/,而
Context root則是Java Web專案的工程名。完成後點選那個[Validate Configuration]進行驗證,如果視窗上方顯示如上圖所示的“黃三角”就說明可以進行下一步操作了。

  順利建立完Flex工程後,需要注意是否報錯,如果報錯,請注意調整Flex SDK的版本。

  沒問題後,就要建立一個AS的類,用來接收Java程式的返回值了,也就是那個UserBean。程式碼如下:

package com.rocd.flex.entity
{
    [Bindable]
    [RemoteClass(alias="com.rocd.flex.entity.UserBean")] 
    public class UserBean
    {
        public var userName:String;
        public var password:String;
        public var age:int;
        public var email:String;
    }
}


  這裡[Bindable]是可繫結的,[RemoteClass(alias="com.rocd.flex.entity.UserBean")]是和Java程式碼中的UserBean類關聯起來。這樣就可以利用型別轉換來將Java物件轉換為AS物件了。

  現在讓我們在Flex中呼叫這個Java程式碼吧。程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
     fontSize="12" initialize="init()">
     <mx:Script>
         <![CDATA[
             import com.rocd.flex.entity.UserBean;
             import mx.collections.ArrayCollection;
             import mx.rpc.events.ResultEvent;
             
             private function init():void
             {
                 UserManager.getUserList();
                 UserManager.addEventListener(ResultEvent.RESULT,getUserList);
             }
             
             private function getUserList(event:ResultEvent):void
             {
                 var userList:ArrayCollection = ArrayCollection(event.result);
                 var userList_FlexData:ArrayCollection = new ArrayCollection();
                 for (var i:int = 0; i < userList.length; i++)
                 {
                     var user:UserBean = UserBean(userList.getItemAt(i));
                     userList_FlexData.addItem(user);
                 }
                 dataGrid.dataProvider = userList_FlexData;
             }
         ]]>
     </mx:Script>
     <mx:RemoteObject id="UserManager" destination="UserManager" 
         showBusyCursor="true" />
 
     <mx:Panel x="32" y="20" width="399" height="285" layout="absolute" title="使用者列表">
         <mx:DataGrid x="0" y="0" width="379" height="243" id="dataGrid">
             <mx:columns>
                 <mx:DataGridColumn headerText="使用者名稱" dataField="userName"/>
                 <mx:DataGridColumn headerText="年齡" dataField="age"/>
                 <mx:DataGridColumn headerText="Email" dataField="email"/>
             </mx:columns>
         </mx:DataGrid>
     </mx:Panel>
 </mx:Application>


  啟動Tomcat伺服器後執行這個Flex程式,如下圖所示:


  我對Flex與Java互動這塊還不是很熟悉,所以有什麼不對的地方,或者有更簡單的方式,請大家給出建議。

轉自:http://www.cnblogs.com/RocD-DuPeng/articles/1751040.html