Flex+J2EE 之小記
Jack. Wang 2008-9-10(本待完善...)
wbjeasygo@163.com
由于本人也是初學者(剛看了兩天視頻),所以請高手指點,這里贊下 blog 名叫交口稱贊的兄弟,他在flex 方面是行家,謝謝了。
摘要:最近晚上抽出點時間寫了這篇文章,關于 Flex 開發方面的語言和架構,介紹了大家都熟悉的分層結構,著重介紹視圖層(flex 實現),服務控制層和領域模型層,并按照嚴格分層,高解耦合性并結合 Flex 技術實驗了一個用戶管理小模塊,案例不是目的,重要的是介紹開發思想。本文第一部分介紹 Flex 相關技術以及 ActionStript3.0 語言。第二部分介紹開發實例的開發過程,代碼可以下載,亮點在接口工程。由于本人 flex 經驗不足,在以后的工作中會不斷補充。
關鍵字:Flex, J2EE, 架構
1. Flex 介紹
FLEX,是Rich Internet Applications時代的牛×產物Rich Internet Applications,翻譯成中文為富因特網應用程序。傳統網絡程序的開發是基于頁面的、服務器端數據傳遞的模式,把網絡程序的表示層建立于HTML頁面之上,而HTML是適合于文本的,傳統的基于頁面的系統已經漸漸不能滿足網絡瀏覽者的更高的、全方位的體驗要求了,這就是被Macromedia公司稱之為的“體驗問題”,而富因特網應用程序的出現也就是為了解決這個問題。
Flex最重要的兩個技術要數AS和MXML, MXML 和 HTML 一樣是標記語言,它描述了反映內容與功能的用戶界面。與 HTML 不同的是,MXML 可對表示層邏輯與用戶界面和服務器端數據綁定提供聲明抽象。MXML 可將表示與業務邏輯的問題徹底分開,以實現最大程度地提高開發人員的生產率及應用程序的重復使用率。MXML 的開發基礎是在迭代過程上,這與其他類型的 Web 應用程序文件如 HTML、JSP、ASP是相同的。開發 MXML 應用程序就象打開一個文件編輯器一樣簡單,只要輸入一些標簽、保存文件,然后在 Web 瀏覽器上打開文件 URL 即可。
MXML 文件同時也是普通的 XML 文件,所以可以選擇多種開發環境。可以在簡單文件編輯器、專用 XML 編輯器或是支持文件編輯的集成開發環境 (IDE) 中進行開發。由于 MXML 符合 W3C XML 方案的定義,您也可以使用結構化編輯,如代碼著色和代碼提示。 MXML和HTML間最大區別:前者定義的應用是編譯的SWF文件,執行于FlashPlayer客戶端中。后者是基于頁面技術的應用。因此前者能提供更豐富的、動態的UI。MXML不支持Flash的某些特性,例如:時間軸。但是可以利用Flash設計組件并應用在Flex中。MXML應用可以是一個MXML文件,也可以是多個MXML組成,MXML支持MXML文件形式的自定義組件、ActionScript文件形式的自定義組件以及在Flash中建立的自定義組件。 FLEX試圖通過提供一個程序員們已經熟知的工作流和編程模型,讓程序員比從前更快更簡單地開發動畫及RIA應用。在多層式開發模型中,FLEX應用屬于表現層。FLEX的語言和文件結構也試圖把應用程序的邏輯從設計中分離出來
總之,flex 是未來界面開發的一個好方向,據我了解很多公司都要求員工要學習 flex 技術,可見 flex 受歡迎的程度。
2 .ActionStript3.0 特性介紹
ActionScript 是針對 Adobe Flash Player 運行時環境的編程語言,它在 Flash 內容和應用程序中實現了交互性、數據處理以及其它許多功能,ActionScript 是由 Flash Player 中的 ActionScript 虛擬機 (AVM) 來執行的。ActionScript代碼通常被編譯器編譯成“字節碼格式” ,有點類似 java 的處理和運行機制。變過 C#,Java和javascript程序的朋友,肯定能在 ActionScript 中找到這些語言的影子。
2.1內置命名空間和自定義命名空間
四個內置修飾符:
1 public :對所有代碼可見
2 private: 只對類內部可見
3 internal :只對定義所在的同一包內可見
4 protected :對同一包以及不同包的子類可見
自定義命名空間:
使用關鍵字namespace定義命名空間,聲明屬性和方法時,應用命名空間。
AS 代 碼:
1
2
Namespace testSpace="org.blogjava.jm/testSpace ";
3
testSpace myfunction2():void
{}
4
5
use mySpace2;
6
myfunction2(); //調用使用 use 關鍵字打開命名空間
2.2 Local 變量特點
與java不同的是,在as3中,變量沒有塊級作用域(即兩人大括號中間),如果在一個塊內聲明了一個變量,比如一個for循環內聲明了一個變量,它在該代碼所在整個函數內都是可訪問的
1
function myFunction():void
{
2
for(var i:int=0;i<5:i++)
{
3
var last:int = i;
4
}
5
trace(last); //last 在 for 中定義但可以在 for 塊外面訪問到,個人覺得這樣設計欠妥,盡管很方便。
6
}
2.3 Dynamic 類
Object 類本身就是動態類,當然也可以用 dynamic 關鍵字來聲明一個類,所謂動態就是在運行時可以對類追加屬性和方法。
1
dynamic class Protean
{}
2
var myProtean:Protean = new Protean();
3
myProtean.name = "jack.wang";
4
myProtean.password = 3;
5
trace(myProtean. name , myProtean.password );
2.4 定義函數的兩種方式:函數語句和函數表達式
1
//函數語句聲明
2
Function fun1():void
{}
3
4
//函數表達式聲明
5
var fun2:Function = function():void
{}
6
//函數表達式聲明的函數是不能夠被垃圾回收的,必須顯示的調用 delete 命令。
7
var t:Test = new Test(); //t是動態類Test的一個實例
8
t.funt = function()
{};//把一個函數聲明為t的一個屬性
9
delete t.funt; //刪除剛才新增的函數,我們剛才聲明的函數也被回收了
10
2.5 在as3中也有arguments對象,功能基本上和javascript中的一樣。
arguments 對象是一個數組,其中包括傳遞給函數的所有參數,arguments.length 屬性報告傳遞給函數的參數數量,(避免將 "arguments" 字符串作為參數名,因為它將遮蔽 arguments 對象)
function traceArgArray(x:int):void

