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
			}
	}
 













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值