|
在筆記一中,忘記介紹一下Iteration::two和Cairngorm的背景了。 Iteration::two是一家致力于RIA開發的公司。 詳情請看:http://www.iterationtwo.com/index.html
Macromedia Acquires iteration::two in creation of Macromedia Consulting Europe.
Macromedia acquires iteration::two, an industry-leading software consultancy, to create a European Rich Internet Application consulting organisation based in Edinburgh , Scotland. Cairngorm是Iteration::two的開源項目之一。下載和更新地址是http://www.iterationtwo.com/open_source_cairngorm.html
好,現在繼續開始我的學習筆記: 1. 在Control中有Command.as定義了Command接口,筆記一中FrontController中addCommand的調用添加的Command都必須實現此接口。Command接口只定義一個唯一的需要實現的方法execute(); 這是一個典型的命令模式, 所有后續的命令都實現此接口, 對外統一提供一個單點入口execute(), 其他的人都可以進行調用,但不需要了解命令具體的實現方式.
2. 在Model中定義了ModelLocator接口,ModalLocator是所有數據綁定的接口,也就是說應用中所有需要進行綁定的數據都需要通過此接口進行定位。在實際的應用中需要實現此接口,并提供所有的綁定數據。
3. 在business中定義了兩個類 ServiceLocator和Responder。 ServiceLocator這是偽單例類, 應用開發者用于定義并獲得服務. 之所以是偽單例類, 是因為ServiceLocator是定義在mxml中的, 它需要一個無參數的Public構造函數. 使用中必須定義一個ServiceLocator的子類, 并在其中定義需要的服務.
代碼示例:首先在Services.mxml中進行如下定義:
* <cairngorm:ServiceLocator xmlns:mx="http://www.macromedia.com/2003/mxml"
* xmlns:cairngorm="org.nevis.cairngorm.business.*" >
*
* <mx:RemoteObject id="customerDelegate" source="org.nevis.cairngorm.samples.login.CustomerDelegate"
* result="event.call.resultHandler( event )"
* fault="event.call.faultHandler( event )">
* </mx:RemoteObject>
*
* </cairngorm:ServiceLocator>

在Flex主應用中添加一行: <business:Services id="services" /> 其中business命名空間在應用頭部進行申明 xmlns:business="org.nevis.cairngorm.samples.store.business.*" ServiceLocator使用方法: 在業務代理類(Delegate)中通過如下方式進行調用: * var service = ServiceLocator.getInstance().getService( "customerDelegate" );
在View中,定義了兩個類 ViewLocator和ViewHelper ViewHelper:用于隔離Command命令類和View視圖的具體實現. 為了執行業務功能, Command類需要查詢并更改視圖, 在執行業務邏輯前, 命令類需要從視圖中獲得用戶輸入的數據; 業務邏輯結束后又經常需要更改視圖, 顯示執行結果. 通過將查詢和更改視圖的操作封裝到單獨ViewHelper類中, 命令類完全不需要了解視圖類的任何信息. ViewHelper屬于一種特殊的視圖, 當ViewHelper創建后, 就被注冊到指定的視圖. ViewHelper繼承自MXMLObject, 在重寫的初始化函數(initialized)中, 調用ViewLocator進行注冊, 并指定unload方法的監聽函數unregister, 在unload時, 調用unregister, 使用ViewLocator的取消注冊.
ViewLocator是一個單例類, 用于獲取ViewHelper操作視圖. 命令類需要通過ViewHelper的方法來查詢更改視圖, 而ViewLocator即用于讓命令類取得需要的ViewHelper. 命令類不需要知道ViewHelper的名稱, ViewLocator會返回需要的ViewHelper實例.
現在Cairngorm的基礎框架已經介紹完畢,將在以后繼續介紹如何在實際應用中使用上面提及的基礎框架。
Flex是一個面向服務的框架, 借用了異步完成標記(Asynchronous Completion Token)設計模式, 代碼以異步的方式運行. 此模式將用戶的操作完成信號以及數據以異步的方式返回給用戶, 這種做法的效率比較高, 用戶不需要同步等待運行結果. 可以在服務運行的同時進行其他操作. 使用ACT模式時, 需要將服務返回的動作和數據綁定到一個異步的處理操作. ACT必須在服務調用前進行指定. 服務調用時,用戶可以進行其他操作, 當服務結束, 用戶使用ACT接收響應并進行相應的處理. 當調用HTTP Service, RemoteObject, WebService時, Flex會返回一個數據服務調用(Data Service Call)的實例. 你可以使用 webService.send()返回的調用對象(Call Object)來進行結果處理. 你可以在調用對象中添加信息, 并在結果事件的處理函數中通過event.call得到調用對象.這就是ACT的實現機制. 代碼舉例如下:
 
