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

前端之家收集整理的这篇文章主要介绍了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的配置信息,

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appversion="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. <context-param>
  11. <param-name>contextConfigLocation</param-name>
  12. <param-value>classpath:spring/applicationContext.xml</param-value>
  13. </context-param>
  14. <!--配置Spring的OpenSessionInViewFilter,以解决懒加载异常-->
  15. <filter>
  16. <filter-name>OpenSessionInViewFilter</filter-name>
  17. <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  18. </filter>
  19. <filter-mapping>
  20. <url-pattern>/*</url-pattern>
  21. </filter-mapping>
  22. <!--配置Struts2的过滤器-->
  23. <filter-name>struts2</filter-name>
  24. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  25. <!--dwr相关配置-->
  26. <servlet>
  27. <servlet-name>dwr-invoker</servlet-name>
  28. <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  29. <init-param>
  30. <param-name>fileUploadMaxBytes</param-name>
  31. <param-value>25000</param-value>
  32. </init-param>
  33. <param-name>debug</param-name>
  34. <param-value>true</param-value>
  35. <param-name>accessLogLevel</param-name>
  36. <param-value>runtimeexception</param-value>
  37. <param-name>activeReverseAjaxEnabled</param-name>
  38. <param-name>initApplicationScopeCreatorsAtStartup</param-name>
  39. <param-name>jsonRpcEnabled</param-name>
  40. <param-name>jsonpEnabled</param-name>
  41. <param-name>preferDataUrlSchema</param-name>
  42. <param-value>false</param-value>
  43. <load-on-startup>1</load-on-startup>
  44. </servlet>
  45. <servlet-mapping>
  46. <servlet-name>dwr-invoker</servlet-name>
  47. <url-pattern>/dwr/*</url-pattern>
  48. </servlet-mapping>
  49. <welcome-file-list>
  50. <welcome-file>index.jsp</welcome-file>
  51. </welcome-file-list>
  52. </web-app>

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

    <!DOCTYPEdwrPUBLIC
  1. "-//GetAheadLimited//DTDDirectWebRemoting3.0//EN"
  2. "http://getahead.org/dwr/dwr30.dtd">
  3. <dwr>
  4. <allow>
    <!--new的意思是每次都实例化一个,javascript的意思就是代替-param中的value的简称,可以在js中直接可以用messgeService调用
    cn.ittec.zfx.service.impl.MessageServiceImpl中的方法-->
    <createcreator="new"javascript="messageService">
  1. <paramname="class"value="cn.ittec.zfx.service.impl.MessageServiceImpl"/>
  2. </create>
  3. </allow>
  4. </dwr>

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

    <constantname="struts.action.excludePattern"value="/dwr/*"></constant>


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

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

[javascript]
    <scripttype="text/javascript"src="dwr/engine.js"></script>
  1. <scripttype="text/javascript"src="dwr/util.js"></script>
  2. <scripttype="text/javascript"src="dwr/interface/messageService.js"></script>


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



    <scripttype="text/javascript">
    //页面加载完之后执行这个方法,与服务器建立长连接
    functionunready(){
    //dwr.engine.setActiveReverseAjax(true);与服务器建立一个长连接,默认是false,如果是false连接会在5分钟后注销
    //onPageLoad会触发自己的一个方法
    dwr.engine.setActiveReverseAjax(true);
  1. dwr.engine.setNotifyServerOnPageUnload(true);
  2. onPageLoad();
  3. }
  4. /**
  5. *当打开此页面时,触发这个方法,与服务器建立一个长连接,随时推送服务器消息
  6. **/
  7. functiononPageLoad(){
    //获取将要给哪个登录的id发送消息
    varsendId=document.getElementById("sendId").value;
    //****通过这个方法调用cn.ittec.zfx.service.impl.MessageServiceImpl中的onPageLoad方法
    messageService.onPageLoad(sendId);
  1. </script>


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

[java]
    publicvoidonPageLoad(StringsendId){//sendId打开的聊天窗口对应的User的id
  1. ScriptSessionscriptSession=WebContextFactory.get()
  2. .getScriptSession();
  3. scriptSession.setAttribute(sendId,sendId);
    //DwrScriptSessionManagerUtil是自己写的一个类
    DwrScriptSessionManagerUtildwrScriptSessionManagerUtil=newDwrScriptSessionManagerUtil();
  1. try{
  2. dwrScriptSessionManagerUtil.init();
  3. }catch(ServletExceptione){
  4. e.printStackTrace();
  5. }

下面是DwrScriptSessionManagerUtil.java类的说明

    packagecn.ittec.zfx.util;
  1. importjavax.servlet.ServletException;
  2. importjavax.servlet.http.HttpSession;
  3. importorg.directwebremoting.Container;
  4. importorg.directwebremoting.ServerContextFactory;
  5. importorg.directwebremoting.WebContextFactory;
  6. importorg.directwebremoting.event.ScriptSessionEvent;
  7. importorg.directwebremoting.event.ScriptSessionListener;
  8. importorg.directwebremoting.extend.ScriptSessionManager;
  9. importorg.directwebremoting.servlet.DwrServlet;
  10. importcn.ittec.zfx.domain.User;
  11. publicclassDwrScriptSessionManagerUtilextendsDwrServlet{
  12. privatestaticfinallongserialVersionUID=1L;
  13. publicvoidinit()throwsServletException{
  14. Containercontainer=ServerContextFactory.get().getContainer();
  15. ScriptSessionManagermanager=container
  16. .getBean(ScriptSessionManager.class);
  17. ScriptSessionListenerlistener=newScriptSessionListener(){
  18. publicvoidsessionCreated(ScriptSessionEventev){
  19. HttpSessionsession=WebContextFactory.get().getSession();
    //这里的意思是你放在session里用户的id
    Useruser=(User)session.getAttribute("user");
  1. StringuserId=user.getId()+"";
  2. //StringuserId=ZfxUtils.getUserFromSession().getId()+"";
  3. ev.getSession().setAttribute("userId",userId);
  4. }
  5. publicvoidsessionDestroyed(ScriptSessionEventev){
  6. };
  7. manager.addScriptSessionListener(listener);
  8. }

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

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

    messageService.pushMessagee(id,name,contextTwo);
    下面是pushMessagee的代码
    <precode_snippet_id="207359"snippet_file_name="blog_20140227_27_6582088"class="java"name="code">publicvoidpushMessagee(Stringuserid,Stringname,StringcontextTwo)throwsException{
  1. finalStringuserId=userid;//接收端用户的id</pre><precode_snippet_id="207359"snippet_file_name="blog_20140227_28_2405394"class="java"name="code">finalStringuserName=name;//发送端的name,告诉他是谁谁谁发的,类似QQ
  2. finalStringautoMessage=contextTwo;//将要发送的内容
  3. Browser.withAllSessionsFiltered(newScriptSessionFilter(){
  4. publicbooleanmatch(ScriptSessionsession){
  5. if(session.getAttribute("userId")==null){
  6. returnfalse;
  7. else{
  8. return(session.getAttribute("userId")).equals(userId);
  9. },newRunnable(){
  10. privateScriptBufferscript=newScriptBuffer();
  11. publicvoidrun(){
  12. </pre><precode_snippet_id="207359"snippet_file_name="blog_20140227_29_9864902"class="java"name="code">//这里比较重要了。showMessage是接收页面js中的方法名,userName和antoMessage分别是方法的参数,信息全部发送过去了,接下来你要弹框还是写到页面就看你的需求了,</pre><precode_snippet_id="207359"snippet_file_name="blog_20140227_30_3736360"class="java"name="code">script.appendCall("showMessage",userName,autoMessage);
  13. Collection<ScriptSession>sessions=Browser
  14. .getTargetSessions();
  15. for(ScriptSessionscriptSession:sessions){
  16. scriptSession.addScript(script);
  17. });
  18. }</pre><br>
  19. <pre></pre>
  20. <h3><aname="t11"></a><br>
  21. 8,至此全部搞定了,看似很简单,但是有些地方还是不太清楚,由于原项目不方便供给大家参考,如果大家还有什么不懂的,可以留言告诉我,我会尽力帮助大家,互相帮忙嘛!!</h3>
  22. <p></p>
  23. <p></p>
  24. <p></p>

猜你在找的Ajax相关文章