對Macromedia公司的Fl Swing之外又有了一種全新 . 本文調查了Flash遠程調
| ash的遠程調用使得Java開發者 的方式來構建J2EE(Java 2 Plat 用,解釋了爲何它有如此作用,
| 除了JSP(JavaServer Pages)和 form, Enterprise Edition)應用 並且提供了一個如何實現的例子
|
在任何多層體系中選擇 Swing/AWT(Abstract Windo 容。但同時也使得當應用程 Swing,開發者可以輕易控 要既以比較小,基於瀏覽器 。對於這些情況,Macromed
| 表示層技術時,Java開發者通常 wing Tookit)。藉助JSP,開發 序在不同的瀏覽器中發佈時開發 制應用程序的行爲,但要求用戶 的方式發佈同時又對用戶的交互 ia Flash提供了一種可供選擇的
| 有兩種選擇: JSP或者 者可以創建非常容易發佈的動態內 者不易控制他們的運行情況。使用 安裝Java運行時環境。當開發者需 有較高的可控性時也存在這種情況 解決方法。
|
一般來說,Macromedia 是,直到最近都沒有出現標 Remoting MX的引入才得以 與Java, .NET和ColdFusion 布小的,基於瀏覽器的表示
| Flash比發佈界面豐富,帶有腳 準的方法可以將Flash應用整合 改變。Flash Remoting MX提供 之間進行通信。利用Flash Remo 層,同時可以對應用的行爲進行
| 本程序的應用程序要優越。不幸的 進J2EE體系。這種狀況隨着Flash 了標準的通信層使Flash應用程序 ting,開發者得以在J2EE體系中發 足夠的控制。
|
本文將解釋爲何Macro Flash適合於 用層如何得以改變,然後比較Flash和現
| 作爲n層體系中應用層的解決方法。我將首先調查應 有標準,最後解釋Flash如何應用於J2EE體系。
|
從Berners-Lee創建第一個基於Web的 之前,開發者不得不開發與服務器緊密結 Web服務器和HTML,開發者可以爲用戶發 或軟件平臺。這種方法對於應用層開發者 檔的數據,但它不適合有多種表現的應用
| 系統至今,n層體系的表示層經歷了一次變化。在那 合的客戶端系統。所能利用的只有基本的HTTP協議, 布基於文檔的應用系統,不管他們使用的是何種硬件 有一些基本問題: 雖然HTML可以成功地被傳送基於文 —可與用戶進行實時的交互。
|
爲了解決這些不足,開 些新的特性,即Java和java 臺無關的應用。實際上Java 裝Java運行時環境(Java Ru 了需要安裝客戶端系統來運 的,特別是會使Internet的
| 發者開始在現代的瀏覽器(Netsc script。開發者第一次能夠利用 小程序的使用從沒有達到它的期 ntime Environment, JRE),並 行Java小程序外,客戶端還需下 連接變得非常慢。
| ape Navigator 2.0以後)中開發一 Web瀏覽器平臺發佈豐富的,與平 望值。Java小程序要求用戶已經安 且Web瀏覽器安裝了Java插件。除 載Java小程序。這些是很耗費時間
|
除了這種解決方法外開發者有三種選 HTML(DHTML), applet/Swing, 或者第三
| 擇來在客戶端/服務器應用中使用豐富的前端: 動態 方解決方法。每種解決方法都各有利弊。
|
使用DHTML創建豐富的前端提供瞭如下優點:?????????????????????????????????? |
1. DHTML是開放的並且免費?????????????????????????????????????????????? |
2. 使用DHTML所寫的應用可以在支持DHTML的任何Web瀏覽器中配置???? |
3. 基於Web的應用其客
| 戶端通常都由文字和圖片構成,
| 這允許小的應用腳本的存在。
|
DHTML也並不總是一個 :
| 好的解決方案;當選擇這一技術
| 時你也必須要考慮到它的一些缺點
|
1. DHTML依賴用戶的We 和版本多種多
| b瀏覽器來切實地將用戶的原意
| 反映在應用中。由於瀏覽器的廠家
|
樣,因此複雜的應用中必須嵌入工作區以使得應用能夠在不同的瀏覽器中有着同樣的表現 |
2. 儘管DHTML使得開發者可以更好地控制客戶端行爲,但這種靈活性也是有限的 |
3. 由於不同的瀏覽器在表現HTML和 Web瀏覽器創建
| 解釋javascript上有一些不同,必須爲各個不同的
|
不同的平臺。加入工作區並將每個瀏 論什麼時候一
| 覽器的實現分開增加了維護應用的複雜性。另外,無
|
個新的瀏覽器發佈後,應用(或應用的一個部分)就必須重新編碼並測試。???????????? |
當開發者明確知道他在 如果企業內部網僅適用IE6.
| 標準的客戶端配置什麼樣的應用 0,針對該瀏覽器的應用邏輯可
| 時,使用DHTML的確有它的優勢。 以被處理得非常得當。
|
對於Java開發者而言, 如下的優點:
| 基於applet或swing的解決方案
| 是另外一種可行的解決方案。它有
|
1. 創建基於Java的應用無論對於用戶還是開發者都是免費的?????????????????? |
2. Applets可以通過大部分的瀏覽器進行配置???????????????????????????? |
3. Applets允許用戶創建豐富的用戶界面???????????????????????????????? |
4. 使用Applets讓客戶端分擔了一部分服務器的負載?????????????????????? |
選擇使用基於applets的解決方案也 裝了JRE. 即便安裝了,也不一定是所需
| 必須衡量它的以下不足: 開發者不能確定用戶是否安 要的版本。
|
Applets爲開發者在標 ,開發者可以假定正確的JV
| 準客戶端配置他們的應用提供了 M版本已經安裝
| 很大的選擇餘地。對於標準客戶端
|
除了使用applet/Swing
| 或DHTML應用,開發者還有一個
| 選擇: 第三方解決方案。
|
第三方解決方案: Mecromedia Flash???????????????????????????? |
爲了達到DHTML或applet應用同樣的效果,第三方產品需要具備以下特性:?? |
1. 任何標準瀏覽器都可以使用它?????????????????????????????????????????????? |
2. 應用程序的運行幾乎不需要用戶的干涉?????????????????????????????????????? |
3. 客戶端的運行時間必須是免費或者至少很便宜???????????????????????????????? |
4. 客戶端應當可以與已有的業務邏輯結合在一起???????????????????????????????? |
有一些第三方解決方案在此領域共同 ,和Macromedia的Flash Suite。所有這 們都能應用在基於Web瀏覽器的應用程序 ActiveX和QuickTime,Flash爲Java開發 何J2EE應用服務器上的方法。這就意味着 的業務邏輯可以不作任何改變地被基於Fl
| 競爭,包括Apple的QuickTime, Microsoft的ActiveX 三種解決方案在許多用戶的系統上都得到了使用。它 之中,而用戶不需付出任何代價。然而相比於 者提供了一個重大的助益:它允許客戶端應用調用任 已經存在的EJB, servlets, Web services, 和類中 ash的前端調用。
|
服務器端產品Flash Re Remoting由兩個重要的部分 服務器和客戶端支持。網關 端支持組成爲ActionScript
| moting使得Flash客戶端可以調 組成:用於將本地的Flash對象和 應用在標準的war文件中,可在 (被Flash運行和配置工具所使用
| 用J2EE Server上的方法。Flash 方法映射到Java對象和方法的網關 任何J2EE應用服務器中配置。客戶 的編程語言)增加的功能。
|
要讓Flash Remoting工作,Flash應 (Java對象)的句柄並調用方法。這通過使 子與名爲MX的Web應用中的網關連接,web
| 用必須連接到J2EE Server,獲取它想要利用的服務 用ActionScript庫(NetServices)來做到。如下的例 .xml文件servlet映射如下:
|
<servlet-mapping>???????????????????????????????????????????? |
<servlet-name>Flas
| hGatewayServlet</servlet-na
| me>
|
<url-pattern>/gateway</url-pattern>???????? |
</servlet-mapping>?????????????????????????????????????????? |
//Load the NetServic
| es ActionScript Library
|
#include "NetServices.as"???????????????????????????? |
//Create a connection to the mx
| webapp running on port 80 on the local
|
//machine???????????????????????????????????????????????????????????? |
NetServices.setDefau
| ltGatewayUrl("http://localho
| st/mx/gateway";);
|
//Invoke the createGatewayConnec //functionality
| tion to initialize the Flash Remoting
|
gatewayConnnection = NetServices
| .createGatewayConnection();
|
//Bind the Java Obje
| ct: com.tallan.data.provider
| s.FlashDemo
|
//to a service calle
| d tallanDataService.
|
tallanDataService = gatewayConnn
| ection.getService
|
("com.tallan.data.providers.Flas
| hDemo", this);
|
//Invoke a method ca
| lled getReportData on the se
| rvice named
|
//tallanDataSerevice?????????????????????????????????????? |
tallanDataService.getReportData();?????????? |
如上例子說明了連接到J2EE Server和調用一個方法的過程。?????????????? |
爲了處理實際的工作, 。所有的遠端調用都在異步 加回調函數。只要網關從J2 ,ActionScript函數的函數 getReportData(), 因此Act
| 必須在Flash客戶端和J2EE Serv 方法中調用。爲了支持從服務器 EE服務器上的函數返回值該回調 名必須與被調用的Java方法名一 ionScript回調函數應當命名爲g
| er上的企業資源之間相互傳遞參數 上返回值,必須在Flash客戶端添 函數就被調用。爲了支持函數回調 致。在如下的例子中,方法是 etReportData_result;
|
function getReportData_Result(result)???? |
{???????????????????????????????????????????????????????????????????????????? |
//Print the results
| from the app server to the
|
//debug window?????????????????????????????????????????????????? |
trace(result);?????????????????????????????????????????????????? |
}???????????????????????????????????????????????????????????????????????????? |
所有的方法調用信息, Format(AMF)的格式傳遞。A Object Access Protocol) 函數以更快的速度被調用。 有映射。
| 包括參數和返回值,都在客戶端 MF是二進制信息格式,通過HTTP 的方式傳送。在網絡中,AMF信 Flash Remoting透明地處理Java
| 和服務器端以Action Message 以一種類似於SOAP(Simple 息比SOAP信息要小得多,因而允許 對象和ActionScript對象之間的所
|
使得Flash成爲J2EE前 在全部在客戶機上處理XML ActionScript代碼解析一篇
| 端的一個重要的特性是它的內嵌 解析和DOM(document.nbspObje 應用於2D圖形中的包含x和y座標
| 的XML解析功能。Flash生來就能夠 ct Model)傳遞。如下的 的XML文檔:
|
<graph>???????????????????????????????????????????????????????????????? |
<point>???????????????????????????????????????????????????????????????? |
<xvalue>10</xvalue>???????????????????????????????????????? |
<yvalue>5</yvalue>?????????????????????????????????????????? |
<point>???????????????????????????????????????????????????????????????? |
<point>???????????????????????????????????????????????????????????????? |
<xvalue>20</xvalue>???????????????????????????????????????? |
<yvalue>10</yvalue>???????????????????????????????????????? |
<point>???????????????????????????????????????????????????????????????? |
</graph>?????????????????????????????????????????????????????????????? |
應用服務器上的一個產生圖形文件文檔的類:?????????????????????????????????????? |
public class FlashDemo?????????????????????????????????? |
{???????????????????????????????????????????????????????????????????????????? |
public FlashDemo()?????????????????????????????????????????? |
{???????????????????????????????????????????????????????????????????????????? |
}???????????????????????????????????????????????????????????????????????????? |
public document.nbspgetReportData()???????? |
{???????????????????????????????????????????????????????????????????????????? |
document.nbspdoc =null;???????????????????????????????? |
try???????????????????????????????????????????????????????????????????????? |
{???????????????????????????????????????????????????????????????????????????? |
System.out.println("calling getR
| eportData");
|
document.uilder builder =???????????????????????????? |
document.uilderFact
| ory.newInstance().newdocumen
| t.uilder();
|
doc= builder.newdocument.);???????????????????????? |
//Create a record as the root element???? |
Element element = do
| c.createElement("graph");
|
Element child1=doc.createElement
| ("point");
|
child1.setAttribute(
| "xvalue", "February");
|
child1.setAttribute("yvalue", "20");?????? |
element.insertBefore(child1, null);???????? |
doc.appendChild(element);???????????????????????????? |
這個簡單的類將返回一個文檔對象給Flash客戶端解析; 下面的例子完成解析:?? |
//Parse the XML document.nbspre
| turned by the server,
|
//keeping the result
| s in an array called nodes
|
function parseXML()???????????????????????????????????????? |
{???????????????????????????????????????????????????????????????????????????? |
//Create a new array called nodes???????????? |
nodes = new Array();?????????????????????????????????????? |
//Initialize the nodes array to???????????????? |
//contain all of the reportXML.nodes;
| children of the reportXML d
| ocument.BR> nodes =
|
// childCounter is used as a cou
| nter for the child Nodes
|
childCounter = 0;???????????????????????????????????????????? |
//childNodes will co
| ntain the children of each n
| ode
|
childNodes = new Array();???????????????????????????? |
//XAxisvalue will contain the x-
| axis value to plot
|
xAxisvalue = new Array();???????????????????????????? |
//YAxisvalue will contain the y-
| axis value of the data sets
|
yAxisvalue = new Array();???????????????????????????? |
//Iterate through th
| e first level children of th
| e XML Doc
|
for (j=0; j<=nodes.length; j++)???????????????? |
{???????????????????????????????????????????????????????????????????????????? |
//Check if the node Name is repo
| rt i.e., the data set
|
//belongs to graph?????????????????????????????????????????? |
if (nodes[j].nodeName == "graph")???????????? |
{???????????????????????????????????????????????????????????????????????????? |
//Get the background color of the graph |
bgcolor = "#000000";//snodes[j].
| attributes.bgcolor;
|
//Get the caption of the graph?????????????????? |
caption = nodes[j].attributes.caption;?? |
//Get the x-axis name???????????????????????????????????? |
xaxisname = nodes[j].attributes.
| xaxisname;
|
//Get the y-axis name???????????????????????????????????? |
yaxisname = nodes[j].attributes.
| yaxisname;
|
//Get the min value of the y-axis???????????? |
yaxisminvalue = nodes[j].attribu
| tes.yaxisminvalue;
|
//Get the max value of the y-axis???????????? |
yaxismaxvalue = node
| s[j].attributes.yaxismaxvalu
| e;
|
//Now, we get the childNodes?????????????????????? |
childNodes = nodes[j].nodes;?????????????????????? |
//Iterate through al
| l of the child nodes, pullin
| g out
|
//their x,y values and storing t
| hem in arrays
|
for (k=0; k<=childNodes.length; k++)?????? |
{???????????????????????????????????????????????????????????????????????????? |
//If the node name is Set i.e.,
| a graph data set, then we retrieve
|
//and collect the values?????????????????????????????? |
if (childNodes[k].nodeName == "point")?? |
{???????????????????????????????????????????????????????????????????????????? |
//Increment counter???????????????????????????????????????? |
childCounter= childCounter+1;???????????????????? |
//Get the x-axis name???????????????????????????????????? |
xAxisvalue[childCounter] = child
| Nodes[k].attributes.xvalue;
|
//Get the value???????????????????????????????????????????????? |
yAxisvalue[childCounter] = child
| Nodes[k].attributes.yvalue;
|
}???????????????????????????????????????????????????????????????????????????? |
}???????????????????????????????????????????????????????????????????????????? |
}???????????????????????????????????????????????????????????????????????????? |
}???????????????????????????????????????????????????????????????????????????? |
}???????????????????????????????????????????????????????????????????????????? |
上面的例子簡單地解析了XML文檔並將它存儲在各數組中共以後的應用使用。???????? |
世界上有很多Flash開 。有幾個庫可用來以圖形格 繪製應用服務器產生的XML
| 發者。因而Macromedia的網站上 式繪製數據數組。通過使用這種 文檔,如下圖所示:
| 有很多免費的ActionScript庫可用 方法,可以創建一個簡單的應用來
|
由於Flash在處理豐富的媒體方面的 擴充,構想出一個更全面的圖形應用。這 幾個x-y座標對的XML文檔。將這些數據與 可以以一種令人愉快地方式爲用戶在圖形 應用是不同的,因爲Flash應用程序只須 調用,它允許用戶放大,鑽取, 或者作用 服務器上CPU的佔用率時是非常有用的。 務器端的負載分配給客戶端的能力將愈發 的工作交給客戶端來做,從而將服務器解
| 優越性,你可以很容易地在上面的代碼的基礎上進行 個圖形應用程序可以調用服務器上的方法來產生包含 一些可以自由使用的圖形庫結合在一起,Flash接口 上繪製出這些座標。這個圖形應用與基於HTML的圖形 一次以XML格式得到數據,不用對服務器進行其它的 於未來的數據集。可以證明,這種方法在想要限制對 隨着桌面電腦性能的變得越來越強大,應用程序將服 有用。Flash允許開發者將所有的XML解析和圖形操作 放出來處理其它的請求,以此來達到上述目的。
|
儘管對於J2EE開發者而言前端配置有 DHTML解決方案適合於處理文檔驅動或簡 環境已經安裝了JVM的情況下有一定優勢 有意義。Flash在含有少量腳本的多媒體 Flash客戶端整合進已有的J2EE體系結構
| 多種選擇,但不同的選擇效果是不一樣的。HTML和 單的應用。而Swign/applet方案重量級應用中,配置 。然而,對於有些應用,Flash可能對客戶端環境極 應用中有優勢。利用遠端工具,開發者現在可以將 中。
|
|