<mx:HTTPService id="MyService" url=" " result="myHandler(event)" />
 
<mx:Script>
< 
function storeCall()
  {
// Create a variable called call to store the instance
// of the service call that is returned.
var call = MyService.send();
// Add a variable to the call object that is returned.
// You can name this variable whatever you want.
call.marker = "option1";
 
}
// In a result event handler, execute conditional
// logic based on the value of call.marker.
function myHandler(event)
  {
var call = event.call
 if (call.marker == "option1") {
//do option 1
}
else
 
}
]]>
</mx:Script>在調用服務(MyService.send())時, 返回了調用對象 call 可以給調用對象添加信息 call.marker = "option1"; 在服務完成的處理函數中可以使用 event.call 獲得調用對象, 從而獲得信息(call.marker).
Cairngorm是Iteration::two的開源項目, 是使用macromedia Flex的RIA開發的最佳實踐(best-practice)框架. 在Cairngorm基礎上開發RIA, 將會在Iteration::two的專家體系和現有的靈活可維護企業解決方案中達到平衡. Cairngorm本身并不是一個完整的企業應用, 它只是提供了一個開發的骨架, Iteration::two稱之為體系. 在這個體系中包括以下幾個部分: 1. Business(業務邏輯部分) 2. Command(命令部分) 3. Control(控制部分) 4. Model(數據模型) 5. View(界面視圖) 6. VO(ValueObject)
我們從Control說起: 在Control中, 定義了3個基類: Event, EventBroadcaster, FrontController. Event用于在應用不同的層之間傳遞事件, 并攜帶事件的數據. 包含type和data兩個成員. type存放一個區別不同事件的名稱,將會在FrontController中進行注冊. 而在命令(Command)類中, 會對事件進行響應.
EventBroadcaster是一個單例類(singleton), 用于廣播用戶動作對應的事件. 使用方法: EventBroadcaster.getInstance().broadcastEvent( ... )
FrontController稍微復雜一點點. 用于將特定的用戶動作分發到指定的命令類. FrontConroller是請求處理的核心類. 整個體系中遍布的EventBroadcaster.getInstance().broadcastEvent( ... )這樣的調用, 都是用來通知監聽控制器: 用戶發出了請求. 在實際應用中, 開發者應該生成一個FrontContoller的子類, 并在構造函數中調用addCommand()注冊預期事件的處理命令. FrontController的具體實現類應該創建一次而且只能創建一次. 通常的做法是這樣的: 在主應用中, 將FrontController的子類作為一個Tag進行申明, * <p> * <code> * <mx:Application xmlns:control="com.domain.project.control.LoginController" ... > * * <control:LoginController id="controller" /> * * ... * * </code> * </p> FrontController的處理實質上是這樣的, 在調用addCommamd時, 將處理命令保存在數組中, 將與之對應的事件處理對象注冊為FrontController本身, 在事件觸發, 調用FrontController的handleEvent時, 調用executeCommand, 在executeCommand中, 先在數組查找出事件對應的命令, 調用命令的execute方法. 這就要求所有的命令都實現Command接口
(內容較多, 未完待續)
摘要: 在Java5.0中對于RMI的使用發生了一些改變, 使得RMI的使用更加容易方便.一. 定義RMI接口, 這一步最簡單, 與以前相比, 也沒有變化.
import java.rmi.Remote;import java.rmi.RemoteException;public interface Payment extends Remote... 閱讀全文
一. 事件簡介 事件可以由外設觸發, 比如:鍵盤,鼠標, 也可能是外部輸入, 比如:web service的返回. 事件還能由組件的外觀和生命周期發生變化時觸發, 比如:組件的創建或者改變大小. 所有用戶與應用交互都會產生事件.用戶沒有直接與應用交互也可能產生事件, 比如:數據裝載完畢. 你可以在程序中使用事件監聽器監聽這些事件. 事件監聽器是函數方法用于響應指定的事件. 有時也稱之為事件處理器. Flex的事件模型基于DOM3事件模型. 組件產生派發事件并消費(監聽)其他事件.如果一個對象想要了解其他對象事件的信息, 可以注冊一個監聽器. 當事件發生時,對象派發此事件到所有注冊過的監聽器中. 組件有Flex提供的內建事件. 也可以使用派發-監聽模型定義自己的事件監聽器, 并指定監聽器監聽何種事件. 二. 事件流簡介 當一個事件被派發出來時, 事件對象從根節點開始自上而下開始掃描display list, 一直到目標對象, 檢查每個節點是否有相應的監聽器. 目標對象指的是display list中產生事件的對象. 比如: <mx:Panel> <mx:HBox> <mx:VBox> <mx:Button /> </mx:VBox> </mx:HBox> </mx:Panel> 如何此時 resize了VBox, 則會從根(Application)開始, 下來檢查Panel, HBox, 直到目標對象-產生resize事件的VBox為止.
三. 事件的派發 Flex中可以通過dispatchEvent()方法手工派發事件, 所有UIComponent的子類都可以調用此方法. 語法: objectInstance.dispatchEvent(new Event("event_type"):Boolean 參數event_type是Event對象的type屬性. 函數的返回值總是True. 可以使用此方法派發任意事件, 而不僅僅是用戶自定義事件, 比如: 可以派發一個Button的Click事件. var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK));
在Flex應用中不是必須對新派發的事件進行處理, 如果觸發了一個事件, 而沒有對應的Listener時,Flex忽略此事件. 如果想給Event對象添加新屬性, 就必須繼承Event類,然后定義新屬性
四.事件的傳播: 事件觸發后, Flex有3個檢測事件監聽器的階段, 3個階段的發生的順序如下: 1. 捕獲 2. 目標 3. 上浮 在任意一個階段, 節點們都有機會操作事件. 比如: 用戶點擊了一個在VBox中的Button, 在捕獲階段, Flex檢查Application對象(根節點)和VBox是否有監聽器處理此事件. Flex然后在目標階段觸發按鈕的監聽器. 在上浮階段, VBox和應用以與捕獲階段相反的順序再次獲得機會處理事件. 在ActionScript3.0中,你可以在任意目標節點上注冊事件監聽器. 但是部分事件會被直接傳給目標節點,比如Socket類. 捕獲階段的節點順序是從父節點到子節點的, 而上浮階段剛好相反. 捕獲事件缺省是關閉的,也就是說如果要捕獲事件, 必須顯式指定在捕獲階段進行處理. 每一個Event都有target和currentTarget屬性, 幫助跟蹤事件傳播的過程.
捕獲階段: 在捕獲階段,Flex在顯示列表中檢查事件的祖先是否注冊了事件的監聽器. Flex從根節點開始順序而下. 大多數情況中, 根節點是Application對象. 同時, Flex改變事件的currentTarget值. 缺省情況下, 在此階段,沒有容器監聽事件. use_capture參數的值是False,在此階段添加監聽的唯一方法是在調用add_listener時, 傳入一個為True值的use_capture參數, 比如: myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true); 如果是在Mxml中添加監聽, Flex設置此參數為False, 沒有辦法進行修改. 如果設置了use_capture為True, 那么事件將不會上浮. 如果既想捕獲又想上浮就必須調用 addEventListener兩次. 一次use_capture參數為true, 一次為false; 捕獲很少使用, 上浮的使用更為普遍.
目標階段: 在目標階段, Flex激發事件的監聽程序, 不檢查其他的節點.
上浮階段: 事件只在bubbles屬性為True時才進行上浮. 可以上浮的事件包括: change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp. 在上浮階段, Flex改變事件的currentTarget屬性, 而target屬性是初始派發事件的對象.
查詢事件階段: 使用事件的eventPhase可以獲得事件當前的階段, 1: CAPTURE_PHASE 2: AT_TARGET 3: BUBBLING_PHASE 示例: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); }
停止傳播: 使用下面兩個函數停止事件的傳播: stopPropagation() stopImmediatePropagation()
表單認證是Asp.net中最Cool的功能之一,一般來說應用都會要求輸入認證信息(典型的是用戶名和密碼)。 在Web.config的設置項中,可以指定登錄頁面和哪些資源需要保護。當用戶第一次訪問被保存的資源時,應用會自動定向到指定的登錄頁面。 如果成功登錄,ASP.NET會轉到用戶初始請求的頁面。 以往的應用需要在每個頁面的頂部判斷用戶是否成功登錄,手工定向到登錄頁面,而現在這個工作由表單認證簡單地完成了。
舉個簡單的例子來說明開發過程: 一個應用中有兩個頁面PublicPage.aspx是向公眾開放的,PrivatePage.aspx只允許登錄用戶才能訪問。 第3個頁面是登錄頁面,要求輸入用戶名和密碼。 步驟如下: 1、把PublicPage.aspx, login.aspx, web.config拷貝到一個IIS的虛擬目錄下。 2、創建一個子目錄Secret,將PrivatePage.aspx, web.config拷貝到子目錄中。 3、在web.config中添加以下代碼, 實現訪問保存頁面自動跳轉登錄頁面的功能 <authentication mode="Forms"> <forms loginUrl="LoginPage.aspx"> .... </forms> </authentication> 4、另外有一個<credentials>小節列出合法用戶和密碼 <credentials passwordFormat="Clear"> <user name="Jeff" password="imbatman" /> <user name="John" password="redrover" /> <user name="Bob" password="mxyzptlk" /> <user name="Alice" password="nomalice" /> <user name="Mary" password="contrary" /> </credentials> 此例子中關掉了的加密選項,缺省是開的。 5、在Secret子目錄的web.config中添加以下代碼,實現保護功能。 <authorization> <deny users="?" /> </authorization> 這是用于通知權限管理模塊System.Web.Security.UrlAuthorizationModule阻止未登錄用戶的訪問。"?"代表匿名用戶,也可以說是未登錄用戶。 實際的權限驗證是由Login.aspx完成的。下列語句 if(FormsAuthentication.Authenticate(UserName.Text,Password.Text)) 把用戶名和密碼傳給System.Web.Security.FormsAuthentication,如果驗證成功,返回True。并且執行頁面跳轉語句 FormsAuthentication.RedirectFromLoginPage(UserName.Text,false);
6、真實環境的表單認證比上面的例子要復雜的多,真實應用不大可能把用戶和密碼保存在文本文件中,比較常見的是存放在數據庫中。 假定用戶表Users有3個字段UserName, password, Role. 對于這種情況,我們需要在剛才的基礎上進行2個地方的修改:Login.aspx、web.config(根目錄下的) 在web.config中不再需要<credentials>小節了。 login.aspx也不再使用 FormsAuthentication.Authenticate 來驗證密碼,而使用CustomAuthenticate替代。 在這個方法中使用Sql查詢語句來判斷用戶是否合法。
Flex2.0不再僅僅是Web應用或者顯示服務器。它是一個框架。
你不再需要象Flex1.5那樣需要一個Server,不需要在瀏覽器的URL中輸入mxml后綴的請求來查看。可以直接把SWF文件放到Web目錄下即可。這一句話是重點啊。
這意味著什么呢? Flex開始免費了!! 因為Flex將免費發布Flex SDK,即可以免費將mxml編譯生成swf 在Flex2.0不需要再象1.5那樣需要Flex的Server了。
Don't think of Flex as a web application or a presentation server any more. It isn't. Flex 2 is a lot more. And the heart of Flex 2 is the framework. Flex Framework 2, as it's officially called, is a programming model, a set of components and class libraries that make building Rich Internet Applications easy. This framework is included with the all new Eclipse-based Flex Builder 2 IDE. There is still a server component in the Flex 2 product line, Flex Enterprise Services 2, but its capabilities are focused around messaging and enterprise data services.
You read that right. With Flex 2 you won’t need to purchase a server to build applications that use Flex Framework. This might take a little getting used to, because you've been putting MXML files into a web directory and requesting them with a browser to see how they run. Well, you don't need to do that anymore. What you do now is either run them from within Flex Builder 2 or use the command-line compiler mxmlc.
The end result is a SWF file that you deploy inside your favorite web server.
修改分為以下幾個部分: 一.使用方法上2.0與1.5是不同的, 比如: Application.alert() 修改為 Alert.show() 二.增加了存取限制符, 即public, private, ... 更加強化了OO的概念 三.添加了類型限定. 所有的變量,屬性,方法,返回值都必須指定類型, 在1.5中: var s = "page"; 是可以的, 但是在2.0中必須寫成: public var s:String = "page"; 四.事件的修改 派發自定義事件時必須new Event而不是使用通用對象, 比如: click="dispatchEvent(new Event('checkOut'))" 監聽器不再需要Delegate了, 1.5中 b1.addEventListener(“click”, mx.utils.Delegate.create(this,myListener)); 在2.0中可以改為:b1.addEventListener(MouseEvent.CLICK, myListener); 五. 所有的ActionScript組件都要封裝到package中, 可以使用匿名package, 但是package語句必須是組件定義文件的第一行. package { public class MyClass { // Class definition } } // Close package 六. RemoteObject在2.0中不能繼續使用了. 七. 圖形組件, 在2.0中如果要使用圖形,必須下載單獨的swc
八. ActionScript由2.0升級為3.0 九. Flex Framework進行了升級修改, 部分類被新類所代替, 比如:MediaDisplay被VideoDisplay取代.
<%@ page session="true" %>
<%@ taglib uri="FlexTagLib" prefix="mm" %>
<%
Integer num = new Integer(22100);
session.putValue("num",num);
%>
<html><body>
<h3>Introduction</h3>
<p>This is an example of writing MXML in a JSP.</p>
<h3>My App</h3>
<mm:mxml border="1">
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml" creationComplete="myService.send();">
<mx:HTTPService url="test.jsp;jsessionid=<%=session.getId()%>" id="myService"/>
<mx:Label text="<%= session.getAttribute("num") %>"/>
<mx:Label text="<%= session.getId() %>"/>
</mx:Application>
</mm:mxml><br>
</body>
</html>

I've been looking at sending and receiving data asyncronously using Flex's HTTPService and native Flash data loading capabilities. One thing that tripped me up with that xml.load() was an asyscronous data call -- which means you cannot use the result/return object until it is completly loaded. One way around this is to use the AS delegate to invoke a function which uses the result. Below is some code.
http://www.macromedia.com/2003/mxml">
function LoadRequest() { var myXML = new XML(); myXML.ignoreWhite = true; myXML.load ("tree.xml"); myXML.onLoad = mx.utils.Delegate.create(this, function() { myService.send(myXML) }); }
function ProcResult(event) { txtDebug.text = event.result; }
function ProcFault(errorString, code) { txtIssuerList.text = errorString + " " + code ; }
http://localhost:8700/flex/servlet/test.MyServletPrintln" contentType="application/xml" method="post" id="myService" fault="ProcFault(event.fault.faultstring, event.fault.faultcode)" result="ProcResult(event)">
<destination id="SampleEmployeeRO"> <properties> <source>samples.explorer.EmployeeManager</source> <stateful>true</stateful> </properties> <adapter ref="java-object" > </destination>
Remoting Object一共有兩個屬性:source和stateful 其中stateful是用于設置Flex創建目的對象實例方法的布爾量 如果設置為True,則在此Session中只創建唯一的一個實例。否則,每次調用都創建一個新的對象實例。 默認值是False;
|