BlazeDS 是一個(gè)基于服務(wù)器的 Java 遠(yuǎn)程控制 (remoting) 和 Web 消息傳遞 (messaging) 技術(shù),它提供了 Java 應(yīng)用程序和運(yùn)行在瀏覽器上的 Adobe Flex 應(yīng)用程序相互通信的一種手段,并且是一種高效的手段。也就是說它實(shí)現(xiàn)了 Java 和 Flex 的無縫集成。
BlazeDS是開源的,Adobe原來有一個(gè)商業(yè)版本,這是商業(yè)版本的開源化的產(chǎn)品,功能比商業(yè)版本少一些,但基本滿足需要。
Flex與后臺(tái)服務(wù)器上的應(yīng)用程序通信的手段有三個(gè):
(1) HTTPService: 采用標(biāo)準(zhǔn)的HTTP請(qǐng)求,服務(wù)器返回 XML 格式的消息;
(2) WebService: 采用SOAP消息格式進(jìn)行通信,也是XML格式,它是一種專門用于Web的業(yè)界標(biāo)準(zhǔn);
(3) RemoteObject: 采用 AMF 消息格式進(jìn)行通信,這是二進(jìn)制的格式,因此它的效率最高。BlazeDS就是采用這個(gè)技術(shù)的。
據(jù)說 BlazeDS 還將開發(fā)適用于 .net 和 PHP 版本,不過采用相同技術(shù)(RemoteObject)的各種開源產(chǎn)品也已有多種了,可在 Java, .net, PHP下使用。
本文的目的是詳細(xì)說明BlazeDS開發(fā)環(huán)境的安裝,以及創(chuàng)建BlazeDSr的 Hello, world! 項(xiàng)目的過程。
一、相關(guān)軟件
1、安裝 Java JDK 5.0 以上版本;
這是必備的。
2、安裝 Eclipse 3.2 以上版本;
這也是必備的。
3、安裝 MyEclipse 6.0 以上版本;
它用于開發(fā) J2EE 項(xiàng)目,可編寫 Java 程序,編寫網(wǎng)頁等。
4、安裝 Flex Builder 3 Plug-in版本(不能用獨(dú)立版本);
它用于開發(fā) Flex 前端界面。
5、安裝 tomcat 6.0 以上版本;
Web服務(wù)器,也可用其它的,例如JBoss等。
6、下載 BlazeDS,有二個(gè)版本:
一是只有4M大小的版本,這是核心;
二是166M的版本,稱為blazeds-turnkey,它內(nèi)置了tomcat以及文檔、實(shí)例和支持實(shí)例的數(shù)據(jù)庫系統(tǒng)(HSQL),以及flex sdk。
本教程只需BlazeDS的核心,下載后備用。
二、安裝過程
1、安裝 Java JDK 5.0 或 6.0,注意不是JRE,只要一路 Next 就行;
安裝完要作環(huán)境變量配置:
JAVA_HOME,為JDK的安裝目錄,如 C:\Program Files\Java\jdk1.6.0_06
CLASSPATH,值為 .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar,注意最前面的句號(hào),不能漏了;
path,為安裝目錄下的 bin目錄,值為 %JAVA_HOME%\bin
2、安裝 Eclipse 3.2,只要解壓縮到任意一個(gè)目錄中;
直接運(yùn)行其中的 eclipse.exe 文件即可,為提高運(yùn)行速度,可為其分配更多的內(nèi)存,即運(yùn)行時(shí)加上下述參數(shù):
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
方法是為 eclipse.exe 建立一個(gè)快捷方式,然后在快捷方式的屬性中在eclipse.exe后加一空格,再加上上述參數(shù)
3、安裝 MyEclipse 6.0 以上版本,在安裝過程中需要指定 Eclipse 的位置,然后一路 Next即可;
安裝后運(yùn)行MyEclipse或eclipse都同樣是打開MyEclipse;
4、安裝 Flex Builder 3 Plug-in版本,可以安裝在任意的目錄中,在安裝過程中同樣需要指定 Eclipse 的位置,然后一路 Next 即可;
安裝后需配置 eclipse:
在上述第2步中的eclipse目錄下創(chuàng)建一個(gè)目錄,名為links,如果已經(jīng)存在該目錄(通常是已有了),則使用原有的;
在links目錄下新建一個(gè)文件,名為 flex.link(文件名任意,后綴必須是link),內(nèi)容為path=Flex Builder 3 Plug-in的安裝目錄,例如:
path=D:\\program\\Adobe\\Flex Builder 3 Plug-in
注意目錄的分隔符或者用“\\”,或者用“/”,前者為Windows風(fēng)格,后者為L(zhǎng)inix風(fēng)格;
5、安裝 tomcat 6.0,將文件解壓縮到任意目錄中。
6、BlazeDS 在創(chuàng)建項(xiàng)目時(shí)用;
三、創(chuàng)建Hello, workd項(xiàng)目:
下述步聚將創(chuàng)建名為web的一個(gè)集成Java的Flex項(xiàng)目, 需要時(shí)還可以添加 hibernate, spring能力。下面的web都是指項(xiàng)目名,可以改為你的項(xiàng)目名。
1、創(chuàng)建一個(gè)MyEclipse的Web Project項(xiàng)目;
在MyEclipse中,選擇 File -> New,在彈出的菜單中選 Web Project,如果看不到該選項(xiàng),則選 Others,然后再選:
MyEclipse -> Java Enterprise Projects -> Web Project
在下一步中指定項(xiàng)目的名稱,例如web,在這一步中記得將Source folder改為另外的名字,例如javasrc或jsrc,這是為了避免與flex的源文件夾名沖突;
其它保留默認(rèn)值,完成項(xiàng)目的創(chuàng)建。
2、為項(xiàng)目配置服務(wù)器
首先啟動(dòng) tomcat 服務(wù)器:
在tomcat解壓縮的目錄中的bin下找到 startup.bat 文件,雙擊運(yùn)行,這時(shí)將打開一個(gè)命令行窗口,在整個(gè)開發(fā)過程中不要關(guān)閉這個(gè)窗口,否則tomcat就停止了。
配置MyEclipse使用上述的tomcat 服務(wù)器;
將項(xiàng)目發(fā)布到 tomcat服務(wù)器;
上述2個(gè)小步聚不會(huì)做的,請(qǐng)查一下MyEclipse項(xiàng)目的使用的資料(配置tomcat,發(fā)布項(xiàng)目,啟動(dòng)和停止tomcat)。
配置后可以用瀏覽器測(cè)試項(xiàng)目是否能正常運(yùn)行:
http://127.0.0.1:8080/web/index.jsp
3、將 BlazeDS 解壓縮到項(xiàng)目中,步聚如下:
將下載的 BlazeDS.war 文件改后綴名為 zip,然后解壓縮到任意的目錄中,再將解壓縮出來的二個(gè)文件夾移動(dòng)或復(fù)制到前一步中創(chuàng)建的項(xiàng)目中。
注意:這兩個(gè)文件夾是META-INF和WEB-INF,要把它們覆蓋上一步創(chuàng)建的項(xiàng)目中的同名目錄,僅是目錄名相同,文件是不同的。
復(fù)制后不要忘記重新發(fā)布一下項(xiàng)目,否則下一步不能做。
4、為項(xiàng)目添加Flex Project Nature;
這一步比較重要,必須是在前述所有步聚正確完成后才能進(jìn)行:
從項(xiàng)目右鍵菜單中選擇 Flex Project Nature -> Add Flex Project Nature (在選擇中是第二個(gè)選擇);
在彈出的窗口中的Application server type 選擇 J2EE;
在下一個(gè)窗口中設(shè)置好合適的參數(shù):
(1)反選 Use default location for local LiveCycle Date Services server
(2)Root folder: 選擇項(xiàng)目發(fā)布的目錄:例如:D:\program\tomcat6\webapps\web
(3)Root URL: 在瀏覽器中訪問項(xiàng)目的網(wǎng)址,例如:http://localhost:8080/web/
(4)Context root: 項(xiàng)目的上下文,一般就是項(xiàng)目名,例如:/web
項(xiàng)目必須是有BlazeDS的相關(guān)包,即上一步中復(fù)制到項(xiàng)目中,然后再發(fā)布到上述設(shè)置的目錄中。
設(shè)置好后,還需要點(diǎn)擊 Validation configuration,測(cè)試配置是否正確,只有正確時(shí),才能繼續(xù)進(jìn)行下去。
這時(shí)會(huì)出現(xiàn)一個(gè)錯(cuò)誤提示,當(dāng)完成下述設(shè)置后,錯(cuò)誤將得到改正。并且整個(gè)項(xiàng)目創(chuàng)建完成。
修改項(xiàng)目的Flex Compile選項(xiàng):
從項(xiàng)目右鍵菜單中選擇 Properties;
在打開的窗口中選擇 Flex Compiler,然后在右邊的 User a specific SDK中選 Flex 3.2。
項(xiàng)目創(chuàng)建成功
4、測(cè)試Flex 前端;
先測(cè)試 Flex 前端,在web.mxml文件中增加一行,添加一個(gè)Label,使整個(gè)文件內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Label x="228" y="95" text="Hello, World!"/>
</mx:Application>
|
按執(zhí)行按鈕,這時(shí)應(yīng)該彈出瀏覽器窗口,能看到頁面的內(nèi)容 Hello, World!
5、測(cè)試與Java的集成:
將項(xiàng)目切換到MyEclipse Java Enterprise 視圖
在javasrc中按需要?jiǎng)?chuàng)建包,然后創(chuàng)建一個(gè)類:
package org.ngweb.flex;
public class Hello {
public String sayHello(){
return "Hello, world!";
}
public String sayHello(String s){
return "Hello, "+s+"!";
}
}
|
將項(xiàng)目視圖切換到 Flex Development 視圖:
打開 WebRoot/WEB-INF/flex/remoting-config.xml文件,將其修改成:
<?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="helloWorld">
<properties>
<!-- 這里要寫完整路徑:包名 + 類名 -->
<source>org.ngweb.flex.Hello</source>
</properties>
</destination>
</service>
|
然后在web.mxml中,添加一段代碼(第4步增加的Label可以刪除掉),使其成為(可以直接復(fù)制使用,有關(guān)代碼的含義請(qǐng)參見其它資料):
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
private function resultHandler(event:ResultEvent):void {
Alert.show(event.result.toString(), "成功");
}
private function faultHandler(event:FaultEvent):void {
Alert.show(event.fault.toString(), "失敗");
}
]]>
</mx:Script>
<!-- destination 屬性值要和 remoting-config.xml 中 destination 的 id 一致-->
<mx:RemoteObject id="remoteObject"
destination="helloWorld"
result="resultHandler(event)"
fault="faultHandler(event)"/>
<mx:Button label="發(fā)送消息" click="remoteObject.sayHello('huang')" x="256.5" y="197"/>
</mx:Application>
|