鹰翔宇空

学习和生活

BlogJava 首页 新随笔 联系 聚合 管理
  110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

今晚看到jboss seam 的 组件驱动的事件,感觉真是太棒了。从它的中文手册中摘抄如下:

Seam组件可以通过方法间简单的调用相互影响。状态组件甚至实现 Observer/Observable 模式。 但在组件直接调用彼此方法的时候,为了使组件在一个比可能存在的更加松耦合的方式下相互作用,Seam提供了 组件驱动事件。
我们在 components.xml 里指定了事件监听器(观察者)。
<components>
<event type="hello">
<action execute="#{helloListener.sayHelloBack}"/>
<action execute="#{logger.logHello}"/>
</event>
</components>
在这里,event type 是任意的字符串。
事件发生时,该事件已经注册过的动作将按照它们在 components.xml 中出现的顺序被依次调用。 组件如何发起事件?Seam为此提供了一个内置的组件。
@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!");
}
}
注意这个事件产生器没有依赖任何事件消费者。事件监听器现在可以完全不依赖于产生器而实现:
@Name("helloListener")
public class HelloListener {
public void sayHelloBack() {
FacesMessages.instance().add("Hello to you too!");
}
}
上述在 components.xml中定义的方法绑定关心把事件映射到消费者去。 如果你不喜欢 components.xml 文件中的那一套,可以用注解来替代:
@Name("helloListener")
public class HelloListener {
@Observer("hello")
public void sayHelloBack() {
FacesMessages.instance().add("Hello to you too!");
}
}
你可能想知道为什么在这个讨论中没有提到关于任何事件对象的东西。 在Seam中,对事件对象而言,不需要在事件生产者和监听器之间传播状态。 状态保留在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 阅读(1201) 评论(0)  编辑  收藏 所属分类: 技术文摘

只有注册用户登录后才能发表评论。


网站导航: