组件事件
组件事件是指组件所察觉到的用户的行为,如点击链接或提交表单。
组件主要用于两种用途:
◆它们呈现了用户在客户端浏览器中触发链接或表单发起的请求。这些在页面导航(page navigation)和请求处理(requst processing)中有更全面的描述。
◆它们描绘了一个请求中的控制流即允许一个组件通知它的容器一些情境(一个表单被提交),或者从容器中收集一些片断数据。
通常,一个导航请求(由用户发起)将产生许多控制流请求。如,表单组件被将一个动作请求触发,然后发送通知事件声称表单提交事件将被处理,随后不管成功与否。
Tapestry 4中,你可以用一个方法名来配置组件的一个参数,当某一特定事件发生时(通常来自客户端的请求)该方法将被调用。如:
﹤form jwcid=”@Form ” listener=”listener:someMethodName”﹥
这有一些局限性,包括事实上仅有一个方法被调用。
Tapestry 5组件事件引入了通过命名约定或者OnEvent annotation来标识的事件处理方法(event handler methods)。事件处理方法可以有任何的可见性,甚至私有的(通常它们是包可见性的,用以支持测试)。
同比于Tapestry 5组件事件配置一个被调用的特定的方法,你可以标识一个或多个方法来监听组件事件。单独的一个事件处理方法可以接收许多不同组件的通知事件,如在事件处理方法上加上@OnEvent(component={"component1", "component2"})。
比如,这里是一个让用户选择1到10数字的页面片断(就叫"chooser"):
﹤p﹥ Choose a number from 1 to 10: ﹤/p﹥
﹤p﹥
﹤t:count end="10" value="index"﹥
﹤a t:id="select" t:type="actionlink" context="index"﹥${index}﹤/t:comp﹥
﹤/t:count﹥
﹤/p﹥
ActionLink组件创建一个动作URL。
URL标识了页面包含的组件("chooser"),事件的类型(除非不是默认且很通常的"action"事件类型),页面里组件的id("select")还有附加的上下文(context)值。
一个URL示例:http://localhost:8080/chooser.select/3.
当存在附加的上下文值时,它们被追加到路径中。
这里示范了Tapestry与传统方式URL的关键区别,它是一个面向动作的框架。这里的URL并不是说链接被点击时发生了什么,而是标识哪个组件来响应。
没有从URL到一段代码的简单映射;这里通过调用事件处理方法的形式来替代Tapestry 5组件事件发送通知事件。当组件生成的链接被用户点击时,一个Java方法将会被调用。
@OnEvent(component = "select")
void valueChosen(int value)
{
_value = value;
}
Tapestry在此做了两件事:
◆确认valueChosen()方法作为调用的方法。
◆将上下文值从字符串转换为整数并传送给事件处理方法。
在上面的实例中,valueChosen()方法将在choose组件产生任何事件时被调用(至少有一个上下文值)。因为ActionLink组件仅产生单个事件类型,即"action",这不会带来任何问题(OnEvent可以配置事件类型)。
某些组件能产生多种事件,些时你需要更多的细节参数:
@OnEvent(value = "action", component = "select")
void valueChosen(int value)
{
_value = value;
}
OnEvent annotation的value属性用来匹配事件名。
"action"是默认的事件类型名,ActionLink 和 Form组件都使用这个事件类型。如果你省略了OnEvent annotation的component参数,它就是收到所有包含组件的通知事件,可能包括内嵌组件(因为事件冒泡机制event bubbling)。
你可以限定接收哪个或哪些组件的事件。