`
sun4love
  • 浏览: 233407 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

zk组件事件调用的顺序

阅读更多

将此文赠送给zk群朋友:易语静人(455938495)                    --zk高级群 Software③China 25891428

 

 

这个特性,我在写博客介绍forward的时候,本来想系统的写一下的,

 

觉得一般情况下大家都不会考虑这么多,就没写,

 

我现在粗略的写一下,如有其它疑问,请在本文评论处提出你的问题,下次浏览博客时我会看到

 

 

a,zk中的forward,onClick是要在服务器端执行的,我称之为服务端事件,即触发zk预定义的js代码,

  该js代码向服务器发送http请求,例如调用服务器端某方法等

 

b,w:onClick是html里的onClick,即普通的事件,我称之为客户端事件,调用的是你写的js代码,

  仅运行于浏览器端, 如果你不主动请求服务器端,  zk不会主动向server发送消息

 

 

zk中事件可以分为4种,

 

 

1,Express事件,即EventListener实现了Express接口的事件

 

2,EventHandler,所谓EventHandler是你在页面上定义的事件

   例如<button onClick="java代码"/>,zk在加载页面解析此处onClick的时候会创建一个Zscript实例

   当你点击触发onClick后,会调用page的解析器,page.interpret(zscript.getLanguage(), zscript.getContent(page, _comp), scope);

   解析执行onClick里的java代码

 

3,普通EventListener

 

4,Component类定义的事件,以on开头的 public void方法 onXXX

 

 

 

 

 

zk中组件事件的处理是由EventProcessor事件处理器处理的,组件事件处理顺序如下:

 

1,Express事件,按照component.addEventListener()添加的顺序调用Express类型EventListener,

 

2,EventHandler

 

3,普通EventListener,按照component.addEventListener()添加的顺序调用

 

4,Component类定义的事件

 

5,注册到组件所属page上的事件监听器,按照page.addEventListener()添加的顺序调用

 

以下是org.zkoss.zk.ui.impl.EventProcessor的相关源码

 

 

private void process0(Scope scope) throws Exception {
		final Page page = getPage();
		if (page == null || !page.isAlive()) {
			String msg = (page == null ? "No page is available in "+_desktop: "Page "+page+" was destroyed");
			if (_desktop.isAlive())
				msg += " (but desktop is alive)";
			else
				msg += " because desktop was destroyed.\n"
				+"It is usually caused by invalidating the native session directly. "
				+"If it is required, please set Attributes.RENEW_NATIVE_SESSION first.";
			log.warning(msg);
		}

		final ExecInfo execinf;
		((ExecutionCtrl)_desktop.getExecution())
			.setExecutionInfo(execinf = new ExecInfo(_event));
		final String evtnm = _event.getName();
		for (Iterator it = _comp.getListenerIterator(evtnm); it.hasNext();) {
		//Note: CollectionsX.comodifiableIterator is used so OK to iterate
			final EventListener el = (EventListener)it.next();
			execinf.update(null, el, null);
			if (el instanceof Express) {
				el.onEvent(_event);
				if (!_event.isPropagatable())
					return; //done
			}
		}
		
		if (page != null && _comp.getDesktop() != null) {
			final ZScript zscript = ((ComponentCtrl)_comp).getEventHandler(evtnm);
			execinf.update(null, null, zscript);
			if (zscript != null) {
				page.interpret(
						zscript.getLanguage(), zscript.getContent(page, _comp), scope);
				if (!_event.isPropagatable())
					return; //done
			}
		}

		for (Iterator it = _comp.getListenerIterator(evtnm); it.hasNext();) {
		//Note: CollectionsX.comodifiableIterator is used so OK to iterate
			final EventListener el = (EventListener)it.next();
			execinf.update(null, el, null);
			if (!(el instanceof Express)) {
				el.onEvent(_event);
				if (!_event.isPropagatable())
					return; //done
			}
		}

		final Method mtd =
			ComponentsCtrl.getEventMethod(_comp.getClass(), evtnm);
		if (mtd != null) {
//			if (log.finerable()) log.finer("Method for event="+evtnm+" comp="+_comp+" method="+mtd);
			execinf.update(mtd, null, null);

			if (mtd.getParameterTypes().length == 0)
				mtd.invoke(_comp, null);
			else
				mtd.invoke(_comp, new Object[] {_event});
			if (!_event.isPropagatable())
				return; //done
		}

		if (page != null)
			for (Iterator it = page.getListenerIterator(evtnm); it.hasNext();) {
			//Note: CollectionsX.comodifiableIterator is used so OK to iterate
				final EventListener el = (EventListener)it.next();
				execinf.update(null, el, null);
				el.onEvent(_event);
				if (!_event.isPropagatable())
					return; //done
			}
	}
 













分享到:
评论

相关推荐

    ZK(AJAX开发工具)开发手册

    ZK不仅仅是一款简单的框架,它还包含了AJAX事件驱动引擎、一套丰富的界面组件以及ZK用户界面开发语言(ZUML),这些特性共同构成了ZK的核心竞争力。 **传统Web应用程序** - 传统Web应用程序通常采用表单提交的方式...

    zk developeguide3.5.pdf

    - **事件监听器的调用顺序**:描述了事件处理的顺序。 - **中断事件处理序列**:介绍了如何提前结束事件处理流程。 - **从事件监听器发送、发布和回显事件**:阐述了不同类型的事件传递方式。 - **发布事件(Post ...

    ZK-bin包文件

    ZK-bin包文件是ZooKeeper的可执行文件集合,包含了运行ZooKeeper服务所需的所有必要组件。在Eclipse环境中部署ZK-bin包,可以方便地进行开发和测试工作。 首先,了解ZooKeeper的核心概念: 1. **节点(Znode)**:...

    dubbo基础使用 包含zk 1.8可用dubbo

    【标题】"dubbo基础使用 包含zk 1.8可用dubbo"涉及的核心技术是Dubbo和ZooKeeper,这两个组件在分布式系统中扮演着重要的角色。Dubbo是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,而ZooKeeper则是一个...

    分布式ID组件1

    它使用Zookeeper生成workId,workId是基于ZooKeeper的顺序Id来生成的,每个应用在使用Leaf-snowflake时,启动时都会在Zookeeper中生成一个顺序Id,相当于一台机器对应一个顺序节点,也就是一个workId。 生成的id...

    ZooKeeper应用场景

    ZooKeeper支持原子的顺序创建节点操作,可以用来生成全局唯一的顺序ID,这对于数据库的主键生成、事件追踪等场景非常有用。 7. 分布式队列 通过ZooKeeper,可以实现同步队列,如FIFO队列,确保消息的顺序处理。 ...

    互联网架构 SOA(Dubbo)+配置中心(ZK)+消息中间件MQ(RocketMq)+高-Foundation.zip

    本压缩包中的"互联网架构 SOA(Dubbo)+配置中心(ZK)+消息中间件MQ(RocketMq)+高-Foundation"提供了一个基于SOA的解决方案,结合了阿里巴巴的Dubbo服务框架、Zookeeper配置中心以及RocketMQ消息中间件。这些组件...

    注册管理(zk基本运用)

    3. **Zookeeper节点类型**:在Zookeeper中,节点分为持久节点(Persistent)、持久顺序节点(Persistent Sequential)、临时节点(Ephemeral)和临时顺序节点(Ephemeral Sequential)。在服务注册中,通常使用临时...

    ZooKeeper 23 道面试题及答案.docx

    2. 客户端调用 createNode 方法在 locker 下创建临时顺序节点,然后调用 exists 方法来检查是否已经存在该节点,如果存在则表示已经有人持有该锁,否则自己创建该节点并持有该锁。 ZooKeeper 的设计理念: 1. 高...

    zookeeper_for_dubbo.7z

    2. **顺序一致性**:全局有序,所有客户端对同一节点的更新操作会按照其发起的顺序完成。 3. **单一视图**:无论客户端连接到哪个Zookeeper服务器,看到的数据都是一致的。 4. **实时性**:在一定时间范围内,...

    ZooKeeper面试题(2020最新版)-重点.pdf

    18. zk 节点宕机如何处理?Zookeeper 集群通过选举机制,当 Leader 节点宕机时,会自动选举新的 Leader,保证服务的连续性。 19. zookeeper 负载均衡和 nginx 负载均衡区别Zookeeper 提供的是分布式协调服务,可以...

    zookeeper 典型使用场景实践 归档.zip

    6. 名字服务:Zookeeper可以作为分布式系统的命名服务,为分布式组件提供全局唯一的ID分配,方便组件间的相互引用和查找。 7. 分布式协调:在分布式任务调度、分布式队列等场景下,Zookeeper可以作为协调者,处理...

    zookeeper-3.4.11.tar.gz

    5. **元数据交换**:服务的接口定义、版本信息等元数据可以通过Zookeeper进行交换,方便服务调用方了解服务详情。 安装Zookeeper-3.4.11步骤如下: 1. 解压`zookeeper-3.4.11.tar.gz`到指定目录。 2. 修改`conf/...

    全面解剖RocketMQ和项目实战-day2-part1.7z

    - 学习ZK配置、安装、启动和监控,以及解决常见问题。 2. **6.springboot集成rocketmq生产者.mp4**: - SpringBoot与RocketMQ的集成简化了开发流程,提供了便利的API和配置方式。 - 创建RocketMQ生产者实例,...

    zookeeper3.4.6安装压缩.zip

    6. **分布式事件通知/协调**:通过ZooKeeper的Watch机制,可以实现实时的事件通知,当ZNode(ZooKeeper的数据节点)发生变化时,相关的客户端会收到通知,从而触发相应的处理逻辑。 ZooKeeper的架构由多个组件构成...

    zookeeper-3.4.8.zip

    1. Dubbo:Dubbo是阿里巴巴的分布式服务框架,它使用Zookeeper作为注册中心,实现服务的发布、发现和调用。 2. Hadoop:Hadoop的HDFS和YARN组件利用Zookeeper进行元数据管理和集群状态监控。 3. Kafka:Kafka使用...

    kafukaAndzookeeper.rar

    ZooKeeper通过提供一致性服务来简化分布式程序的开发,例如提供顺序访问、选举和锁定等。它采用树形的数据结构存储数据,每个节点(称为znode)都可以存储数据,且具有版本号,可以跟踪数据的变化。 在Windows环境...

    zookeeper-3.3.6.tar.gz

    3. 顺序一致性:对于同一客户端的更新操作,Zookeeper保证了它们的顺序执行,即使这些操作是在不同的服务器上完成的。 4. 可靠性:一旦一个更新操作被应用,除非显式地删除,否则它会一直存在。 5. 实时性:...

    zookeeper文件

    1. **命名服务**: Zookeeper可以作为分布式应用的全局命名服务,为分布式组件提供唯一的ID。 2. **配置管理**: 应用可以通过Zookeeper集中管理和共享配置信息,减少因配置更改导致的复杂性。 3. **集群管理**: 它...

Global site tag (gtag.js) - Google Analytics