DWR单向推送

来源:互联网 发布:编程工作怎么样 编辑:程序博客网 时间:2024/06/05 14:40

     最近公司的一个项目的一个功能是涉及到推送这样的一个功能,本人呢就选择了DWR,至于DWR在这里就不用多介绍了,大家可以去百度看一下相关的资料。网上群推送的例子是非常多的 ,但是本人的需求是单向推送的,在网上查了许多资料啊,都没有具体的说法,都是随便给点代码。经过本人研究呢,也写了一个demo,希望可以供大家学习参考。我这里用的DWR3的,低版本的也应该是同样的思路的。

  首先呢 说一下ScriptSession这个东西。ScriptSession当我们访问一个页面的时候,如果是第一次访问,就会创建一个新的HttpSession,之后再访问的时候,就会保持当前的Session,即使是刷新,也能保持当前的HttpSession。但是,ScriptSession不同,第一次访问,会创建一个ScriptSession,但是,如果你刷新,就会创建一个新的ScriptSession.

    第一,我是写了一个页面初始化的方法:setScriptSessionFlag.这个方法是将用户id和页面脚本session绑定,这里呢我的用户id是写死的,这个没什么到时候大家看情况处理就行了。

    public void setScriptSessionFlag(String userId) {
WebContextFactory.get().getScriptSession().setAttribute("userId", userId);
}

第二,推送的方法:addComplain。相关的一写信息我就不多解释了 ,网上可以查的到。

         private List<String> messages = new LinkedList<String>();  //接收信息
public void addComplain(String receiveId, String complain,
HttpServletRequest request) {
System.out.println("有客户请求,消息为:" + complain);
ServletContext context = request.getSession().getServletContext();
ServerContext serverContext = ServerContextFactory.get(context);    //获取上下文
//获取浏览GetMessage.jsp的所有访问者的session
Collection<ScriptSession> sessions = serverContext.getScriptSessionsByPage("/message/GetMessage.jsp");
for (ScriptSession scriptSession : sessions) {
String userId =  (String) scriptSession.getAttribute("userId");         //获取页面的scriptSession id
if(null != receiveId && receiveId.equals(userId)){
messages.add(complain);
Util util = new Util(scriptSession);
util.addFunctionCall("receiveMessages", messages);
}
}
}

第三, 这个是jsp页面

<script type="text/javascript">
   function sendMessage()
   {
    var message=$("message").value;
    sendcom.addComplain("2",message);
   }
   function receiveMessages(messages)
   {
     var chatlog = "";
     for (var data in messages) {
          chatlog = "<div>" + dwr.util.escapeHtml(messages[data]) + "</div>" + chatlog;
     }
      dwr.util.setValue("list", chatlog, { escapeHtml:false });
   }

//初始方法 
   function init(){
   dwr.engine.setActiveReverseAjax(true);   //这个是非常重要的
   sendcom.setScriptSessionFlag("7");
   }
  </script>

</head>
<body onload="init()">
<form method="get" action="GetMessage.jsp">
input message:
<input id="message" type="text"
onkeypress="dwr.util.onReturn(event, sendMessage)" />
<input type="button" value="send" onclick="sendMessage()" />
<br>
<div id="list"></div>
</form>
</body>
</html>

就是这样一个简单的demo,对于其他的配置我就不详说了,因为其他都是dwr的一般配置。