日期:2014-05-17  浏览次数:20760 次

一个jsp页面不刷新不跳转那么它获取到的属性的值都是不变的嘛?
标题的我没有说清楚 我来引入场景
这是我在一个页面写的一个js脚本
JScript code
 function check(){
     alert("appli:"+"${fn:length(applicationScope.message)}");
     if(size!="${fn:length(applicationScope.message)}"){
         showMsg();
         size="${fn:length(applicationScope.message)}";
         alert(size);
     }
 }

然后有个定时器 会每2s执行它一次
setInterval("check()", 2000); 

其实我本来是直接刷showMsg() 通过Ajax来定时更新内容的 后来发现只要过一会儿 浏览器就会死掉(好了 开了三个连接试了下发现还可以的...原来把逻辑写错了 反复注册了定时器)......也许是更新太频繁了...

但是接下去问题也来了

先开始在这个页面 打出的 appli:5 5(这个是打size的)
然后我在其他页面输入一些值 让application里的message属性长度发生变化 在那个页面上打出 appli:6 6
然后我回去看 还有一个页面依旧是 appli:5 5(不是延时造成的 我没一条都看过了 知道又打出来 还是appli:5 5)
这样就无法更新了....

我有个疑问 application是ServletContext的对象 而ServletContext是由request通过get方法取得的 那是不是其实一个页面上的application只是原来取得的即时的application的一个副本而已???....那怎么才能取得真实的引用(是不是不可能?一个页面显示完成之后它的request对象等就销毁了吧 因为是方法中的变量是不是?)

还有有木有能推介讲servlet3.0的一些原理的书之类的 感觉好头疼...........

下面的问题回不回答没关系:
今天下午 在写Ajax的时候 一直没有回应 在想是什么问题 然后一alert状态 发现状态是status=1 readystate=0 一直就这样
弄了一下午 检查也检查过了 一直不行 后来突发奇想 直接把后缀改成html 居然发现好了....从 1 0 到 2 200 3 200 4 200 然后显示出来了。。。顿时觉得很懊恼.......

现在IE9和chrome都不支持alert弹窗嘛? 我js确定是开的 而且阻止弹窗的选项也是关的 用FF一切ok的....

------解决方案--------------------
不要用setInterval,这样会导致出现并发请求,如果网络时延不好(超过2秒未返回),就会积累很多请求。

建议应该是:每次 showMsgCallback() 函数调用完毕后,再用 setTimeout(); 注意处理各种异常情况。



另外,需要提醒的是,最好对网络超时有控制,时间太长没返回,则取消上次Ajax请求,然后重新发起。