程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 評點Flex結合J2EE的開發與架構

評點Flex結合J2EE的開發與架構

編輯:關於JAVA

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 內置命名空間和自定義命名空間

四個內置修飾符:

1public :對所有代碼可見

2

3private: 只對類內部可見

4

5internal :只對定義所在的同一包內可見

6

7protected :對同一包以及不同包的子類可見

8

自定義命名空間:使用關鍵字namespace定義命名空間,聲明屬性和方法時,應用命名空間。

AS 代碼:

1Namespace testSpace="org.blogJava.jm/ testSpace ";

2

3testSpace myfunction2():void{}

4

5 調用使用 use 關鍵字打開命名空間

6

7use mySpace2;

8

9myfunction2();

2.2 Local 變量特點

與Java不同的是,在as3中,變量沒有塊級作用域(即兩人大括號中間),如果在一個塊內聲明了一個變量,比如一個for循環內聲明了一個變量,它在該代碼所在整個函數內都是可訪問的。

1function myFunction():void{

2

3 for(var i:int=0;i<5:i++){

4

5 var last:int = i;

6

7 }

8

9 trace(last);

10

11}

12

last 在 for 中定義但可以在 for 塊外面訪問到,個人覺得這樣設計欠妥,盡管很方便。

2.3 Dynamic 類

Object 類本身就是動態類,當然也可以用 dynamic 關鍵字來聲明一個類,所謂動態就是在運行時可以對類追加屬性和方法。

1dynamic class Protean{}

2

3 var myProtean:Protean = new Protean();

4

5myProtean.name = "jack.wang";

6

7myProtean.passWord = 3;

8

9trace(myProtean. name , myProtean. passWord );

10

2.4 定義函數的兩種方式:函數語句和函數表達式

1 //函數語句聲明

2

3Function fun1():void{}

4

5 //函數表達式聲明

6

7var fun2:Function = function():void{}

8

9函數表達式聲明的函數是不能夠被垃圾回收的,必須顯示的調用 delete 命令。

10

11var t:Test = new Test(); //t是動態類Test的一個實例

12

13t.funt = function(){};//把一個函數聲明為t的一個屬性

14

15delete t.funt; //刪除剛才新增的函數,我們剛才聲明的函數也被回收了

16

2.5 在as3中也有arguments對象,功能基本上和Javascript中的一樣。

arguments 對象是一個數組,其中包括傳遞給函數的所有參數,arguments.length 屬性報告傳遞給函數的參數數量,(避免將 "arguments" 字符串作為參數名,因為它將遮蔽 arguments 對象)

1 function traceArgArray(x:int):void

2

3{

4

5 for (var i:uint = 0; i < arguments.length; i++)

6

7 {

8

9 trace(arguments[i]);

10

11 }

12

13}

14

15traceArgArray(1, 2, 3);

16

17// 輸出:

18

19// 1

20

21// 2

22

23// 3

24

當然也可以用類似 Java 的形式

function traceArgArray(x: int, args)

2.6 在as3中允許定義同名的靜態屬性和實例屬性

1class StaticTest

2

3{

4

5 static var message:String = "static variable";

6

7 var message:String = "instance variable";

8

9}

10

11// 在腳本中

12

13var myST:StaticTest = new StaticTest();

14

15trace(StaticTest.message); // 輸出:靜態變量

16

17trace(myST.message); // 輸出:實例變量

18

2.7 在as中有一個叫做set和get存取器的東西,類似JavaBean,但又有所不同。

class GetSe

t{

private var privateProperty:String;

public function get publicAccess():String

{

return privateProperty;

}

public function set publicAccess(setValue:String):void

{

privateProperty = setValue;

}

}

3 案例介紹

案例是超級簡單的,開發Web 應用的,不管你是基於 J2EE(J2EE培訓 ),.Net 平台還是其他的 PHP 等等都很熟悉分層架構,其中五層是最熟悉不過的了,一般分為表示層,控制層,服務層,模型層和數據層,有的公司干脆就把服務層和模型層合並起來和控制層合並在一起,基於分層的開發可以橫向也可以縱向,由於引入 flex 技術,因為並不是所有人都懂得 flex 開發方式,盡管他和傳統的 Swing, SWT,GWT開發很相近 ,不過這樣需求分析時可以構建可演進的原型系統,界面也很 RIA。

人們常提面向接口編程於是經常看到 IUser user=new User();這樣的代碼,似乎就是在用接口,但是 new 的動作還是有依賴,於是人們用一些設計模式比如 Factory, Proxy,反射等等模式,後來又有了更好的依賴注入,似乎很完美了,可人們又陷進了過度設計,其實接口應用比直接用原類要多耗費幾個機械指令 User user=new User(),而且在一個內聚的組件中盡量用對象直接連接,該分開的時候我們去用接口分,接口的目的是為了抽象,抽象的目的是為了解耦。

