Tapestry 5组件事件

来源:互联网 发布:网络高级工程师上课图 编辑:程序博客网 时间:2024/05/01 07:18
本文根据http://tapestry.apache.org/tapestry5/tapestry-core/guide/event.html翻译整理过来,请高手指正,转载请注明出处!
 
本人随后时间将忙于单点登录研究,翻译Tapestry 5的时间不多,稍后章节翻译将会较慢,还望各位继续支持!
 
组件事件
 
组件事件是指组件所察觉到的用户的行为,如点击链接或提交表单。
 
组件主要用于两种用途:
  • 它们呈现了用户在客户端浏览器中触发链接或表单发起的请求。这些在页面导航(page navigation请求处理(requst processing)中有更全面的描述。
  • 它们描绘了一个请求中的控制流即允许一个组件通知它的容器一些情境(一个表单被提交),或者从容器中收集一些片断数据。
通常,一个导航请求(由用户发起)将产生许多控制流请求。如,表单组件被将一个动作请求触发,然后发送通知事件声称表单提交事件将被处理,随后不管成功与否。
 
Tapestry 4中,你可以用一个方法名来配置组件的一个参数,当某一特定事件发生时(通常来自客户端的请求)该方法将被调用。如:
  1. <form jwcid=”@Form” listener=”listener:someMethodName”>  
这有一些局限性,包括事实上仅有一个方法被调用。
 
Tapestry 5引入了通过命名约定或者OnEvent annotation来标识的事件处理方法(event handler methods)。事件处理方法可以有任何的可见性,甚至私有的(通常它们是包可见性的,用以支持测试)。
 
同比于配置组件一个被调用的特定的方法,你可以标识一个或多个方法来监听组件事件。单独的一个事件处理方法可以接收许多不同组件的通知事件,如在事件处理方法上加上@OnEvent(component={"component1", "component2"})
 
比如,这里是一个让用户选择110数字的页面片断(就叫"chooser"):
  1. <p> Choose a number from 1 to 10: </p>  
  2.   
  3. <p>  
  4.     <t:count end="10" value="index">  
  5.         <a t:id="select" t:type="actionlink" context="index">${index}</t:comp>  
  6.     </t:count>  
  7. </p>  
 
ActionLink组件创建一个动作URL
 
URL标识了页面包含的组件("chooser"),事件的类型(除非不是默认且很通常的"action"事件类型),页面里组件的id"select")还有附加的上下文(context)值。
 
一个URL示例:http://localhost:8080/chooser.select/3.
 
当存在附加的上下文值时,它们被追加到路径中。
 
这里示范了Tapestry与传统方式URL的关键区别,它是一个面向动作的框架。这里的URL并不是说链接被点击时发生了什么,而是标识哪个组件来响应。
 
没有从URL到一段代码的简单映射;这里通过调用事件处理方法的形式来替代组件发送通知事件。
 
当组件生成的链接被用户点击时,一个Java方法将会被调用。
  1. @OnEvent(component = "select")   
  2.  void valueChosen(int value)   
  3.  {   
  4.     _value = value;   
  5.  }   
 
Tapestry在此做了两件事:
  • 确认valueChosen()方法作为调用的方法。
  • 将上下文值从字符串转换为整数并传送给事件处理方法。
在上面的实例中,valueChosen()方法将在choose组件产生任何事件时被调用(至少有一个上下文值)。因为ActionLink组件仅产生单个事件类型,即"action",这不会带来任何问题(OnEvent可以配置事件类型)。
 
某些组件能产生多种事件,些时你需要更多的细节参数:
 
 
  1. @OnEvent(value = "action", component = "select")   
  2.  void valueChosen(int value)   
  3.  {   
  4.     _value = value;   
  5. }   
 
 
OnEvent annotationvalue属性用来匹配事件名。
"action"是默认的事件类型名,ActionLink Form组件都使用这个事件类型。如果你省略了OnEvent annotationcomponent参数,它就是收到所有包含组件的通知事件,可能包括内嵌组件(因为事件冒泡机制event bubbling)。
你可以限定接收哪个或哪些组件的事件。
 
事件处理方法命名约定
 
作为使用annotations的一种替代,我们可以以指定的方式命名事件,Tapestry将会调用你的方法,就好像方法被声明了annotation一样。
 
这种事件处理方法的命名方式以前缀"on"开头,紧跟着动作的名字(首字母大写capitalized),然后加上"From" 一个首字母大写的组件id
先前的例子可以写成:
 
  1. void onActionFromSelect(int value)   
  2. {   
  3.    _value = value;
  4. }   
 
如果事件类型命名为"onAny",它将接受所有事件类型,我们很少需要此种方式!
如果出于某些难解的原因我们需要以同一方法接收不同组件的相同事件,我们就需要OnEvent annotation
 
来自Howard的提示:我发现我更喜欢命名约定方式,保留annotation只是为了其他不适合的情况。
 
事件上下文(Event Context
 
上下文值(ActionLink组件的context参数)可以是任何对象,然而,仅发生一个简单的字符串转换。与Tapestry 4相比,他有一个精细的类型机制,怪名叫"DataSqueezer"
 
此外,不管是什么值(string, number, date),它都会被转换为文本字符串。这将形成一个更可读的URL
 
如果带有多个上下文值(通过将一个对象list或数组绑定到ActionLinkcontext参数),则每一个值都将有序地追加到URL中。
 
当一个事件处理方法被调用时,将发生一个强制(coercion)从字符串到实际类型的转换。事件处理方法仅当上下文值的数量至少与方法参数数量一致时被调用,带有过多参数的方法将被跳过。
 
另外,一个事件处理方法还可以带上一个java.lang.Object[]类型的参数。这个参数会接收整个上下文数组。这在上下文不同时间为不同长度时有用处。我们可以使用一个个显式的参数或者单个的Object[]类型的参数。
 
事件冒泡(Event Bubbling
 
事件会冒泡向上传递到层级,直到它被终止。事件在事件处理方法返回一个非null值时终止。
对于页面导航事件,事件处理方法的返回决定了Tapestry将如何呈现响应。
(来自:http://www.javaeye.com/topic/66978)