还是太年轻!DWR进一步学习
昨天研究了一下用DWR框架,做了一个消息推送的demo。根据网上的资料,写一个demo并不难。当demo跑起来并能成功向客户端推送消息的时候,我以为会用DWR了。 但是当我把DWR集成到springMVC中的时候,又走了一些弯路。根本原因是对DWR的机制原理不了解。DWR做消息推送只是它的一种功能,如果把它理解成消息推送就太狭隘了。 当我们研究一门新技术的时候,需要搞清楚几个问题。这个技术用来解决什么问题?内部实现机制?怎么在项目中使用? 1、介绍是一个框架,允许Javascript通过DWR访问服务器上的Java代码。 2、组成和原理基于AJAX的框架,包含两个主要部分: DWR的工作原理是,通过反射,将java翻译成javascript,然后利用回调机制,轻松实现了javascript调用Java代码 3:优点(1)浏览器兼容; 4:应用注意怎么应用,可以参考前一篇文章。《DWR消息推送技术》 <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>
页面引用了三个js,第一个js是dwr的引擎,第二个js是dwr的工具类,第三个js是dwr自动生成的。 当访问页面时,并执行engine.js时,由于在web.xml配置了/dwr路径。 DWR的DwrServlet会处理请求,然后将engine.js以流的形式发送给浏览器, dwr.xml <dwr>
<allow>
<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>
</allow>
</dwr>
java代码 public class MessagePush {
/** * 接收上线用户 * @param userId */
public void onPageLoad(String userId) {
ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
scriptSession.setAttribute(userId,userId);
DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();
try {
dwrScriptSessionManagerUtil.init();
} catch (ServletException e) {
e.printStackTrace();
}
}
/** * 单个设备推送 * @param userid * @param message */
public static void sendMessageSingle(String userid,String message) {
final String userId = userid;
final String autoMessage = message;
Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
public boolean match(ScriptSession session) {
if (session.getAttribute("username") == null)
return false;
else
return (session.getAttribute("username")).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);
}
}
});
}
//广播 } 自动生成的MessagePush.js if (typeof dwr == 'undefined' || dwr.engine == undefined) throw new Error('You must include DWR engine before including this file');
(function() {
if (dwr.engine._getObject("MessagePush") == undefined) {
var p;
p = {};
p._path = '/dwr/dwr';
/** * @param {class java.lang.String} p0 a param * @param {function|Object} callback callback function or options object */
p.onPageLoad = function(p0,callback) {
return dwr.engine._execute(p._path,'MessagePush','onPageLoad',arguments);
};
/** * @param {class java.lang.String} p0 a param * @param {class java.lang.String} p1 a param * @param {function|Object} callback callback function or options object */
p.sendMessageSingle = function(p0,p1,'sendMessageSingle',arguments);
};
/** * @param {class java.lang.String} p0 a param * @param {function|Object} callback callback function or options object */
p.sendBroadcastMessage = function(p0,'sendBroadcastMessage',arguments);
};
dwr.engine._setObject("MessagePush",p);
}
})();
可见,当我们在页面中使用MessagePush.sendMessageSingle(param); 调用服务器端Java的方法sendMessageSingle()时,实际上是执行是 dwr.engine._execute(p._path,‘MessagePush’,‘sendMessageSingle’,arguments);该请求同样被DwrServlet处理,然后在dwr.xml中查询到MessagePush的对应项目,然后根据配置信息,自己根据反射生成对象或者由Spring注入对象,然后调用方法sendMessageSingle() ,将处理结果返回给浏览器,最后执行回调函数. ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |