鷹翔宇空

          學(xué)習(xí)和生活

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

          今晚看到j(luò)boss seam 的 組件驅(qū)動的事件,感覺真是太棒了。從它的中文手冊中摘抄如下:

          Seam組件可以通過方法間簡單的調(diào)用相互影響。狀態(tài)組件甚至實現(xiàn) Observer/Observable 模式。 但在組件直接調(diào)用彼此方法的時候,為了使組件在一個比可能存在的更加松耦合的方式下相互作用,Seam提供了 組件驅(qū)動事件。
          我們在 components.xml 里指定了事件監(jiān)聽器(觀察者)。
          <components>
          <event type="hello">
          <action execute="#{helloListener.sayHelloBack}"/>
          <action execute="#{logger.logHello}"/>
          </event>
          </components>
          在這里,event type 是任意的字符串。
          事件發(fā)生時,該事件已經(jīng)注冊過的動作將按照它們在 components.xml 中出現(xiàn)的順序被依次調(diào)用。 組件如何發(fā)起事件?Seam為此提供了一個內(nèi)置的組件。
          @Name("helloWorld")
          public class HelloWorld {
          public void sayHello() {
          FacesMessages.instance().add("Hello World!");
          Events.instance().raiseEvent("hello");
          }
          }
          或者你可以使用注解。
          @Name("helloWorld")
          public class HelloWorld {
          @RaiseEvent("hello")
          public void sayHello() {
          FacesMessages.instance().add("Hello World!");
          }
          }
          注意這個事件產(chǎn)生器沒有依賴任何事件消費者。事件監(jiān)聽器現(xiàn)在可以完全不依賴于產(chǎn)生器而實現(xiàn):
          @Name("helloListener")
          public class HelloListener {
          public void sayHelloBack() {
          FacesMessages.instance().add("Hello to you too!");
          }
          }
          上述在 components.xml中定義的方法綁定關(guān)心把事件映射到消費者去。 如果你不喜歡 components.xml 文件中的那一套,可以用注解來替代:
          @Name("helloListener")
          public class HelloListener {
          @Observer("hello")
          public void sayHelloBack() {
          FacesMessages.instance().add("Hello to you too!");
          }
          }
          你可能想知道為什么在這個討論中沒有提到關(guān)于任何事件對象的東西。 在Seam中,對事件對象而言,不需要在事件生產(chǎn)者和監(jiān)聽器之間傳播狀態(tài)。 狀態(tài)保留在Seam上下文中,在組件之間共享。然而,如果你真想傳遞事件對象,你可以:
          @Name("helloWorld")
          public class HelloWorld {
          private String name;
          public void sayHello() {
          FacesMessages.instance().add("Hello World, my name is #0.", name);
          Events.instance().raiseEvent("hello", name);
          }
          }
          @Name("helloListener")
          public class HelloListener {
          @Observer("hello")
          public void sayHelloBack(String name) {
          FacesMessages.instance().add("Hello #0!", name);
          }
          }
          posted on 2008-03-25 22:49 TrampEagle 閱讀(1211) 評論(0)  編輯  收藏 所屬分類: 技術(shù)文摘
          主站蜘蛛池模板: 崇礼县| 佛教| 琼结县| 黄骅市| 县级市| 湟源县| 巍山| 塔河县| 铜陵市| 庐江县| 济南市| 宁都县| 清水河县| 德清县| 克东县| 克山县| 文山县| 仙桃市| 延寿县| 陵川县| 新兴县| 福州市| 威远县| 河北区| 南平市| 宁城县| 济阳县| 宁明县| 杭锦旗| 仙居县| 察哈| 天长市| 洪湖市| 温宿县| 南木林县| 财经| 弥勒县| 上饶市| 磴口县| 石屏县| 建始县|