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 线程处理事件