unLock方法为什么没执行
2012-11-25 21:58
169 查看
unLock方法为什么没执行
最近我们打算实现在对象的编辑页面时,对对象进行加锁,也就是对象在被一个用户修改时,其他此时就不能再修改该对象了,这样可以保证同一个对象不被两个人同时修改,避免发生先提交的用户数据会被后提交的用户数据覆盖。
实现方案是在页面加载时通过java代码判断是否被其他人锁定,如果被其他人锁定,则给出提示;如果没有锁定,则用户进入对象的编辑页面。当用户在关闭页面触发“window. onUnload”方法时,调用ajax请求去服务器端解锁对象。当然,我们也考虑到ajax请求可能失败,这样会造成对象永久锁定,为了解决这个问题,我们在对一个对象锁定时,最长的锁定时间不能超过20分钟,这样可以在一定程度上避免因为某种情况的出错而造成对象的永久锁定。
这种实现方案在IE浏览器下,执行没有问题,但是在火狐、chrome等其他浏览器上,却会造成没有去通知服务器解锁对象。通过跟踪,发现问题是出现在函数“window. onUnload”的执行上。“window.
onUnload”函数的代码如下:
无论在什么浏览器下,在关闭浏览器时“window. onUnload”函数都会执行。我们知道,浏览器在执行ajax时,ajax对象的返回状态值(readyState)会依次变为1->2->3->4,当ajax的状态值为4时,也就是ajax请求执行完成(complete)。对于“window.
onUnload”函数,在IE浏览器下,无论ajax的返回状态值是几,被ajax请求的页面(也就是object_unlock.jsp)中的system.out输出语句都有值会输出。但是在火狐、chrome等其他浏览器下,通过httpwatch,可以看到ajax请求正常,但是ajax请求的页面(也就是object_unlock.jsp)中的sytem.out输出语句没有输出,后来经过我测试,只有ajax的请求的返回状态码是4时ajax请求的页面(也就是object_unlock.jsp)中的sytem.out输出语句才能输出结果。
至于具体为什么,没有搞明白。本文测试的发送ajax请求是使用jquery.js类库(1.4.4版本)组件发送的。
解决的办法是在关闭浏览器时触发的“window. onUnload”函数中,发送的ajax请求设置为同步就可以了,也就是设置属性“async”为“false”,参见上面代码红色区域。
最近我们打算实现在对象的编辑页面时,对对象进行加锁,也就是对象在被一个用户修改时,其他此时就不能再修改该对象了,这样可以保证同一个对象不被两个人同时修改,避免发生先提交的用户数据会被后提交的用户数据覆盖。
实现方案是在页面加载时通过java代码判断是否被其他人锁定,如果被其他人锁定,则给出提示;如果没有锁定,则用户进入对象的编辑页面。当用户在关闭页面触发“window. onUnload”方法时,调用ajax请求去服务器端解锁对象。当然,我们也考虑到ajax请求可能失败,这样会造成对象永久锁定,为了解决这个问题,我们在对一个对象锁定时,最长的锁定时间不能超过20分钟,这样可以在一定程度上避免因为某种情况的出错而造成对象的永久锁定。
这种实现方案在IE浏览器下,执行没有问题,但是在火狐、chrome等其他浏览器上,却会造成没有去通知服务器解锁对象。通过跟踪,发现问题是出现在函数“window. onUnload”的执行上。“window.
onUnload”函数的代码如下:
function unlockObj(_nObjId, _nObjType){ $.ajax({ type:"post", url:"../include/object_unlock.jsp", async:false,//设置同步请求,没有问题;异步请求,则会有问题 data:{ObjId:_nObjId,ObjType:_nObjType}, success:function(data){ return; }, error:function(data){ return; } }); return; }
无论在什么浏览器下,在关闭浏览器时“window. onUnload”函数都会执行。我们知道,浏览器在执行ajax时,ajax对象的返回状态值(readyState)会依次变为1->2->3->4,当ajax的状态值为4时,也就是ajax请求执行完成(complete)。对于“window.
onUnload”函数,在IE浏览器下,无论ajax的返回状态值是几,被ajax请求的页面(也就是object_unlock.jsp)中的system.out输出语句都有值会输出。但是在火狐、chrome等其他浏览器下,通过httpwatch,可以看到ajax请求正常,但是ajax请求的页面(也就是object_unlock.jsp)中的sytem.out输出语句没有输出,后来经过我测试,只有ajax的请求的返回状态码是4时ajax请求的页面(也就是object_unlock.jsp)中的sytem.out输出语句才能输出结果。
至于具体为什么,没有搞明白。本文测试的发送ajax请求是使用jquery.js类库(1.4.4版本)组件发送的。
解决的办法是在关闭浏览器时触发的“window. onUnload”函数中,发送的ajax请求设置为同步就可以了,也就是设置属性“async”为“false”,参见上面代码红色区域。
相关文章推荐
- 为什么OnDraw()方法没有被执行!郁闷
- 将对象传入方法内然后赋值成null,为什么执行完方法之后,值不是null?
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- 多线程用同一个dao对象就会存在多个线程执行同一方法,为什么不用考虑线程安全问题
- Session_End()这个方法,为什么在会话结束的时候没有执行?
- 为什么struts2 ajax 方法执行两次
- 为什么TableView 的代理方法cellForRowAtIndexPath 不执行问题
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- listview滑动最后终止,没有执行onScrollStateChanged方法,最后停在onScroll,为什么啊
- 多线程执行时为什么调用的是start()方法而不是run()方法
- 为什么我们调用start()方法时会执行run()方法?为什么我们不能直接调用run()方法?他们之间有什么区别?
- Java学习笔记-------执行语句为什么必须要放在方法里面???
- override的方法,为什么会被自动执行?
- 为什么await()后会执行lock.unlock,await()时不就释放锁了吗
- 【内存管理-问题实例】为什么执行了numberOfRowsInSection方法后,dataArray的retainCount就少了一个? 谁把它 release了?
- 自定义View执行invalidate()方法,为什么有时候不会回调onDraw()
- 为什么代理方法没有执行?
- Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
- ios的延迟执行方法
- jdbc连数据库查询问题,isClose()方法为什么报错?