JBoss Seam的事件機制 3

2021-08-23 15:43:46 字數 2067 閱讀 5153

jboss seam如何做到松耦合的架構呢?光有具備上下文的元件模型是不夠的。還必須有:

事件模型。事件模型通過事件<-->***模式來構建。採用的方式是象jsf方法繫結一樣的方式實現。

使用注釋和***來縱向切入實現業務邏輯的元件,從而達到松耦合的事件觸發和響應

jboss seam的元件模型本身就是為事件驅動的應用來設計的。這些事件都是通過jsf的表示式語言的方法繫結來對映的。在jboss seam中,事件可以分為:

jsf事件,例如:jsf的按鈕繫結動作

jbpm狀態轉移事件,例如:

jbpm流程或頁面流定義

seam頁面動作,頁面事件發生在我們渲染乙個頁面之前,我們通過在web-inf/pages.xml檔案中配置頁面動作。我們可以為乙個特定的jsf檢視id (view id)設定乙個頁面動作,例如:

我們也可以使用萬用字元為乙個頁面模式設定頁面動作,例如:

如果多個頁面動作匹配當前的頁面檢視的話,那麼所有動作按照最窄到最寬泛的順序依次呼叫

例如上述sayhello1,sayhello2動作都和hello.jsp匹配,那麼在hello.jsp頁面上先呼叫

sayhello1然後呼叫sayhello2。頁面動作可以返回乙個jsf的輸出outcome,如果outcome

不為null的話,seam將使用定義好的規則去導向到乙個檢視。更棒的是page元素中的檢視

view-id可以不是jsp頁面或者facelet頁面,允許我們通過view-id來整合基於動作的struts

或者webwork框架。你可以使用action元素指定多個條件頁面動作(在某種條件下才執行的動作)

例如:seam元件驅動的事件,seam元件之間可以直接通過方法呼叫來相互溝通。有狀態的元件可以實現觀察者模式。雖然如此,seam提供的元件驅動的事件比直接通過方法呼叫更加松耦合。我們來看一下如何設定元件驅動的事件。我們可以在components.xml檔案中設定事件***(觀察者):// 設定事件, observable // 設定***,observer // 設定***,observer

你可能想問事件型別type="hello"是什麼,它只是乙個任意的字串。事件型別將在元件驅動事件的時候使用

(raiseevent)。當事件發生時,在事件中註冊的動作將根據在components.xml檔案中的次序依次呼叫。你可能要問:我如何

在元件中觸發乙個事件呢?基本上,你有兩種選擇:使用內建的元件和通過注釋。下列**在執行helloword的sayhello方法時

觸發事件型別為"hello"的事件(在components.xml檔案中配置):

@name("helloworld")public class helloworld }

@name("helloworld")public class helloworld }

我們看到helloworld的sayhello方法其實是事件的產生者。值得注意的是事件的產生者和事件的消費者

(監聽者)沒有任何依賴性,例如下面的hello***和上述的helloword沒有依賴:

@name("hellolistener") // 在components.xml檔案的hello事件中註冊的監聽者public class hellolistener }

注意:如果你討厭在components.xml檔案配置太多事件和***,那麼你也可以使用注釋來配置:

@name("hellolistener")public class hellolistener }

到這裡你會發現我們根本沒有用事件物件!實際上,事件產生者和事件消費者之間根本不必有事件物件來

處理狀態的問題。狀態問題由seam的上下文處理了,並且在seam元件之間共享!

不過,你要真的想要乙個事件物件,可以象這樣:

@name("helloworld") // 事件產生者public class helloworld }

@name("hellolistener") // 事件監聽者public class hellolistener }

seam具有上下文的事件,seam本身定義了一系列內建的事件。注意這些事件的名稱都是字串定義的:

seam元件可以監聽(觀察)這些事件,就像他們觀察元件驅動的事件一樣。我們將在別的文章中專門講述。

as3事件流機制徹底理解

as3的事件流分三個階段 捕獲階段 目標階段 冒泡階段。如果記不住這三個階段的順序,想象以下捕魚的過程,捕魚也分三個階段 撒網 捕捉,撈起,三個階段從上向下。為什麼要事件流要分三個階段呢?這一切都是因為 顯示列表 沒有顯示列表,也就不會有事件流。在顯示列表中,假設,s 舞台 c 容器 b 按鈕。點選...

C 的事件機制

c 的事件機制是基於委託實現的。實現乙個事件,要先定義乙個委託型別 class1 然後我們可以使用 和 註冊 移除事件 class1.event1 new mydelegate new myeventargs 在class中引發事件時最好這樣 class1 如果不想宣告自己的委託型別的話,可以使用s...

Remoting的事件機制

概念就不說了,具體參見msdn相關章節 我們為主執行緒方法新增事件,能不斷的引發事件來匯報處理的進度 public class myeventargs public myeventargs int rate public class myobject console.writeline 主線程方法結...