今晚看到j(luò)boss 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);
}
}