{

for (var i:uint = 0; i < arguments.length; i++)
{
trace(arguments[i]);
}
}
traceArgArray(1, 2, 3);
// 輸出:
// 1
// 2
// 3
當然也可以用類似 java 的形式 function traceArgArray(x: int, args)
2.6 在as3中允許定義同名的靜態屬性和實例屬性


1class StaticTest
{
2 static var message:String = "static variable";
3 var message:String = "instance variable"; }
4 var myST:StaticTest = new StaticTest();
5trace(StaticTest.message); // 輸出:靜態變量 trace(myST.message); // 輸出:實例變量
2.7 在as中有一個叫做set和get存取器的東西,類似JavaBean,但又有所不同。

class GetSet
{
private var privateProperty:String;

public function get publicAccess():String
{
return privateProperty;
}

public function set publicAccess(setValue:String):void
{ privateProperty = setValue;
}
}
3 個人實驗介紹
案例是超級簡單的,開發Web 應用的,不管你是基于 J2EE,.net 平臺還是其他的 PHP 等等都很熟悉分層架構,其中五層是最熟悉不過的了,一般分為表示層,控制層,服務層,模型層和數據層,有的公司干脆就把服務層和模型層合并起來和控制層合并在一起,基于分層的開發可以橫向也可以縱向,由于引入 flex 技術,因為并不是所有人都懂得 flex 開發方式,盡管他和傳統的 Swing, SWT,GWT開發很相近 ,不過這樣需求分析時可以構建可演進的原型系統,界面也很 RIA。
人們常提面向接口編程于是經常看到 IUser user=new User();這樣的代碼,似乎就是在用接口,但是 new 的動作還是有依賴,于是人們用一些設計模式比如 Factory, Proxy,反射等等模式,后來又有了更好的依賴注入,似乎很完美了,可人們又陷進了過度設計,其實接口應用比直接用原類要多耗費幾個機械指令 User user=new User(),而且在一個內聚的組件中盡量用對象直接連接,該分開的時候我們去用接口分,接口的目的是為了抽象,抽象的目的是為了解耦。
本開發為了把模型層和服務層完全分開,引入接口工程,也就是單獨開發一個工程來設計接口,這個工程有設計師開發。 用戶接口和工廠接口這兩個類在單獨的工程里開發,以便于模型和服務層同步開發。 在服務層不能對外暴露 IUser 接口,而他也要接受數據,這里用的是 UserVO 對象來封裝數據,服務層不操作模型層的任何實現類,這樣這兩層之間完全解耦,當接口工程和實現完成時候打成 jar 包到 web 工程下 Flex 開發和 HTML開發有很大的不同,客戶端和服務端交互的不是 HTML 而是 XML,所以在服務器端 的 Servlet 就應該輸出 XML 流到客戶端。 最后 Flex 也是一個單獨的工程,通過 HTTPService 和 Web 服務器端交互數據。
下載:我的實驗代碼
其他視頻資料:http://www.tkk7.com/Jack2007/archive/2008/09/05/227125.html
參考文獻
1.http://ezen.javaeye.com/blog/107397
2.http://www.nshen.net/blog/article.asp?id=555
3. http://blog.csdn.net/mozilla/archive/2007/08/23/1756761.aspx
4.http://hi.baidu.com/jlhh/blog/item/225aea197716b77adab4bd7f.html
5.
http://yexin218.javaeye.com/blog/203032
6.
http://yexin218.javaeye.com/blog/203032
7.
http://www.tkk7.com/realsmy/archive/2008/01/17/176054.html
8.
http://daoger.javaeye.com/blog/204694
9.
http://www.tkk7.com/alps/archive/2008/07/23/216940.html
10.http://xy-z487.javaeye.com/blog/238074
11.http://www.pin5i.com/showtopic-19682.html
12. http://goday.blogbus.com/logs/13402716.html
13.
http://www.flashas.net/html/Flex/20070525/1779.html
14. http://www.bluejia.cn/blog/?action=show&id=18
本博客為學習交流用,凡未注明引用的均為本人作品,轉載請注明出處,如有版權問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學習進步。