dwr推送

这几天做项目,需要一个消息提醒功能,决定用dwr实现,在dwr官网和网上找了很多资料,也没实现精准推送,大多数的例子具体步骤写的不清楚,不怎么了解dwr的人看了也未必能看懂,反正我是没看懂,那时就决定,若自己实现了,一定将具体步骤写下来,希望能给那些和我一样的人一些帮助,若有不明白的,可以给小弟留言。我只写步骤,不写原理,下面开始。

第一、在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下:

<servlet>

<servlet-name>dwr-invoker</servlet-name>

<servlet-class>

org.directwebremoting.servlet.DwrServlet

</servlet-class>

<init-param>

<param-name>crossDomainSessionSecurity</param-name>

<param-value>false</param-value>

</init-param>

<init-param>

<param-name>allowScriptTagRemoting</param-name>

<param-value>true</param-value>

</init-param>

<init-param>

<param-name>classes</param-name>

<param-value>java.lang.Object</param-value>

</init-param>

<init-param>

<param-name>activeReverseAjaxEnabled</param-name>

<param-value>true</param-value>

</init-param>

<init-param>

<param-name>initApplicationScopeCreatorsAtStartup</param-name>

<param-value>true</param-value>

</init-param>

<init-param>

<param-name>maxWaitAfterWrite</param-name>

<param-value>3000</param-value>

</init-param>

<init-param>

<param-name>debug</param-name>

<param-value>true</param-value>

</init-param>

<init-param>

<param-name>logLevel</param-name>

<param-value>WARN</param-value>

</init-param>

</servlet>

第二:在web.xml的同级目录下新建dwr.xml文件,内容如下

<!DOCTYPE dwr PUBLIC

"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"

"http://getahead.org/dwr/dwr30.dtd">

<dwr>

<alow>

<create creator="new" javascript="MessagePush">

<param name="class" value="com.huatech.messageremind.service.MessagePush"/>

</create>

</alow>

</dwr>

这个是dwr的基本配置,MessagePush在页面的javascript中使用,com.huatech.messageremind.service.MessagePush实现了想要调用的方法,MessagePush我觉得就相当于java类中的一个映射,在javascript中使用MessagePush.java类中实现的方法,即可在dwr中调用。

第三,要想使用dwr,还要在你想要推送的页面中引入script,

<script type="text/javascript" src="<%=basepath%>dwr/engine.js"></script>

<script type="text/javascript" src="<%=basepath%>dwr/util.js"></script>

<script type="text/javascript" src="<%=basepath%>dwr/interface/MessagePush.js"></script>

可以看见,也引入了dwr.xml中配置的javascript,engine.js和util.js是必须引入的。

以上三点都是基本配置,没什么好说的,想使用dwr,就得这么做。

第四,实现消息的精准推送

消息推送简单,但是想实现精准推送就需要做一些别的操作了

1 在任何一个用户登录的时候,都需要将其userId或者其他唯一性标识放入session中,我放的是userId,

这里就以 userId为唯一性标识。

2 在载入想推送的页面时,需要onload一个我在MessagePush类中实现的方法,当然了,需要使用dwr调用

js的调用方法如下:

function onPageLoad(){

var userId = ‘${userinfo.humanid}‘;

MessagePush.onPageLoad(userId);

}

<body FONT-FAMILY: ‘Times New Roman‘">onload中的三个函数都是必须的,其中dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);是dwr中的函数。

MessagePush类中实现的方法如下:

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();

}

}

大家注意到,onPageLoad方法中还有一个名为DwrScriptSessionManagerUtil的类,该类如下实现:

public class DwrScriptSessionManagerUtil extends DwrServlet{

private static final long serialVersionUID = -7504612622407420071L;

public void init()

throws ServletException {

Container container = ServerContextFactory.get().getContainer();

ScriptSessionManager manager = container

.getBean(ScriptSessionManager.class);

ScriptSessionListener listener = new ScriptSessionListener() {

public void sessionCreated(ScriptSessionEvent ev) {

HttpSession session = WebContextFactory.get().getSession();

String userId =((User) session.getAttribute("userinfo")).getHumanid()+"";

System.out.println("a ScriptSession is created!");

ev.getSession().setAttribute("userId", userId);

}

public void sessionDestroyed(ScriptSessionEvent ev) {

System.out.println("a ScriptSession is distroyed");

}

};

manager.addScriptSessionListener(listener);

}

}

第四步是最最重要的,为了第四步我研究了两天多,下面开始消息推送。

第五、消息推送

在你想要推送消息的时候,调用如下方法:

public void sendMessageAuto(String userid,String message) {

final String userId = userid ;

final String autoMessage = message;

Browser.withAllSessionsFiltered(new ScriptSessionFilter() {

public boolean match(ScriptSession session) {

if (session.getAttribute("userId") == null)

return false;

else

return (session.getAttribute("userId")).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);

}

}

});

}

userid即为你想推给消息的人,message为你想推送的消息,大家注意到这里script.appendCall("showMessage", autoMessage);

其中showMessage为在想推送的页面中的javascript方法,autoMessage是这个方法的参数,这样那个页面就能得到推送的内容了,至于如何展现,就看你的需要了。

至此,一个dwr消息精准推送的步骤就写完了,其实很多东西都不难,只是我们不知道该怎么用而已。

时间: 2024-11-05 22:39:46

dwr推送的相关文章

DWR推送技术

“服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系统的需求.

Web端服务器推送技术原理分析及dwr框架简单的使用

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系

Web端服务器推送技术原理分析及dwr框架简单的使用 转载

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系

dwr进行消息推送示例

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"> <dwr> <allow> <create creator="

DWR实现服务器向客户端推送消息

原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人.只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始: 第一.在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下: <servlet> <servlet-name>dwr-invoker</servle

dwr消息推送

闲来无事,把自己关于对dwr消息推送的实现过程描述一番. 首先第一步,当然在工程中是加入dwr.jar了,接着在web.xml中配置以下代码 <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-na

【纵横科技】基于dwr框架的reverseajax消息推送 有图有图!

原文:[纵横科技]基于dwr框架的reverseajax消息推送 有图有图! 源代码下载地址:http://www.zuidaima.com/share/1584228052847616.htm\ 网络的最初设计是不允许服务器向浏览器发起连接,所以从浏览器及时的获取数据是个棘手的问题. 反向Ajax是具备有从web服务器向浏览器异步的发送数据的能力. 实现原理是保持客服端与服务器的长连接. 这里就附上一个简单的例子咯,给大家玩玩. 本人使用的是NetBeans编辑器,有不会转到MyEclipse

dwr进行页面推送简单实例

实现功能:sendMsg.jsp发送一个消息到后台,后台将消息推送到showMsg.jsp页面. 1.web.xml 配置,在web.xml里面添加如下内容: <!-- 使用DWR进行页面消息推送 --> <servlet> <display-name>DWR Servlet</display-name> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org

【DWR系列02】-DWR逆向Ajax即服务器推送

.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: nowrap; color: #6d180b; font-family: Consolas, "Liberation Mono", Courier, monospace; font-size: 16px } 一.简单例子直观认识 1.1 模拟场景 假定项目中需要新增一个功能,管理员发布某些信息