zk5.0.2与zk3.6.4中事件处理线程配置区别
在zk5以前的版本中,以下配置默认为false,而在zk5以后默认为true(zk.xml文件中)
<system-config>
<disable-event-thread>false</disable-event-thread>
</system-config>
这两种的区别:
disable-event-thread等于false时,启用事件处理线程,等于true时禁用事件处理线程
启用时,zk创建本地事件处理线程,处理弹出模式窗口,当弹出窗口时,等待用户操作,代码停止执行,
用户操作完毕后,继续执行代码
禁用时,zk弹出模式窗口使用servlet线程统一处理,代码执行完毕后,弹出窗口,
例如:
<textbox id="txtUsername"/>
<textbox id="txtPassword"/>
<button label="提交" forward="onLogin"/>
后台代码
private Textbox txtUsername; private Textbox txtPassword; public void onLogin(Event event) { if (StringUtils.isBlank(txtUsername.getText()) || StringUtils.isBlank(txtPassword.getText())) { try { // 1 Messagebox.show("帐户或者密码为空!", "提示", Messagebox.OK, Messagebox.INFORMATION); // 2 System.out.println("事件处理线程:启用时,需点击ok才会执行我,禁用时,立即执行我"); return; } catch (InterruptedException e) { } } System.out.println("#####"); }
当disable-event-thread=false时,启用事件处理线程,代码运行到1处时,弹出窗口,事件处理线程挂起,等待用户操作,当用户点击ok时,继续执行2处代码
当disable-event-thread=true时,禁用事件处理线程,1和2立即顺序执行,并弹出窗口
如3处代码永远不会执行,
if (Messagebox.show("Delete?", "Prompt", Messagebox.YES|Messagebox.NO,
Messagebox.QUESTION) == Messagebox.YES) {
this_never_executes();//3
}
在zk5.0.2中解决办法,给当前窗口注册一个事件监听器。在事件中,使用
event.getData返回的int值与Messagebox.OK
或Messagebox.CANCEL比较判断用户点击的按钮,然后进一步处理
try { Messagebox.show("禁用事件处理线程测试,是或否", "提示", Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, new EventListener() { @Override public void onEvent(Event event) throws Exception { Integer result = (Integer) event.getData(); if (result == Messagebox.OK) { System.out.println("用户选择了yes"); } else { System.out.println("用户选择了no"); } } }); } catch (InterruptedException e) { }
了解更多信息点击 使用Servlet 线程处理事件