dwr多人聊天室实用技术详解(保证成功)

来源:互联网 发布:python正则表达式大全 编辑:程序博客网 时间:2024/06/05 17:52

<span style="font-family: SimHei; background-color: rgb(255, 255, 255);">好吧,正式文章第一篇,上一篇是当的  。呼啦啦 作为一个有拖延症的人 ,很想改正自己的缺点呐,那么就从现在开始吧q(≧▽≦q)!</span>

今天我们来说说dwr框架,理论的东西我也不懂,

其实在这里稍微说一下我的理解吧,我觉得dwr主要就是找构建ScripetSession找ScriptSession的过程,找到了以后就可以通过ScriptBuffer构建回调函数,把scriptbuffer添加到session里就能执行啦,其中构建ScriptSession主要就是在你需要接受消息的页面加载完成时执行dwr.engine.setActiveReverseAjax(true);方法,找ScriptSession dwr给我们提供了两种方法,一种是通过ServerContextFactory得到ServerContext对象,然后通过ServerContext对象的getScriptSessionsByPage(currpage)方法获取scriptsession的集合,这是在dwr3出来之前的方法,现在一般很少用了,好像是因为有时候被返回的ServerContext是null值,我推荐的是第二种寻找session的方法,

<span style="white-space:pre"></span>Browser.withPage(page, new Runnable() {@Overridepublic void run() {ScriptSessions.addScript(sb); }});
直接用Browser,都不用找了用ScriptSessions


实战开始吧!!!!!

1.配置dwr环境

框架神马的表示第一步当然是配环境啦,我写的方法是结合spring spring-mvc 

web.xml配置如下

1.配置dwr基本的一些参数


<!-- dwr servlet --><servlet><display-name>DWR Servlet</display-name><servlet-name>dwr-invoker</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class><init-param><param-name>debug</param-name><param-value>true</param-value></init-param><init-param><param-name>logLevel</param-name><param-value>DEBUG</param-value></init-param><!-- dwr路径配置 --><!-- <init-param> <param-name>config</param-name> <param-value>/WEB-INF/dwr-user.xml</param-value> </init-param> --><!-- dwr的comet控制 --><init-param><param-name>pollAndCometEnabled</param-name><param-value>true</param-value></init-param></servlet><servlet-mapping><servlet-name>dwr-invoker</servlet-name><url-pattern>/dwr/*</url-pattern></servlet-mapping>
2.dwr.xml

<!DOCTYPE dwr PUBLIC    "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"    "http://getahead.org/dwr/dwr30.dtd"><dwr><allow></allow></dwr>
这样dwr环境基本就搭好了,我们来进行第二部操作吧

2.构建实体类

1>构建了一个message类

public class Message {private String content;private Date sendDate;//省略getset方法
}
2>在dwr.xml中配置后台的对象和前台对象关联

<span style="white-space:pre"></span><convert match="com.xl.domain.Message" converter="bean"><param name="include" value="content,sendDate" /></convert>

这样前台传过来的类后台也能识别啦

(这突然让我想到了ajax 也是直接传前台对象后台解析成类对象的 都不用配的只要名字一样就可以了,

但是骚年不要想太多啦 毕竟我们是前台调用的后台方法,

只是我有了个神奇的假设 能不能把这个写在接口里用ajax调呢???感觉是行的 我待会测测)


3>jsp代码 我没有用dwr的util,因为我习惯用jquery啦

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Chat</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><script type="text/javascript"<span style="white-space:pre"></span>src="${ctx }/static/js/jquery/jquery-1.11.3.min.js"></script><script type="text/javascript"<span style="white-space:pre"></span>src="${ctx }/static/js/jquery/jquery-migrate-1.2.1.min.js"></script><script type="text/javascript" src="${ctx}/dwr/engine.js"></script><script type="text/javascript" src="${ctx}/dwr/interface/ChatService.js"></script><script type="text/javascript">function send() {var time = new Date();var content = $("#content").val();var name = $("#userName").val();var info = encodeURI(encodeURI(name + " say:\n" + content));var msg = {"content" : info,"sendDate" : time};$("#content").val('');if (!!content) {ChatService.sendMsg(msg);} else {alert("发送的内容不能为空!");}}function showMessage(data) {var message = decodeURI(decodeURI(data.content));var text = $('#info').val();if (!!text) {$('#info').val(text + "\n" + data.sendDate + "  " + message);} else {$('#info').val(data.sendDate + "  " + message);}}$(function() {<span style="color:#cc0000;background-color: rgb(255, 255, 102);">d</span><span style="color:#ff0000;background-color: rgb(255, 255, 102);">wr.engine.setActiveReverseAjax(true);</span>//注册ScriptSessiondwr.engine.setNotifyServerOnPageUnload(true);//在关闭页面时注销ScriptSession});</script></head><body><textarea rows="20" cols="60" id="info" readonly="readonly"></textarea><hr />昵称:<input type="text" id="userName" /><br /> 消息:<textarea rows="5" cols="30" id="content"></textarea><input type="button" value=" Send " onclick="send()"style="height: 85px; width: 85px;" /></body></html>
${ctx}存的是我的工程名,这个不用管 地址导成你们自己的就可以啦

注意

<span style="color:#cc0000;background-color: rgb(255, 255, 102);">d</span><span style="color:#ff0000;background-color: rgb(255, 255, 102);">wr.engine.setActiveReverseAjax(true);   </span>
注意 如果你这个页面要接收消息的话一定要加 不然扫描不到scriptsession自然就实现不了推送啦


4>后台代码

其实很简单 无非就是找到所有的scriptsession 再给她们都调用他们页面的回调函数就行了


@Servicepublic class ChatService {public void sendMsg(Message msg){String page = ServerContextFactory.get().getContextPath()+"/chat.do";ScriptBuffer sb = new ScriptBuffer();String s = RandomUtil.dateFormate(msg.getSendDate(), "yyyy-MM-dd HH:mm:ss");// 执行setMessage方法sb.appendScript("showMessage({content: '").appendScript(msg.getContent()).appendScript("', sendDate: '").appendScript(s).appendScript("'})");Browser.withPage(page, new Runnable() {@Overridepublic void run() {ScriptSessions.addScript(sb); }});}}

好吧 就这么简简单单就o了



0 0