我们在写AJAX的时候,会用定时器定时调用一个action,来检测一些东西。比如EC 2.0中,我们用AJAX技术定时检查用户的消息收件箱,看有没有新的消息,有多少条。但是在实际应用中,我们发现Tomcat会cache我们这个检查 消息类的返回值,也就是说,如果现在检测到有3条新的消息,那么,之后的AJAX调用,无论数据库中的新消息数量是否发生变化了,Tomcat都返回一样 的数据给JSP,也就是3条消息。
这是非常讨厌的一个现象,因为Tomcat认为我们每次请求的都是同一个URL,自然它就cache这个action的返回值了。唯一的办法就是让我们每次AJAX请求的URL都不一样,这样才能消除Tomcat的这种cache行为。
那么,最容易想到的就是在URL后面加上当前时间,因为时间是一直在流逝的,所以,加上时间后,每次的URL就不一样了,就能消除Tomcat的cache行为了。在javascript中,我们是这样做的:
这是非常讨厌的一个现象,因为Tomcat认为我们每次请求的都是同一个URL,自然它就cache这个action的返回值了。唯一的办法就是让我们每次AJAX请求的URL都不一样,这样才能消除Tomcat的这种cache行为。
那么,最容易想到的就是在URL后面加上当前时间,因为时间是一直在流逝的,所以,加上时间后,每次的URL就不一样了,就能消除Tomcat的cache行为了。在javascript中,我们是这样做的:
function
getMsgNotify() {
var dateInstance = new Date();
var url = " <%=webContextRoot%> " + " /toModule.ec?prefix=/portal&page=/GetMsgNotify.ec&counter= " + dateInstance.getTime();
request.open( " GET " , url, true );
request.onreadystatechange = updatePage;
request.send( null );
}
var dateInstance = new Date();
var url = " <%=webContextRoot%> " + " /toModule.ec?prefix=/portal&page=/GetMsgNotify.ec&counter= " + dateInstance.getTime();
request.open( " GET " , url, true );
request.onreadystatechange = updatePage;
request.send( null );
}
这个getMsgNotify这个函数就会被定时调用,这里要注意,var dataInstance = new Date(); 这句代码一定要写在这个被定时调用的方法里面,这样才能保证每次调用这个function的时候,得到的都是当前时间,如果将这句代码放在外面,那么这句 代码就只会被执行一次,自然得到的时间就是最早的那个时间了。注:javascript中,new Date对象的时候不加参数表示返回当前时间。
然后我们就用了getTime这个函数,这个函数返回我们取到的date时间和197x年的那个时间的差值(秒数),这样就保证了每次的URL不一样了。
在此之前,我没用这个方法,我是申明了一个全局变量counter,初始值为0,然后每次getMsgNotify之后,都把这个counter 加1,来达到生成不同URL的目的,但是这样是不行的,因为如果用户不关闭浏览器,那么每一次加载这个页面,counter都从0开始计数,这样就又会发 生当前的URL和上次一样的情况(都是从0开始计数的嘛)!所以,科学的做法还是上面的那种,用时间来生成永不相同的URL。
然后我们就用了getTime这个函数,这个函数返回我们取到的date时间和197x年的那个时间的差值(秒数),这样就保证了每次的URL不一样了。
在此之前,我没用这个方法,我是申明了一个全局变量counter,初始值为0,然后每次getMsgNotify之后,都把这个counter 加1,来达到生成不同URL的目的,但是这样是不行的,因为如果用户不关闭浏览器,那么每一次加载这个页面,counter都从0开始计数,这样就又会发 生当前的URL和上次一样的情况(都是从0开始计数的嘛)!所以,科学的做法还是上面的那种,用时间来生成永不相同的URL。