`
vista_move
  • 浏览: 30219 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DWR后台推送技术

    博客分类:
  • java
阅读更多
最近工作需要写一个后台推送消息到浏览器提示用户操作的功能,在网上摸索了几天,有的是比较乱的,会造成一些误导,现在把自己应用笔记写下来跟大家分享。

第一步:下载dwr.jar、commons-logging.jar(我这里用的是dwr3.0)导入到自己的工程里。

第二步:修改web.xml,加入以下code
<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>
  <servlet-mapping>
  
    <servlet-name>dwr-invoker</servlet-name>
    
    <url-pattern>/dwr/*</url-pattern>
  
  </servlet-mapping>

第三步:编写java类

1.MessagePush类
package com.dwr.messagemind.service;

import javax.servlet.ServletException;

import org.directwebremoting.ScriptSession;
import org.directwebremoting.WebContextFactory;

import com.dwr.messagemind.servlet.DwrScriptSessionManagerUtil;


public class MessagePush {

	 public void onPageLoad(String userId) {

         ScriptSession scriptSession = WebContextFactory.get().getScriptSession();

         System.out.println("scriptSession:" + scriptSession);
         
         scriptSession.setAttribute("userId", userId);

         DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();

         try {

        	 dwrScriptSessionManagerUtil.init();

         } catch (ServletException e) {

                e.printStackTrace();

         }

  }
}



2.DwrScriptSessionManagerUtil类
package com.dwr.messagemind.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;

import org.directwebremoting.Container;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.event.ScriptSessionEvent;
import org.directwebremoting.event.ScriptSessionListener;
import org.directwebremoting.extend.ScriptSessionManager;
import org.directwebremoting.servlet.DwrServlet;

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() + "";
				String userId = "123";

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

	}

}



3.DwrTool类(前台页面在需要推送的地方调用此类的方法)
package com.dwr.messagemind.service;

import java.util.Collection;

import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;

public class DwrTool {

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

				}

			}

		});

	}
}



第四步:配置dwr.xml,在web.xml同级位置新建dwr.xml

<?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="new" javascript="MessagePush">
	  		<param name="class" value="com.dwr.messagemind.service.MessagePush"/>
		</create>
		<create creator="new" javascript="DwrTool">
	  		<param name="class" value="com.dwr.messagemind.service.DwrTool"/>
		</create>
	</allow>
</dwr>


第五步:编写jsp页面测试

接收页面需要做以下变动:
<script type="text/javascript" src="<%=path%>/dwr/engine.js"></script>
        <script type="text/javascript" src="<%=path%>/dwr/util.js"></script>
        <script type="text/javascript" src="<%=path%>/dwr/interface/MessagePush.js"></script>
<script type="text/javascript">
			function onPageLoad(){
             	MessagePush.onPageLoad("123");
          	}
          	function showMessage(autoMessage) {
          		alert(autoMessage);
          		document.all.bb.innerHTML = autoMessage;
          	}
		</script>


<body onload="dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);onPageLoad();">


前两项为dwr配置,第三个调用js方法出发MessagePush.onPageLoad('')方法,注意MessagePush为在dwr中配置的类名,并且需要在页面引入MessagePush.js,这个为系统自动生成,不需要自己创建.engine.js、util.js也为系统自动生成,不需要自己创建,只许引入即可。

发送页面做以下配置

引入
		<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/engine.js"></script>
        <script type="text/javascript" src="<%=request.getContextPath()%>/dwr/util.js"></script>
        <script type="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/DwrTool.js"></script>

<script type="text/javascript">
		
		function send(message) {
			DwrTool.sendMessageAuto("123", message);
		}
</script>

在需要调用的地方调用js方法send('')即可。

注:因为dwr用的ajax反转方式实现推送,所以如果在ajax方法里调用send()是没有效果的,会报异常,当然在发送页面将dwr设置成同步方式可以发送成功(我实验的时候会先弹出一个错误窗口,但是还可以实现效果),只许在<body>加入
onlocad="dwr.engine.setAsync(false);"


当然如果出现弹出错误窗口交互不好,继续想办法,既然不能在ajax里面调用,还希望成功的时候调用send(),那就用<iframe>吧,

<form action="你要请求的servlet" method="post" id="inputform" name="inputform" target="hidden_frame">
			<iframe id="hidden_frame" name="hidden_frame" style="display: none;"></iframe>


接下来提交form到后台servlet,后台处理成功之后调用send();
response.getWriter().print("<script>");
				response.getWriter().print("parent.send('成功了');");
				response.getWriter().print("</script>");


至此已经都说完了,如果有疑问请留言吧。
1
0
分享到:
评论
2 楼 vista_move 2014-11-03  
不好意思到现在才回复你,好久没登陆了。下面回答你的疑问,因为在ajax回调方法了用DWR send会失败,所以换一种方式,其实这就是一种伪ajax:
1.在你的form属性中加入
target="hidden_frame"

2.在页面中加入
<iframe id="hidden_frame" name="hidden_frame" style="display: none;"></iframe>  

解释一下,这段代码的效果就是在不刷新页面的情况下完成表单的提交操作(这不就是ajax嘛,嘿嘿),如果不这么操作那么当前页面的URL地址就变成你的form action="URL"地址了
1 楼 jzzwy 2014-03-06  
不错的文章 ,
虽然最后你用form 和Iframe 和后台发送 不太明白 ,但总算成功,没出现问题,
我直接点击按钮 send的

相关推荐

    dwr后台推送

    总的来说,DWR后台推送技术通过长连接或者定期轮询实现了服务器到客户端的数据实时推送,为Web应用提供了类似桌面应用的交互体验。了解并掌握DWR的推送机制,以及在不同版本和框架下的应用,对于提升Web应用的实时性...

    DWR 后台推送(线程监听、多页面推送,附完整实例)

    测试的时候,打开两个页面,分别是生产数据页面还有查看数据页面,当点击生产数据页面后,查看数据页面就会收到从后台推送过来的数据。http://yun.baidu.com/share/link?shareid=1734778619&uk=2031663908

    dwr 消息后台推送

    综上所述,"DWR消息后台推送"涉及到的主要知识点包括DWR的工作原理、后台推送技术的应用、DWR的配置与JavaScript接口使用、服务器端逻辑实现、以及性能优化和兼容性考虑。这个例子为开发者提供了一个实践DWR后台推送...

    springMVC+dwr技术实现消息推送实例

    传统的Ajax技术通常依赖于浏览器发起请求,而DWR则允许服务器主动向客户端推送数据,无需等待用户的操作。这种特性使得DWR在实时应用如聊天、股票报价、在线游戏等场景中非常有用。 **消息推送原理** 消息推送的...

    dwr+spring实现后台向前台推送实例

    本实例是在一些网络资料的基础上整合出来的一个:以后台向前台页面推送消息的一个完整实例工程,采用了spring、dwr反转,实现的是后台向前台不断推送消息,并管理相关用户退出;可以用在如定时任务的桌面消息提醒之...

    Java Dwr实现消息精准推送以及js调用后台+demo

    在“Java Dwr实现消息精准推送以及js调用后台+demo”这个主题中,我们将深入探讨如何利用DWR来实现高效的消息推送和JavaScript与后台Java的交互。以下是一些关键知识点: 1. **DWR基础**:DWR的核心功能是提供一种...

    DWR后台精准推送信息至前台

    在“DWR后台精准推送信息至前台”这个主题中,我们将深入探讨DWR如何实现消息推送,并为初学者提供一个入门的指南。 1. **DWR基础概念**: - **Direct Web Remoting**:DWR的核心理念是创建一种无缝的接口,让...

    dwr消息推送demo

    以后台向前台页面推送消息的一个完整实例工程,采用了spring、dwr反转,实现的是后台向前台不断推送消息,并管理相关用户退出;可以用在如定时任务的桌面消息提醒之类的场景。改变传统的前台定时刷新/请求后台的工作...

    dwr实现前台监控 后台推送即时信息 入门必看资料

    "后台推送即时信息"是DWR的一个重要应用。在传统的HTTP协议下,服务器只能响应客户端的请求,而无法主动发送数据。DWR通过Comet技术打破了这一限制,使得服务器可以在有新消息时主动推送给客户端。具体实现可以通过...

    springMvc + dwr 注解 实现消息推送

    在IT行业中,消息推送是一项关键的技术,特别是在实时性要求较高的应用中,如社交网络、协作工具等。本项目结合了Spring MVC和Direct Web Remoting (DWR)框架,利用注解的方式实现了一种高效的消息推送机制,支持对...

    DWR反向推送

    DWR的核心特性之一就是反向推送技术,也称为服务器推送,它允许服务器主动将数据推送到客户端,而不仅仅是响应用户的请求。 **反向推送(Reverse Ajax)** 反向推送是相对于传统Ajax请求的一种概念,传统Ajax是...

    dwr 消息推送

    在服务器端,可以创建一个后台服务,当有新的消息时,调用DWR的API将消息推送给特定的客户端。 6. **安全性**:DWR提供了安全机制,如CORS(跨源资源共享)配置、IP白名单、会话管理等,确保只有授权的客户端能够...

    dwr3后台推送最简单的使用(根据"说好的729呢"的博客制作)

    在DWR3中,引入了后台推送(Push)功能,这是一种服务器主动向客户端发送数据的技术,不同于传统的HTTP请求-响应模式,它使得实时性更强,常用于构建实时更新的应用,如聊天室、股票报价或在线游戏等。 首先,要...

    dwr2.0后台推送demo,包含第三方登陆

    dwr2.0后台推送demo,包含第三方登陆,响应成功(是根据sessionID)做的判断。 内含dwr2.0.jar,js都在包里的不用另外找的

    基于Java和JavaScript的DWR消息推送设计源码

    该系统模拟了消息推送功能,实现从后台向前台页面实时推送消息。适合DWR初学者上手,通过导入工程并部署在Tomcat服务器上,可以体验实时消息推送的效果。用户在登录页面输入特定密码后,可接收服务端推送的消息,并...

    接收Socket消息通过DWR推送到界面显示

    3. **DWR推送技术**:DWR的推送功能是其一大特色,它使得服务器可以主动将数据推送给客户端,而不是等待客户端发起请求。这种机制通常被称为Comet技术,它可以实现实时性,比如聊天应用、股票报价或者在线游戏等场景...

    DWR推送功能实现实例(前段,后台函数互调)

    在"**DWR推送功能实现实例(前段,后台函数互调)**"中,我们将深入探讨如何利用DWR来实现实时的双向通信。 **DWR的基本原理**: DWR的核心是通过动态生成JavaScript库,使JavaScript可以直接调用Java对象的方法。...

    dwr实现前台监控 后台推送即时信息

    在本文中,我们将探讨如何使用DWR实现前台监控并进行后台即时信息推送。 首先,理解DWR的工作原理至关重要。DWR通过在服务器端运行一个Servlet,这个Servlet负责接收JavaScript的请求,执行相应的Java方法,然后将...

    dwr消息推送 实现的聊天

    标题 "dwr消息推送 实现的聊天" 描述了如何使用Direct Web Remoting (DWR)框架来构建实时的消息推送功能,实现一个聊天应用。DWR是一个Java库,它允许在浏览器和服务器之间进行双向通信,即AJAX的增强版,使得动态...

Global site tag (gtag.js) - Google Analytics