本開發為了把模型層和服務層完全分開,引入接口工程,也就是單獨開發一個工程來設計接口,這個工程有設計師開發。

用戶接口:

package org.blogJava.model;

/** *//**

*@authorJack

*

*/

publicinterface IUser {

long getId();

void setId(long id);

void setUserName(String name);

String getUserName();

void setPassword(String passWord);

String getPassWord();

void setEmail(String email);

String getEmail();

void setAddress(String address);

String getAddress();

}

工廠接口:

package org.blogJava.dao;

import Java.util.List;

import org.blogJava.model.IUser;

import org.blogJava.util.InstanceUtils;

import org.blogJava.util.PropertIEsUtils;

/** *//**

*@authorJack

*

*/

publicinterface DAOFactory {

publicfinal String IMPL_NAME = PropertIEsUtils.getParam(

"/DaoFactoryImpl.propertIEs", "DAOFactoryImpl");

publicfinal DAOFactory factory = (DAOFactory) InstanceUtils

.newInstance(IMPL_NAME);

boolean checkUserValid(String userName, String passWord);

IUser getUserById(String id);

IUser createUser(IUser user);

boolean deleteUserById(String id);

boolean updateUser(IUser user);

List getAllUsers();

}

這兩個類在單獨的工程裡開發,以便於模型和服務層同步開發。

在服務層不能對外暴露 IUser 接口,而他也要接受數據,這裡用的是 UserVO 對象來封裝數據,服務層不操作模型層的任何實現類,這樣這兩層之間完全解耦。

package org.blogJava.vo;

/** *//**

*@authorJack

*

*/

publicclass UserVO {

publiclongid;

public String userName;

public String passWord;

public String email;

public String address;

public UserVO() {

}

}

Flex 開發和 HTML開發有很大的不同,客戶端和服務端交互的不是 Html 而是 XML,所以在服務器端的 Servlet 就應該輸出 XML 流到客戶端

判斷登錄:

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

String userName = request.getParameter("userName");

String password = request.getParameter("passWord");

String sucess = "sucess";

String unsucess = "unsucess";

response.setContentType("text/XML");

try {

if (userName == null || "".equals(userName)) {

response.getOutputStream().write(unsucess.getBytes());

returnnull;

}

if (password == null || "".equals(passWord)) {

response.getOutputStream().write(unsucess.getBytes());

returnnull;

}

IUserService service = new IUserServiceImpl();

if (service.isUserValid(userName, passWord)) {

response.getOutputStream().write(sucess.getBytes());

} else {

response.getOutputStream().write(unsucess.getBytes());

}

} catch (IOException e) {

e.printStackTrace();

}

returnnull;

}

得到所有的用戶:

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

IUserService service = new IUserServiceImpl();

List users = service.getAllUsers();

try {

StringBuffer returnStr = new StringBuffer(

"");

returnStr.append("");

for (UserVO user : users) {

returnStr.append("");

returnStr.append("" + user.id + "");

returnStr.append("" + user.userName + "");

returnStr.append("" + user.passWord + "");

returnStr.append("" + user.email + "");

returnStr.append("

" + user.address + "

");

returnStr.append("");

}

returnStr.append("");

response.getOutputStream().write(returnStr.toString().getBytes());

System.out.println(returnStr.toString());

} catch (IOException e) {

e.printStackTrace();

}

returnnull;

}

最後 Flex 也是一個單獨的工程,通過 HTTPService 和 Web 服務器端交互數據

showBusyCursor="true"

id="loginSrv"

result="doResult();"

method="GET"

url="http://localhost:8080/UserManager/checkUser.do">

{txtname.text}

{txtpwd.text}

showBusyCursor="true"

id="loadUsers"

method="GET" result="users = event.result.users.user"

url="http://localhost:8080/UserManager/loadAllUsers.do">

import mx.controls.Alert;

import mx.utils.ObjectUtil;

import mx.collections.ArrayCollection;

[Bindable]

var users:ArrayCollection=new ArrayCollection();

internal function doResult():void

{

var returnValue:String=loginSrv.lastResult.result.msg;

if(returnValue=="sucess")

{

login.visible=false;

loadUsers.send();

userList.visible=true;

}

else

{

Alert.show("登錄失敗","提示信息",Alert.OK,this,null,null,Alert.YES);

}

}

private function index_sortCompareFunc(itemA:Object, itemB:Object):int {

// Make sure itemA has an "index" property.

if (!itemA.hasOwnProperty("id")) {

itemA.index = null;

}

// Make sure itemB has an "index" property.

if (!itemB.hasOwnProperty("id")) {

itemB.index = null;

}

// Perform a numeric sort.

return ObjectUtil.numericCompare(itemA.index, itemB.index);

}

]]>

4 小結

在寫這篇文章的時候已經是深夜了,可能有很多地方表述有問題,也可能有的思想沒有表述清楚,歡迎大家討論,就先寫到這裡,有時間我會繼續補上一些內容。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved