Tapestry 5组件事件

本文介绍了Tapestry5中的组件事件处理机制,包括事件处理方法的配置、命名约定、事件冒泡等概念,并提供了示例代码。Tapestry5通过事件处理方法和命名约定简化了组件事件的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tapestry 5 组件事件
 
本文根据 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"}) 。
 
比如,这里是一个让用户选择 1 到 10 数字的页面片断(就叫 "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 )值。
 
 
当存在附加的上下文值时,它们被追加到路径中。
 
这里示范了 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 annotation 的 value 属性用来匹配事件名。
"action" 是默认的事件类型名, ActionLink 和 Form 组件都使用这个事件类型。如果你省略了 OnEvent annotation 的 component 参数,它就是收到所有包含组件的通知事件,可能包括内嵌组件(因为事件冒泡机制 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 或数组绑定到 ActionLink 的 context 参数),则每一个值都将有序地追加到 URL 中。
 
当一个事件处理方法被调用时,将发生一个强制( coercion )从字符串到实际类型的转换。事件处理方法仅当上下文值的数量至少与方法参数数量一致时被调用,带有过多参数的方法将被跳过。
 
另外,一个事件处理方法还可以带上一个 java.lang.Object[] 类型的参数。这个参数会接收整个上下文数组。这在上下文不同时间为不同长度时有用处。我们可以使用一个个显式的参数或者单个的 Object[] 类型的参数。
 
事件冒泡( Event Bubbling
 
事件会冒泡向上传递到层级,直到它被终止。事件在事件处理方法返回一个非 null 值时终止。
对于页面导航事件,事件处理方法的返回决定了 Tapestry 将如何呈现响应。
 
基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值