dwr3与struts2整合,实现服务器端推送技术,实现多人聊天功能

目录(?)[+]

目录(?)[-]

  1. 首先放入struts2和dwr的jar包这个想必大家都知道了吧
  2. 下面是webxml的全部配置信息因为当初是ssh2一起整合的所以会有spring的配置信息
  3. 以下是dwr的全部配置信息 dwrxml是放在WEB-INF下面就是和webxml在同一个目录的
  4. 这里还需要注意一点 dwr的过滤器和struts2 的过滤器都过滤的是整个项目所以会有冲突所以要在strutsxml中配置一下来解决中途问题
  5. 接下来就是在接收推送消息的界面引入dwr的js
  6. 其中enginejs和utiljs是在dwrjar包里面的在项目的WebRoot下面是找不到的如果你想看可以到dwrjar里面找肯定有然后还需要引入messageServicejs
  7. 在接收推送消息的界面body里面初始化一些东西
  8. 下面是 onPageLoad 方法的说明不用说明的都不用改只要copy到你的项目就ok了因为有些我也不是太懂哈
  9. 下面是DwrScriptSessionManagerUtiljava类的说明
  10. 到此接收端的一些操作就完成了下面是发送信息端的代码
  11. 当你点击发送按钮将推送信息的时候要用js触发这个方法
  12. 至此全部搞定了看似很简单但是有些地方还是不太清楚由于原项目不方便供给大家参考如果大家还有什么不懂的可以留言告诉我我会尽力帮助大家互相帮忙嘛


1,首先放入struts2和dwr的jar包,这个想必大家都知道了吧!

