<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[转]DWR Server Push(服务器推技术) 实现即时聊天功能(WEB)]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 05 Aug 2009 10:35:31 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	当你有QQ消息时,QQ的小图标会晃动,我们甚至还可以设定QQ有消息时,自动弹出来!<br/>这些在C/S模式下很容易实现!如果要在B/S模式如何来实现呢?<br/>我们的肯定会想到在客服端调用ajax在后台不断的查询服务器.看是否有关于自己的消息.如果有则查询返回.这种做法肯定会大量的占用系统的资源!不可取!<br/>现在DWR的反转AJAX功能.允许我们从服务器端来控制客服端.而不需要客户端来请求.服务器可以自动把消息发给指定的客户端! <a href="http://yourgame.javaeye.com/upload/picture/pic/16011/3b60c903-8a05-3dd1-a039-7aa9e4041791.gif" target="_blank"><img src="http://yourgame.javaeye.com/upload/picture/pic/16011/3b60c903-8a05-3dd1-a039-7aa9e4041791.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><a href="http://yourgame.javaeye.com/upload/picture/pic/16009/6eec31b6-053d-355a-968c-7a1468e39366.gif" target="_blank"><img src="http://yourgame.javaeye.com/upload/picture/pic/16009/6eec31b6-053d-355a-968c-7a1468e39366.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>我不能把公司的代码贴出来,所以我自己写了一个DEMO,已经实现了对指定用户发送消息的功能,并且即时显示在指定的用户界面上面.当然你可以修改这些,让它弹出来显示,或者像QQ一样在你页面的某个角落让消息的图标闪动:)<br/>下面我做一个简单的说明:<br/>用户的JAVABEAN User.java <br/><br/><div class="code"><br/>&nbsp;&nbsp; 1. package com.lhq;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 2.&nbsp;&nbsp; <br/>&nbsp;&nbsp; 3. /** <br/>&nbsp;&nbsp; 4.&nbsp;&nbsp;* 用户类 <br/>&nbsp;&nbsp; 5.&nbsp;&nbsp;*&nbsp;&nbsp;<br/>&nbsp;&nbsp; 6.&nbsp;&nbsp;* @author 廖瀚卿 <br/>&nbsp;&nbsp; 7.&nbsp;&nbsp;*&nbsp;&nbsp;<br/>&nbsp;&nbsp; 8.&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp; 9. public class User &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;10.&nbsp;&nbsp; <br/>&nbsp;&nbsp;11.&nbsp;&nbsp;&nbsp;&nbsp; private String userid;&nbsp;&nbsp;<br/>&nbsp;&nbsp;12.&nbsp;&nbsp; <br/>&nbsp;&nbsp;13.&nbsp;&nbsp;&nbsp;&nbsp; private String username;&nbsp;&nbsp;<br/>&nbsp;&nbsp;14.&nbsp;&nbsp; <br/>&nbsp;&nbsp;15.&nbsp;&nbsp;&nbsp;&nbsp; public String getUserid() &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;16.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return userid;&nbsp;&nbsp;<br/>&nbsp;&nbsp;17.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;18.&nbsp;&nbsp; <br/>&nbsp;&nbsp;19.&nbsp;&nbsp;&nbsp;&nbsp; public void setUserid(String userid) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userid = userid;&nbsp;&nbsp;<br/>&nbsp;&nbsp;21.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;22.&nbsp;&nbsp; <br/>&nbsp;&nbsp;23.&nbsp;&nbsp;&nbsp;&nbsp; public String getUsername() &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;24.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return username;&nbsp;&nbsp;<br/>&nbsp;&nbsp;25.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;26.&nbsp;&nbsp; <br/>&nbsp;&nbsp;27.&nbsp;&nbsp;&nbsp;&nbsp; public void setUsername(String username) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;28.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;&nbsp;&nbsp;<br/>&nbsp;&nbsp;29.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;30.&nbsp;&nbsp; <br/>&nbsp;&nbsp;31.&nbsp;&nbsp;&nbsp;&nbsp; public User(String userid, String username) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;32.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();&nbsp;&nbsp;<br/>&nbsp;&nbsp;33.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userid = userid;&nbsp;&nbsp;<br/>&nbsp;&nbsp;34.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;&nbsp;&nbsp;<br/>&nbsp;&nbsp;35.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;36.&nbsp;&nbsp; <br/>&nbsp;&nbsp;37. &#125;&nbsp;&nbsp;<br/></div><br/>聊天处理类 ChatManager.java <br/><br/><div class="code"><br/>&nbsp;&nbsp; 1. package com.lhq;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 2.&nbsp;&nbsp; <br/>&nbsp;&nbsp; 3. import java.util.ArrayList;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 4. import java.util.Collection;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 5. import java.util.HashSet;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 6. import java.util.List;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 7.&nbsp;&nbsp; <br/>&nbsp;&nbsp; 8. import javax.servlet.ServletContext;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 9. import javax.servlet.http.HttpServletRequest;&nbsp;&nbsp;<br/>&nbsp;&nbsp;10.&nbsp;&nbsp; <br/>&nbsp;&nbsp;11. import org.directwebremoting.ScriptSession;&nbsp;&nbsp;<br/>&nbsp;&nbsp;12. import org.directwebremoting.ServerContext;&nbsp;&nbsp;<br/>&nbsp;&nbsp;13. import org.directwebremoting.ServerContextFactory;&nbsp;&nbsp;<br/>&nbsp;&nbsp;14. import org.directwebremoting.WebContextFactory;&nbsp;&nbsp;<br/>&nbsp;&nbsp;15. import org.directwebremoting.proxy.dwr.Util;&nbsp;&nbsp;<br/>&nbsp;&nbsp;16.&nbsp;&nbsp; <br/>&nbsp;&nbsp;17. /** <br/>&nbsp;&nbsp;18.&nbsp;&nbsp;* 处理聊天相关 <br/>&nbsp;&nbsp;19.&nbsp;&nbsp;*&nbsp;&nbsp;<br/>&nbsp;&nbsp;20.&nbsp;&nbsp;* @author 廖瀚卿 <br/>&nbsp;&nbsp;21.&nbsp;&nbsp;*&nbsp;&nbsp;<br/>&nbsp;&nbsp;22.&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;23. public class ChatManager &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;24.&nbsp;&nbsp; <br/>&nbsp;&nbsp;25.&nbsp;&nbsp;&nbsp;&nbsp; /** 保存当前在线用户列表 */&nbsp;&nbsp;<br/>&nbsp;&nbsp;26.&nbsp;&nbsp;&nbsp;&nbsp; public static List&lt;User&gt; users = new ArrayList&lt;User&gt;();&nbsp;&nbsp;<br/>&nbsp;&nbsp;27.&nbsp;&nbsp; <br/>&nbsp;&nbsp;28.&nbsp;&nbsp;&nbsp;&nbsp; /** <br/>&nbsp;&nbsp;29.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 更新在线用户列表 <br/>&nbsp;&nbsp;30.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param username 待添加到列表的用户名 <br/>&nbsp;&nbsp;31.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param flag 是添加用户到列表,还是只获得当前列表 <br/>&nbsp;&nbsp;32.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param request <br/>&nbsp;&nbsp;33.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @return 用户userid <br/>&nbsp;&nbsp;34.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;35.&nbsp;&nbsp;&nbsp;&nbsp; public String updateUsersList(String username, boolean flag, HttpServletRequest request) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;36.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user = null;&nbsp;&nbsp;<br/>&nbsp;&nbsp;37.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (flag) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;38.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 这里取会话(HttpSession)的id为用户id&nbsp;&nbsp; <br/>&nbsp;&nbsp;39.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user = new User(request.getSession().getId(), username);&nbsp;&nbsp;<br/>&nbsp;&nbsp;40.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保存用户到列表&nbsp;&nbsp;<br/>&nbsp;&nbsp;41.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; users.add(user);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;42.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将用户id和页面脚本session绑定&nbsp;&nbsp;<br/>&nbsp;&nbsp;43.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setScriptSessionFlag(user.getUserid());&nbsp;&nbsp;<br/>&nbsp;&nbsp;44.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;45.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得DWR上下文&nbsp;&nbsp;<br/>&nbsp;&nbsp;46.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext sc = request.getSession().getServletContext();&nbsp;&nbsp;<br/>&nbsp;&nbsp;47.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerContext sctx = ServerContextFactory.get(sc);&nbsp;&nbsp;<br/>&nbsp;&nbsp;48.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得当前浏览 index.jsp 页面的所有脚本session&nbsp;&nbsp;<br/>&nbsp;&nbsp;49.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collection sessions = sctx.getScriptSessionsByPage(&quot;/chat/index.jsp&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;50.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Util util = new Util(sessions);&nbsp;&nbsp;<br/>&nbsp;&nbsp;51.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //处理这些页面中的一些元素&nbsp;&nbsp;<br/>&nbsp;&nbsp;52.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.removeAllOptions(&quot;users&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;53.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.addOptions(&quot;users&quot;, users, &quot;username&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;54.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.removeAllOptions(&quot;receiver&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;55.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.addOptions(&quot;receiver&quot;, users,&quot;userid&quot;,&quot;username&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;56.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!flag)&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;57.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;&nbsp;&nbsp;<br/>&nbsp;&nbsp;58.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;59.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return user.getUserid();&nbsp;&nbsp;<br/>&nbsp;&nbsp;60.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;61.&nbsp;&nbsp; <br/>&nbsp;&nbsp;62.&nbsp;&nbsp;&nbsp;&nbsp; /** <br/>&nbsp;&nbsp;63.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 将用户id和页面脚本session绑定 <br/>&nbsp;&nbsp;64.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param userid <br/>&nbsp;&nbsp;65.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;66.&nbsp;&nbsp;&nbsp;&nbsp; public void setScriptSessionFlag(String userid) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;67.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WebContextFactory.get().getScriptSession().setAttribute(&quot;userid&quot;, userid);&nbsp;&nbsp;<br/>&nbsp;&nbsp;68.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;69.&nbsp;&nbsp; <br/>&nbsp;&nbsp;70.&nbsp;&nbsp;&nbsp;&nbsp; /** <br/>&nbsp;&nbsp;71.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 根据用户id获得指定用户的页面脚本session <br/>&nbsp;&nbsp;72.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param userid <br/>&nbsp;&nbsp;73.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param request <br/>&nbsp;&nbsp;74.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @return <br/>&nbsp;&nbsp;75.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;76.&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings(&quot;unchecked&quot;)&nbsp;&nbsp;<br/>&nbsp;&nbsp;77.&nbsp;&nbsp;&nbsp;&nbsp; public ScriptSession getScriptSession(String userid, HttpServletRequest request) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;78.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptSession scriptSessions = null;&nbsp;&nbsp;<br/>&nbsp;&nbsp;79.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collection&lt;ScriptSession&gt; sessions = new HashSet&lt;ScriptSession&gt;();&nbsp;&nbsp;<br/>&nbsp;&nbsp;80.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessions.addAll(ServerContextFactory.get(request.getSession().getServletContext())&nbsp;&nbsp;<br/>&nbsp;&nbsp;81.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getScriptSessionsByPage(&quot;/chat/index.jsp&quot;));&nbsp;&nbsp;<br/>&nbsp;&nbsp;82.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (ScriptSession session : sessions) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;83.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String xuserid = (String) session.getAttribute(&quot;userid&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;84.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xuserid != null &amp;&amp; xuserid.equals(userid)) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;85.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scriptSessions = session;&nbsp;&nbsp;<br/>&nbsp;&nbsp;86.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;87.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;88.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return scriptSessions;&nbsp;&nbsp;<br/>&nbsp;&nbsp;89.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;90.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;91.&nbsp;&nbsp;&nbsp;&nbsp; /** <br/>&nbsp;&nbsp;92.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 发送消息 <br/>&nbsp;&nbsp;93.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param sender 发送者 <br/>&nbsp;&nbsp;94.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param receiverid 接收者id <br/>&nbsp;&nbsp;95.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param msg 消息内容 <br/>&nbsp;&nbsp;96.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param request <br/>&nbsp;&nbsp;97.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;98.&nbsp;&nbsp;&nbsp;&nbsp; public void send(String sender,String receiverid,String msg,HttpServletRequest request)&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;99.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptSession session = this.getScriptSession(receiverid, request);&nbsp;&nbsp;<br/> 100.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Util util = new Util(session);&nbsp;&nbsp;<br/> 101.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.setStyle(&quot;showMessage&quot;, &quot;display&quot;, &quot;&quot;);&nbsp;&nbsp;<br/> 102.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.setValue(&quot;sender&quot;, sender);&nbsp;&nbsp;<br/> 103.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util.setValue(&quot;msg&quot;, msg);&nbsp;&nbsp;<br/> 104.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/> 105. &#125;&nbsp;&nbsp;<br/></div><br/>聊天主页面 index.jsp <br/><div class="code"><br/>&nbsp;&nbsp; 1. &lt;%@ page language=&quot;java&quot; pageEncoding=&quot;GBK&quot;%&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 2. &lt;html&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 3.&nbsp;&nbsp;&nbsp;&nbsp; &lt;head&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;chat&lt;/title&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;meta http-equiv=&quot;pragma&quot; content=&quot;no-cache&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;meta http-equiv=&quot;cache-control&quot; content=&quot;no-cache&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;meta http-equiv=&quot;expires&quot; content=&quot;0&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type=&#039;text/javascript&#039; src=&#039;/chat/dwr/interface/ChatManager.js&#039;&gt;&lt;/script&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type=&#039;text/javascript&#039; src=&#039;/chat/dwr/engine.js&#039;&gt;&lt;/script&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;10.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type=&#039;text/javascript&#039; src=&#039;/chat/dwr/util.js&#039;&gt;&lt;/script&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;11.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot; src=&quot;/chat/chat.js&quot;&gt;&lt;/script&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;12.&nbsp;&nbsp;&nbsp;&nbsp; &lt;/head&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;13.&nbsp;&nbsp;&nbsp;&nbsp; &lt;body&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;14.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;hidden&quot; name=&quot;userid&quot; /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;15.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;16.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 昵称:&nbsp;&nbsp;<br/>&nbsp;&nbsp;17.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;text&quot; name=&quot;username&quot; /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;18.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;button&quot; value=&quot;注册&quot; onclick=&quot;register(this);&quot; /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;19.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;21.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我要对&nbsp;&nbsp;<br/>&nbsp;&nbsp;22.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;select name=&quot;receiver&quot; id=&quot;receiver&quot; disabled=true&quot; &gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;23.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;24.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说:&nbsp;&nbsp;<br/>&nbsp;&nbsp;25.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;message&quot; disabled=&quot;true&quot; /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;26.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;button&quot; value=&quot;发送&quot; id=&quot;send&quot; name=&quot;send&quot; disabled=&quot;true&quot;&nbsp;&nbsp;<br/>&nbsp;&nbsp;27.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onclick=&quot;send();&quot; /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;28.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;29.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;30.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在线用户列表:&nbsp;&nbsp;<br/>&nbsp;&nbsp;31.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ul id=&quot;users&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;32.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ul&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;33.&nbsp;&nbsp; <br/>&nbsp;&nbsp;34.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id=&quot;showMessage&quot; style=&quot;display: none&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;35.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span id=&quot;sender&quot;&gt;&lt;/span&gt;对你说:&nbsp;&nbsp;<br/>&nbsp;&nbsp;36.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span id=&quot;msg&quot;&gt;&lt;/span&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;37.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;38.&nbsp;&nbsp;&nbsp;&nbsp; &lt;/body&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;39. &lt;/html&gt;&nbsp;&nbsp;<br/></div><br/><br/>JAVASCRIPT 文件 chat.js <br/><div class="code"><br/>&nbsp;&nbsp; 1. /** <br/>&nbsp;&nbsp; 2.&nbsp;&nbsp;* 注册帐号 <br/>&nbsp;&nbsp; 3.&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp; 4. function register(button) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 5.&nbsp;&nbsp;&nbsp;&nbsp; if ($(&#039;username&#039;).value == &quot;&quot; &#124;&#124; $(&#039;username&#039;).value.length &lt;= 0) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&quot;请输入昵称&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp; 7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 8.&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 9.&nbsp;&nbsp; <br/>&nbsp;&nbsp;10.&nbsp;&nbsp;&nbsp;&nbsp; /* 下面是对一些按钮的禁用和激活操作 */&nbsp;&nbsp;<br/>&nbsp;&nbsp;11.&nbsp;&nbsp;&nbsp;&nbsp; $(&#039;username&#039;).disabled = true;&nbsp;&nbsp;<br/>&nbsp;&nbsp;12.&nbsp;&nbsp;&nbsp;&nbsp; button.disabled = true;&nbsp;&nbsp;<br/>&nbsp;&nbsp;13.&nbsp;&nbsp;&nbsp;&nbsp; $(&#039;message&#039;).disabled = false;&nbsp;&nbsp;<br/>&nbsp;&nbsp;14.&nbsp;&nbsp;&nbsp;&nbsp; $(&#039;send&#039;).disabled = false;&nbsp;&nbsp;<br/>&nbsp;&nbsp;15.&nbsp;&nbsp;&nbsp;&nbsp; $(&#039;receiver&#039;).disabled = false;&nbsp;&nbsp;<br/>&nbsp;&nbsp;16.&nbsp;&nbsp; <br/>&nbsp;&nbsp;17.&nbsp;&nbsp;&nbsp;&nbsp; /* 把我输入的用户名注册到服务器,并获得用户id(这里用session id 代替) */&nbsp;&nbsp;<br/>&nbsp;&nbsp;18.&nbsp;&nbsp;&nbsp;&nbsp; ChatManager.updateUsersList($(&#039;username&#039;).value, true, function(data) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;19.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (data != null &amp;&amp; data.length &gt; 0) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&#039;userid&#039;).value = data; // 注册成功,把userid放到当前页面&nbsp;&nbsp;<br/>&nbsp;&nbsp;21.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;22.&nbsp;&nbsp;&nbsp;&nbsp; &#125;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;23. &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;24.&nbsp;&nbsp; <br/>&nbsp;&nbsp;25. /** <br/>&nbsp;&nbsp;26.&nbsp;&nbsp;* 页面初始化 <br/>&nbsp;&nbsp;27.&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;28. function init() &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;29.&nbsp;&nbsp;&nbsp;&nbsp; dwr.engine.setActiveReverseAjax(true); // 激活反转 重要&nbsp;&nbsp;<br/>&nbsp;&nbsp;30.&nbsp;&nbsp;&nbsp;&nbsp; ChatManager.updateUsersList(null, false); // 当你打开界面的时候,先获得在线用户列表.&nbsp;&nbsp;<br/>&nbsp;&nbsp;31. &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;32.&nbsp;&nbsp; <br/>&nbsp;&nbsp;33. /** <br/>&nbsp;&nbsp;34.&nbsp;&nbsp;* 发送消息 <br/>&nbsp;&nbsp;35.&nbsp;&nbsp;*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;36. function send() &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;37.&nbsp;&nbsp;&nbsp;&nbsp; var sender = dwr.util.getValue(&#039;username&#039;); // 获得发送者名字&nbsp;&nbsp;<br/>&nbsp;&nbsp;38.&nbsp;&nbsp;&nbsp;&nbsp; var receiver = dwr.util.getValue(&#039;receiver&#039;); // 获得接受者id&nbsp;&nbsp;<br/>&nbsp;&nbsp;39.&nbsp;&nbsp;&nbsp;&nbsp; var msg = dwr.util.getValue(&#039;message&#039;); // 获得消息内容&nbsp;&nbsp;<br/>&nbsp;&nbsp;40.&nbsp;&nbsp;&nbsp;&nbsp; ChatManager.send(sender, receiver, msg); // 发送消息&nbsp;&nbsp;<br/>&nbsp;&nbsp;41. &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;42.&nbsp;&nbsp; <br/>&nbsp;&nbsp;43. window.onload = init;//页面加载完毕后执行初始化方法init&nbsp;&nbsp;<br/></div><br/><br/>配置文件 web.xml <br/><div class="code"><br/>&nbsp;&nbsp; 1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 2. &lt;web-app version=&quot;2.4&quot; xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 3.&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 4.&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee&nbsp;&nbsp; <br/>&nbsp;&nbsp; 5.&nbsp;&nbsp;&nbsp;&nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 6.&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 8.&nbsp;&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 9.&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;10.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;11.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;12.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.directwebremoting.servlet.DwrServlet&nbsp;&nbsp;<br/>&nbsp;&nbsp;13.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-class&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;14.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;15.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;调试DWR,发布系统时应将其设为false&lt;/description&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;16.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;17.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;18.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;19.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;使用服务器推技术(反转AJAX)&lt;/description&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;21.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;activeReverseAjaxEnabled&lt;/param-name&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;22.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;23.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;24.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;25.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;26.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initApplicationScopeCreatorsAtStartup&nbsp;&nbsp;<br/>&nbsp;&nbsp;27.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/param-name&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;28.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;29.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;30.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;31.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;maxWaitAfterWrite&lt;/param-name&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;32.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;100&lt;/param-value&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;33.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;34.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;4&lt;/load-on-startup&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;35.&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;36.&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;37.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;38.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;39.&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;40. &lt;/web-app&gt;&nbsp;&nbsp;<br/></div><br/><br/>DWR配置文件 dwr.xml <br/><br/><div class="code"><br/>&nbsp;&nbsp; 1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 2. &lt;!DOCTYPE dwr PUBLIC &quot;-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN&quot; &quot;http://getahead.org/dwr/dwr20.dtd&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 3. &lt;dwr&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 4.&nbsp;&nbsp;&nbsp;&nbsp; &lt;allow&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;convert converter=&quot;bean&quot; match=&quot;com.lhq.User&quot;/&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;create creator=&quot;new&quot; javascript=&quot;ChatManager&quot;&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=&quot;class&quot; value=&quot;com.lhq.ChatManager&quot;/&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/create&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 9.&nbsp;&nbsp;&nbsp;&nbsp; &lt;/allow&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;10. &lt;/dwr&gt;&nbsp;&nbsp;<br/></div><br/>转载：<br/>http://yourgame.javaeye.com/blog/199079<br/><br/>作者还提供了下载，得登陆:xdy108 001002!
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [转]DWR Server Push(服务器推技术) 实现即时聊天功能(WEB)]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>