是否有任何基于 Spring 的框架来向网页发送通知。我看过http://www.w3schools.com/html5/tryit.asp?filename=tryhtml5_sse我也在寻找可以支持大多数浏览器的东西。Spring 中是否有任何框架或附加组件可用于服务器端代码的此功能?以及为浏览器支持此功能的任何 jquery 框架?
TIA。
是否有任何基于 Spring 的框架来向网页发送通知。我看过http://www.w3schools.com/html5/tryit.asp?filename=tryhtml5_sse我也在寻找可以支持大多数浏览器的东西。Spring 中是否有任何框架或附加组件可用于服务器端代码的此功能?以及为浏览器支持此功能的任何 jquery 框架?
TIA。
我使用了“长轮询”方法。您基本上向服务器发出 ajax 请求以获取页面加载数据。服务器在响应之前等待直到数据可用。在客户端和服务器上,您可以使请求每 30 秒左右超时一次,以避免服务器上运行的线程过多。客户端只是在超时后重新发出请求。
这个站点很好地介绍了使用 jQuery 进行长轮询。
Spring 并没有任何明确的特性来支持这一点(例如,池化轮询线程)AFAIK,但您可以查看Spring MVC 3.2 中的新异步支持
您可以编写自己的 servlet,如下所示,有关详细信息,请参阅链接。由于这适用于 servlet,因此也可能适用于 spring mvc 控制器。
import java.io.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class sse extends HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)
{
try
{
System.out.println("SSE Demo");
response.setContentType("text/event-stream");
PrintWriter pw = response.getWriter();
int i=0;
while(true)
{
i++;
pw.write("event: server-time\n\n"); //take note of the 2 \n 's, also on the next line.
pw.write("data: "+ i + "\n\n");
System.out.println("Data Sent!!!"+i);
if(i>10)
break;
}
pw.close();
}catch(Exception e){
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
{
doPost(request,response);
}
}
我使用它的方式是使用 javascript 的setInterval()
方法以及 jQuery AJAX 调用来获取通知。在文档准备好时,调用它(在 jsp 中):
setInterval(callMe, 30000)
在 JS 文件中:
function callMe(){
...
$.ajax({
type: "GET",
url: "ajaxNotifications",
success: function(count){
alert( "You have: " + count + "notifications now" );
//stick it to #element or DIV or .class where ever you want.
}
error:function(){
...
}
});
}
最后在 Spring 控制器中:
@RequestMapping(value="/ajaxNotifications", method = RequestMetho.GET)
public @ResponseBody String getMeCount(HttpServletReuest req, HttpServletRespones resp){
//get the desired values from req
...
//fire a reuest via service layer to the database for getting notifs number
...
//Don't forget to return it as a String, be it error or count.
}
我希望这能给你一些想法或帮助其他人寻找这个问题的答案。:)