2,下面是web.xml的全部配置信息,因为当初是ssh2一起整合的,所以会有spring的配置信息,

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.     <!-- 整合Spring -->  
  7.     <listener>  
  8.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  9.     </listener>  
  10.   
  11.     <context-param>  
  12.         <param-name>contextConfigLocation</param-name>  
  13.         <param-value>classpath:spring/applicationContext.xml</param-value>  
  14.     </context-param>  
  15.   
  16.   
  17.     <!-- 配置Spring的OpenSessionInViewFilter,以解决懒加载异常 -->  
  18.     <filter>  
  19.         <filter-name>OpenSessionInViewFilter</filter-name>  
  20.         <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
  21.     </filter>  
  22.     <filter-mapping>  
  23.         <filter-name>OpenSessionInViewFilter</filter-name>  
  24.         <url-pattern>/*</url-pattern>  
  25.     </filter-mapping>  
  26.   
  27.     <!-- 配置Struts2的过滤器 -->  
  28.     <filter>  
  29.         <filter-name>struts2</filter-name>  
  30.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  31.     </filter>  
  32.     <filter-mapping>  
  33.         <filter-name>struts2</filter-name>  
  34.         <url-pattern>/*</url-pattern>  
  35.     </filter-mapping>  
  36.   
  37.   
  38.     <!-- dwr相关配置 -->  
  39.     <servlet>  
  40.     <servlet-name>dwr-invoker</servlet-name>  
  41.     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>  
  42.     <init-param>  
  43.       <param-name>fileUploadMaxBytes</param-name>  
  44.       <param-value>25000</param-value>  
  45.     </init-param>  
  46.     <init-param>  
  47.       <param-name>debug</param-name>  
  48.       <param-value>true</param-value>  
  49.     </init-param>  
  50.     <init-param>  
  51.       <param-name>accessLogLevel</param-name>  
  52.       <param-value>runtimeexception</param-value>  
  53.     </init-param>  
  54.     <init-param>  
  55.       <param-name>activeReverseAjaxEnabled</param-name>  
  56.       <param-value>true</param-value>  
  57.     </init-param>  
  58.     <init-param>  
  59.       <param-name>initApplicationScopeCreatorsAtStartup</param-name>  
  60.       <param-value>true</param-value>  
  61.     </init-param>  
  62.     <init-param>  
  63.       <param-name>jsonRpcEnabled</param-name>  
  64.       <param-value>true</param-value>  
  65.     </init-param>  
  66.     <init-param>  
  67.       <param-name>jsonpEnabled</param-name>  
  68.       <param-value>true</param-value>  
  69.     </init-param>  
  70.     <init-param>  
  71.       <param-name>preferDataUrlSchema</param-name>  
  72.       <param-value>false</param-value>  
  73.     </init-param>  
  74.     <load-on-startup>1</load-on-startup>  
  75.   </servlet>  
  76.     <servlet-mapping>  
  77.         <servlet-name>dwr-invoker</servlet-name>  
  78.         <url-pattern>/dwr/*</url-pattern>  
  79.     </servlet-mapping>  
  80.       
  81.   
  82.   
  83.     <welcome-file-list>  
  84.         <welcome-file>index.jsp</welcome-file>  
  85.     </welcome-file-list>  
  86.   
  87. </web-app>  

 

3,以下是dwr的全部配置信息 ,dwr.xml是放在WEB-INF下面,就是和web.xml在同一个目录的

 

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC  
  3.     "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"  
  4.     "http://getahead.org/dwr/dwr30.dtd">  
  5. <dwr>    
  6.     <allow>    
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <!--new的意思是每次都实例化一个,javascript的意思就是代替-param中的value的简称,可以在js中直接可以用messgeService调用   
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. cn.ittec.zfx.service.impl.MessageServiceImpl中的方法-->  
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.         <create creator="new" javascript="messageService">    
  2.         <param name="class" value="cn.ittec.zfx.service.impl.MessageServiceImpl"/>    
  3.         </create>    
  4.     </allow>    
  5. </dwr>    

 

这里还需要注意一点 dwr的过滤器和struts2 的过滤器都过滤的是整个项目,所以会有冲突,所以要在struts.xml中配置一下来解决中途问题

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <constant name="struts.action.excludePattern" value="/dwr/*"></constant>  


 

 

4,接下来就是在接收推送消息的界面引入dwr的js

其中:engine.js和util.js是在dwr.jar包里面的,在项目的WebRoot下面是找不到的,如果你想看,可以到dwr.jar里面找,肯定有,然后还需要引入messageService.js

[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <script type="text/javascript" src="dwr/engine.js"></script>    
  2. <script type="text/javascript" src="dwr/util.js"></script>    
  3. <script type="text/javascript" src="dwr/interface/messageService.js"></script>  


 

5,在接收推送消息的界面body里面初始化一些东西



 

[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <script type="text/javascript">  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //页面加载完之后执行这个方法,与服务器建立长连接  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. function unready(){  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //dwr.engine.setActiveReverseAjax(true);与服务器建立一个长连接,默认是false,如果是false连接会在5分钟后注销  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //onPageLoad会触发自己的一个方法  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.     dwr.engine.setActiveReverseAjax(true);  
  2.     dwr.engine.setNotifyServerOnPageUnload(true);  
  3.     onPageLoad();  
  4. }  
  5.       
  6. /** 
  7.  *  当打开此页面时,触发这个方法,与服务器建立一个长连接,随时推送服务器消息 
  8. **/  
  9. function onPageLoad(){  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //获取将要给哪个登录的id发送消息  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. var sendId = document.getElementById("sendId").value;  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //****通过这个方法调用cn.ittec.zfx.service.impl.MessageServiceImpl中的onPageLoad方法  
[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.             messageService.onPageLoad(sendId);    
  2.         }  
  3. </script>  


 

6,下面是 onPageLoad 方法的说明(不用说明的都不用改,只要copy到你的项目就ok了,因为有些我也不是太懂,哈)

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public void onPageLoad(String sendId) {//sendId 打开的聊天窗口对应的User的id  
  2.     ScriptSession scriptSession = WebContextFactory.get()  
  3.             .getScriptSession();  
  4.     scriptSession.setAttribute(sendId, sendId);  
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //DwrScriptSessionManagerUtil是自己写的一个类  
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.     DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();  
  2.     try {  
  3.         dwrScriptSessionManagerUtil.init();  
  4.     } catch (ServletException e) {  
  5.         e.printStackTrace();  
  6.     }  
  7. }  

 

下面是DwrScriptSessionManagerUtil.java类的说明

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package cn.ittec.zfx.util;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.HttpSession;  
  5.   
  6. import org.directwebremoting.Container;  
  7. import org.directwebremoting.ServerContextFactory;  
  8. import org.directwebremoting.WebContextFactory;  
  9. import org.directwebremoting.event.ScriptSessionEvent;  
  10. import org.directwebremoting.event.ScriptSessionListener;  
  11. import org.directwebremoting.extend.ScriptSessionManager;  
  12. import org.directwebremoting.servlet.DwrServlet;  
  13.   
  14. import cn.ittec.zfx.domain.User;  
  15.   
  16. public class DwrScriptSessionManagerUtil extends DwrServlet {  
  17.   
  18.   
  19.     private static final long serialVersionUID = 1L;  
  20.   
  21.     public void init() throws ServletException {  
  22.         Container container = ServerContextFactory.get().getContainer();  
  23.         ScriptSessionManager manager = container  
  24.                 .getBean(ScriptSessionManager.class);  
  25.         ScriptSessionListener listener = new ScriptSessionListener() {  
  26.             public void sessionCreated(ScriptSessionEvent ev) {  
  27.                 HttpSession session = WebContextFactory.get().getSession();  
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //这里的意思是你放在session里用户的id  
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.                 User user = (User) session.getAttribute("user");  
  2.                 String userId  = user.getId()+ "";  
  3.                 //String userId = ZfxUtils.getUserFromSession().getId() + "";  
  4.                 ev.getSession().setAttribute("userId", userId);  
  5.             }  
  6.   
  7.             public void sessionDestroyed(ScriptSessionEvent ev) {  
  8.             }  
  9.         };  
  10.         manager.addScriptSessionListener(listener);  
  11.     }  
  12.   
  13. }  

 

 

7,到此接收端的一些操作就完成了,下面是发送信息端的代码。

当你点击发送按钮将推送信息的时候要用js触发这个方法

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. messageService.pushMessagee(id,name ,contextTwo);  
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.    
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. 下面是pushMessagee的代码:  
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <pre code_snippet_id="207359" snippet_file_name="blog_20140227_27_6582088" class="java" name="code">public void pushMessagee(String userid,String name, String contextTwo) throws Exception {  
  2.         final String userId = userid;//接收端用户的id</pre><pre code_snippet_id="207359" snippet_file_name="blog_20140227_28_2405394" class="java" name="code">       final String userName = name;//发送端的name,告诉他是 谁谁谁发的,类似QQ  
  3.         final String autoMessage = contextTwo; //将要发送的内容  
  4.         Browser.withAllSessionsFiltered(new ScriptSessionFilter() {  
  5.             public boolean match(ScriptSession session) {  
  6.                 if (session.getAttribute("userId") == null){  
  7.                     return false;  
  8.                 }  
  9.                 else{  
  10.                     return (session.getAttribute("userId")).equals(userId);  
  11.                 }  
  12.             }  
  13.         }, new Runnable() {  
  14.             private ScriptBuffer script = new ScriptBuffer();  
  15.             public void run() {  
  16. </pre><pre code_snippet_id="207359" snippet_file_name="blog_20140227_29_9864902" class="java" name="code">              //这里比较重要了。showMessage是接收页面js中的方法名,userName和antoMessage分别是方法的参数,信息全部发送过去了,接下来你要弹框还是写到页面就看你的需求了,</pre><pre code_snippet_id="207359" snippet_file_name="blog_20140227_30_3736360" class="java" name="code">                script.appendCall("showMessage" ,userName, autoMessage);  
  17.                 Collection<ScriptSession> sessions = Browser  
  18.                         .getTargetSessions();  
  19.                 for (ScriptSession scriptSession : sessions) {  
  20.                     scriptSession.addScript(script);  
  21.                 }  
  22.             }  
  23.         });  
  24.   
  25.     }</pre><br>  
  26. <pre></pre>  
  27. <h3><a name="t11"></a><br>  
  28. 8,至此全部搞定了,看似很简单,但是有些地方还是不太清楚,由于原项目不方便供给大家参考,如果大家还有什么不懂的,可以留言告诉我,我会尽力帮助大家,互相帮忙嘛!!</h3>  
  29. <p> </p>  
  30. <p> </p>  
  31. <p> </p>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值