首页 新闻 会员 周边

java中如何把后台数据推送到页面上

0
悬赏园豆:10 [待解决问题]

之前的一个项目,情况如下:

页面使用Ajax定时刷新一次,每次刷新就到后台中查询比对,如果数据有变化,则刷新,更新数据,但是没变化得话也会刷新一次,所以这很纠结。。。

 

现在想做成从后台推送的效果:

如果后台数据有变化,就把数据推送到前台,页面数据更新,否则,不变化!

 

Java接触不久,很多东西都是自己摸索着走,希望大伙给点意见,思路,拜谢!

終囿┅兲的主页 終囿┅兲 | 初学一级 | 园豆:192
提问于:2013-05-11 18:56
< >
分享
所有回答(4)
0

http是无状态协议,整个过程仅仅是:请求-响应。是不能推送的,只能客户端不断请求。你Ajax请求做个判断如果没有数据更新,则不更新显示到页面上。

yyutudou | 园豆:997 (小虾三级) | 2013-05-11 19:47
0

最近刚好在写jQuery.ajax()的博文,这个函数能满足你的要求,即服务器数据变更时才进行回发数据并作更新,当然前提是客户端要发出请求,倘若你的请求是自动的那么可以使用javascript中的setInternal设置定时请求函数。对于ajax中你需要使用cache和ifModified函数,当然你不使用jQuery可以自己做封装。。。

 

另外Jquery.ajax()博文还在整理中,我将相关部分先给你看看  (你还可以baidu关键字Last-Modified / If-Modified-Since获取其他信息)

 

2)         ifModified参数:通过ifModified参数提高请求性能(即:“条件GET”:Last-Modified / If-Modified-Since和ETag / If-None-Match)

当你请求的资源并不是一层不变的时候,即不能简单的一直使用客户端缓存时,你可能通过将cache设置为false来发送请求,这实际上是在url加上时间戳组合成新的url去请求资源,这明显加大了服务器的压力。

对于这种情况,我们可以通过ifModified参数改进缓存方式,即仅在请求的数据改变时重新获取,这种改进方式请求的url不会改变,并且每次都会发送到服务器,只是会有检验方法验证是否需要重新获取数据从而节省带宽和开销。

更多ETag描述(优点,解决了Last-Modified无法解决的一些问题,什么场合不应该被使用)

过程如下:

a)      将$.ajax()函数的cache和ifModified参数同时设置为true。

b)      客户端请求服务端A,在服务端加上Last-Modified/ETag响应体一起返回。

c)      客户端缓存接收到的Last-Modified/ETag响应体,并在下一次发生请求A时将缓存的Last-Modified/ETag做为If-Modified-Since/IF-None-Match请求头一起发给服务器。

d)      服务器接收If-Modified-Since/IF-None-Match后,就检验自上次客服端请求之后资源是否有改动

i.       若还未改动则直接返回响应304和一个空的响应体。

ii.      若已改动则重新处理数据,返回最新的请求数据。

e)      保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

    这一过程中,我们只需要做:服务器返回Last-Modified/ETag响应头和检验数据是否失效并采取对应处理方式。其余步骤由jQuery框架的ajax()函数完成。

         服务端关键代码:

         if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"])

             || !String.IsNullOrEmpty(context.Request.Headers["Etag"]))

         {

            if (CheckResourceValidate())  // 检查资源有效性

            {

                 // 如果资源有效,则直接返回304状态码,客户端回去到此状态码后会从缓存中取值。

                 context.Response.StatusCode = 304;

 

                 return;

             }

        }

 

         // 请求数据

         GetServerTimeAfter2Second();

 

         context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(5));

         context.Response.Cache.SetLastModified(DateTime.Now);

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-05-11 21:45
0

http://my.oschina.net/u/2544092/blog/540663

Xiqincai | 园豆:202 (菜鸟二级) | 2015-12-08 15:41
0

我发现最近大家都在说Goeasy不错,专业做web消息实时推送的,我试了一下,发现还真的不错,中英文齐全,服务器稳定,体积小,SDK居然只有11kb,如果你们想试试的话,可以登录https://goeasy.io/去看一下;

maolangong | 园豆:210 (菜鸟二级) | 2016-05-24 17:25

goeasy的免费时间只有一年

支持(0) 反对(0) szm-cnblogs | 园豆:200 (初学一级) | 2017-10-19 15:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册