研究了一天半,终于模拟出了这个功能,网上DWR的资料不少,但是真正实现客户端向服务器端精确推送消息的只有两篇文章。但是代码都只有一部分,向我这种刚开始学习DWR的人来说要看懂真的蛮难。不过即便如此,http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人。只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始:
第一、在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下:
<servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class> org.directwebremoting.servlet.DwrServlet </servlet-class> <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>allowScriptTagRemoting</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>classes</param-name> <param-value>java.lang.Object</param-value> </init-param> <init-param> <param-name>activeReverseAjaxEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>initApplicationScopeCreatorsAtStartup</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>maxWaitAfterWrite</param-name> <param-value>3000</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>logLevel</param-name> <param-value>WARN</param-value> </init-param> </servlet>
第二:在web.xml的同级目录下新建dwr.xml文件,内容如下
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"> <dwr> <alow> <create creator="new" javascript="MessagePush"> <param name="class" value="com.huatech.messageremind.service.MessagePush"/> </create> <create creator="new" javascript="TestPush"> <param name="class" value="com.huatech.messageremind.service.Test"/> </create> </alow> </dwr>
这个是dwr的基本配置,MessagePush在页面的javascript中使用,这个是对被推送页面开放的java类,Test是对推送页面开放的java类。场景:管理员后台登陆,发布一条消息,通过Test推送到后台,后台通过MessagePush推送给指定的用户,当然,至于怎么找到指定的用户,下面会说。
第三,被推送的页面代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>DWR DEMO</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <script type='text/javascript' src='dwr/engine.js'></script> <script type='text/javascript' src='dwr/util.js'></script> <script type="text/javascript" src="dwr/interface/MessagePush.js"></script> <script type="text/javascript"> //通过该方法与后台交互,确保推送时能找到指定用户 function onPageLoad(){ var userId = '${userinfo.humanid}'; MessagePush.onPageLoad(userId); } //推送信息 function showMessage(autoMessage){ alert(autoMessage); } </script> <body onload="onPageLoad();dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);;"> This is my DWR DEOM page. <hr> <br> <div id="DemoDiv">demo</div> </body> </html>
以上代码的简单解释:
页面页面onload的3个函数都是必须的,后两个是dwr的,第一个是将登录用户的userid与对应 的scriptSession进行处理,以便精确推送的时候能找到推送对象
第四 MessagePush类中实现的方法如下:
public void onPageLoad(String userId) { ScriptSession scriptSession = WebContextFactory.get().getScriptSession(); scriptSession.setAttribute(userId, userId); DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil(); try { dwrScriptSessionManagerUtil.init(); System.out.println("cacaca"); } catch (ServletException e) { e.printStackTrace(); } }
里面对应的DwrScriptSessionManagerUtil 对应如下:
import javax.servlet.ServletException; import javax.servlet.http.HttpSession; import org.directwebremoting.Container; import org.directwebremoting.ServerContextFactory; import org.directwebremoting.WebContextFactory; import org.directwebremoting.event.ScriptSessionEvent; import org.directwebremoting.event.ScriptSessionListener; import org.directwebremoting.extend.ScriptSessionManager; import org.directwebremoting.servlet.DwrServlet; public class DwrScriptSessionManagerUtil extends DwrServlet{ private static final long serialVersionUID = -7504612622407420071L; public void init()throws ServletException { Container container = ServerContextFactory.get().getContainer(); ScriptSessionManager manager = container.getBean(ScriptSessionManager.class); ScriptSessionListener listener = new ScriptSessionListener() { public void sessionCreated(ScriptSessionEvent ev) { HttpSession session = WebContextFactory.get().getSession(); String userId =((User) session.getAttribute("userinfo")).getHumanid()+""; System.out.println("a ScriptSession is created!"); ev.getSession().setAttribute("userId", userId); } public void sessionDestroyed(ScriptSessionEvent ev) { System.out.println("a ScriptSession is distroyed"); } }; manager.addScriptSessionListener(listener); } }
第五 推送页面代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'MyJsp.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.5.1.js"></script> <script type='text/javascript' src='dwr/engine.js'></script> <script type='text/javascript' src='dwr/util.js'></script> <script type='text/javascript' src='dwr/interface/TestPush.js'></script> <script type="text/javascript"> function test() { var msg = document.getElementById("msgId").value; //msg = {msgId: '1', context: $("#msgContext").val()}; TestPush.sendMessageAuto(msg,"哈哈哈"); } </script> </head> <body> id : <input type="text" name="msgId" id="msgId" /> <br /> <input type="button" value="Send" onclick="test()" /> </body> </html>
第六:精确推送要实现的代码:
public class Test{ public void sendMessageAuto(String userid, String message){ final String userId = userid; final String autoMessage = message; Browser.withAllSessionsFiltered(new ScriptSessionFilter() { public boolean match(ScriptSession session){ if (session.getAttribute("userId") == null) return false; else return (session.getAttribute("userId")).equals(userId); } }, new Runnable(){ private ScriptBuffer script = new ScriptBuffer(); public void run(){ script.appendCall("showMessage", autoMessage); Collection<ScriptSession> sessions = Browser .getTargetSessions(); for (ScriptSession scriptSession : sessions){ scriptSession.addScript(script); } } }); } }
至此 这个例子的代码都已经贴出来了,应该是可以跑通的,有问题的话可以给我留言。当然,要自己写个登录,然后把userId放到session里面,这个比较简单,就不贴代码了,有问题可以在http://download.csdn.net/detail/luojia_wang/5275588上下载原项目。我只是简单的做了一个能实现功能的例子,还有很多地方要研究,比如跟spring整合,还可能有很多优化,等我继续学习一下再说.
相关推荐
要实现DWR3的推送消息,首先需要在服务器端配置DWR。这包括创建`dwr.xml`配置文件,定义允许的远程方法,并启用推送支持。在`dwr.xml`中,你可以使用`<push>`标签来配置推送引擎,例如设置推送类型(如Ajax或者...
在"DWR3实现服务器端向客户端精确推送消息.txt"这个文档中,我们可能会探讨如何利用DWR3.0的特性实现服务器端到客户端的消息精确推送。在传统的HTTP协议中,客户端需要不断轮询服务器以获取新数据,这种方式不仅效率...
### dwr实现消息精确推送详解 #### 一、前言 Direct Web Remoting(DWR)是一种开源技术,它使得JavaScript可以直接调用服务器端的Java方法成为可能,从而简化了客户端与服务器之间的交互过程。本篇文章将详细介绍...
在`dwr3实现消息精确推送详细步骤 - jsczxy2 - ITeye技术网站_files`这个文件夹中,可能包含了示例代码和教程的详细步骤。这些资源可以辅助理解每个阶段的具体操作。 10. **最佳实践** 实现消息推送时,要考虑...
3. **消息推送机制**: 探讨Websocket、Server-Sent Events (SSE) 或Long Polling等实现消息推送的技术。 4. **一对一通信设计**: 分析如何在服务器端处理多个客户端连接,为每个用户维护独立的会话。 5. **前端开发*...
在DWR3中,"精确推送"(也称为反向推送或服务器推送)是一种技术,允许服务器主动地将数据推送到客户端,而无需客户端频繁发起请求。这在实时应用中非常有用,例如股票报价、在线聊天或者游戏状态更新等场景。 配置...
在**dwr_concreate_push**这个文件中,我们可以预期找到实现DWR精确推送的源码示例。下面将详细讲解DWR推送的核心概念和技术。 1. **DWR Push API**: DWR提供了Push API,包括`Push.createChannel()`用于创建推送...
Comet4j 是一个实现这种技术的开源框架,它基于 Comet 技术,允许服务器端主动向客户端推送数据,而不是传统的请求-响应模式。 首先,Comet 技术是Web服务器向浏览器推送数据的一种策略,解决了HTTP协议本身无状态...
4. **Live Updates**:DWR允许服务器端主动推送更新到客户端,无需客户端发起请求,提高了用户体验。 5. **Security**:DWR通过一系列安全机制确保通信的安全性,如CSRF(Cross-site Request Forgery)防护,以及可...