本来自己想写的但是写了几句,发现语言组织能力有限。我还是在这篇文章基础上作写我的东西吧

实现项目需求及方法
目的:当数据操作发生某种异常时向相应的用户发送即时消息。例如:xx文件处理有N条数据是垃圾数据。
实现:
当数据有相应异常时,向数据库插入一条数据,并向指定用户(没有指定用户就不推送)推送消息;
前台页面监控,每个用户登录或每刷新此页面一次都调用后台程序并把用户编码传至后台存入ScriptSession,并判断当前用户有无消息,有消息立马推送;
前台该页面长连接实现接收推送信息脚本并执行。
一、需要文件:1、dwr.xml(与web.xml放在同一目录下) 2、engine.js util.js (引入相应的接受或发送页面)3、dwr.jar 将它放在你webapp的WEB-INF/lib目录下。

二、编辑配置文件
1、web.xml加入 如下:
        <servlet>
        <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>
            <description>使用服务器推技术(反转AJAX)</description>
            <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>crossDomainSessionSecurity</param-name>
         <param-value>false</param-value>
       </init-param>
        <init-param>
            <param-name>maxWaitAfterWrite</param-name>
            <param-value>100</param-value>
        </init-param>
        <load-on-startup>4</load-on-startup>
    </servlet>
     
      <servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>


注意,要把<servlet>和其他<servlet>放在一起,<servlet-mapping>要和其他<servlet-mapping>放在一起!!

2、dwr.xml 在web.xml的同一目录下,创建dwr.xml,并且将要被调用的java类写入其中。

<?xml version="1.0" encoding="UTF-8"?>
<dwr>
	<allow>
	    <create creator="spring" javascript="Remote"> 
        <param name="beanName" value="remote" /> 
        <include method="noticeNewOrder" /> 
        <include method="getData" /> 
         <include method="putMessger" /> 
         </create>
	</allow>
</dwr>



applicationContext.xml中加入<bean id="remote" class="包名.Remote"></bean>



三、编写被调用的java类
注:UserMng 和OrderMng 业务的具体类,被Spring管理 这里不做重点。
有关UserMng 和OrderMng的代码不用了解,知道是一部操作即可,与实现发送信息无直接的关系。

package com.yds.common;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.yds.sym.entity.User;
import com.yds.sym.service.UserMng;
import com.yds.taskoder.service.OrderMng;
   public class Remote{
	@Autowired
	UserMng umng;
	@Autowired
	OrderMng oMng;
	//负责将当前用id户存入ScriptSession,并判断当前用户是否要推送消息
    public void getData(String userCode) {
    	int con=0;//当前用户或者需推送用户待处理任务条数
    	try {
            WebContext wctx = WebContextFactory.get();
            //得到当前页面的session
            ScriptSession scriptSession = wctx.getScriptSession();
            
            User user=umng.findById(Integer.parseInt(userCode));//当前用户信息(写自己代码)
            Integer a=oMng.loadUserTask(user);//当前用户消息数
            con= a==null?0:a;
          //设置session属性值 用户code
            scriptSession.setAttribute("usercode",user.getId());
    		ScriptBuffer script = new ScriptBuffer();
    		if(con>0){
            	script.appendScript("InitMsgBox(").appendData(user.getRealName()).appendScript("," + con + ");");
            	//像当前访问页面的用户推送消息
            	scriptSession.addScript(script);
    		}
			
		} catch (Exception e) {
			// Todo: handle exception
			e.printstacktrace();
		}
    }
    //负责推送消息
    public void putMessger(String departementid){
    	int con=0;//当前用户或者需推送用户待处理任务条数
    	try {
    		Integer a=oMng.countOfOrders(Integer.parseInt(departementid));
    		con= a==null?0:a+1;
    		Map<Integer,Integer> map=new HashMap<Integer,Integer>();//存放需要推送的用户id
    		List<User> list=umng.findUserBydpId(Integer.parseInt(departementid));//获取需要推送的所有用户
    		for (int i = 0; i < list.size(); i++) {
    			User u=list.get(i);
    			map.put(u.getId(),u.getId());
    		}
    		if(!map.isEmpty()){
    			this.noticeNewOrder(con,map);
    		}
			
		} catch (Exception e) {
			// Todo: handle exception
			e.printstacktrace();
		}
    }
    // 得到推送信息并推送
    public void noticeNewOrder(int con,Map<Integer,Integer> umap) {
        WebContext wctx = WebContextFactory.get();
        ScriptBuffer script = new ScriptBuffer();
        //指定的页面(可以是动态的哟。。。我这个地址指向的是目标页面)
        String currentPage = "/sycj/login/symSubmit.action";
        //得到登录此页面的scriptSession的集合
        Collection<ScriptSession> pages = wctx.getScriptSessionsByPage(currentPage);
        for (ScriptSession session: pages) {
            if(session.getAttribute("usercode")!=null){
            	Integer userinfo=(Integer)session.getAttribute("usercode");
            	//判定目标用户推信息
	            if(umap.containsValue(userinfo)){
	            	User user=umng.findById(userinfo);
	            	script.appendScript("InitMsgBox(").appendData(user.getRealName()).appendScript("," + con + ");");
	                session.addScript(script);
	            }
            }
           
        }
    }
}


四、测试dwr

将代码放入应用服务器(比如Tomcat),启动。
然后在地址栏输入http://localhost:8080/你的工程/dwr
然后点击Remote 可以看见它的两个方法getData(),noticeNewOrder() ,putMessger()说明dwr已配置成功!

五、编写jsp 和 消息框js

1、消息框activeReverseAjax.js 代码如下:
//消息框初始化
function InitMsgBox(fileName,mun) {
    var messageBox = document.getElementById("myMessageBox");
    messageBox.style.width = 180;
    messageBox.style.height = 110;
    messageBox.style.border = "solid black 1px";
    messageBox.style.position = "absolute";
    messageBox.style.right = 0;
    messageBox.style.bottom = 0;
    messageBox.style.display = "none";

    var titleContent = "";// 消息框内容
    var Csstext = "margin:1px;color:black; border:2px outset;background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:hand;";

    titleContent = titleContent
            + "<table width=100% height=100% cellpadding=0 cellspacing=0 border=0 >";
    titleContent = titleContent
            + "<tr style=';font-size:12px;background:#0099CC;height:20px;cursor:default'>";
    titleContent = titleContent
            + "<td style='color:white;padding-left:5px'>消息提示</td>";
    titleContent = titleContent
            + "<td style='color:#ffffff;padding-right:5px;' align=right>";
    titleContent = titleContent
            + "<span id=Close onclick='pophide()' style='" + Csstext
            + "font-family:System;padding-right:2px;' title='关闭'>x</span>";
    titleContent = titleContent + "</td></tr><tr><td colspan=2>";
    titleContent = titleContent
            + "<div id=include style='overflow:scroll;overflow-x:hidden;overflow-y:auto;HEIGHT:100%;padding-left:5px;padding-top:3px;font-size:12px;'>";
    titleContent = titleContent + "您好!"+fileName ;
    titleContent = titleContent + ",有" + mun + "条任务单等待您处理,";
    titleContent = titleContent + "请及时处理!<br>";
    titleContent = titleContent + "<br><br><br><br>";
    titleContent = titleContent + "</div>";
    titleContent = titleContent + "</td></tr></table>";
    messageBox.innerHTML = titleContent;
    // 消息框弹出方法
    $("#myMessageBox").slideDown(1000);
}

// 消息框关闭方法
function pophide() {
    $('#myMessageBox').slideUp(1000);
}
function updatePollStatus(pollStatus) {
    dwr.util.setValue("pollStatus",pollStatus ? "Online" : "Offline",{escapeHtml:false});
}

// 页面body onload方法
function tempOnLoad() {
    dwr.engine.setActiveReverseAjax(true);
}



2、监控发送页面 在webapp目录下不做介绍重点。

注意:引入Remote.js、engine.js、util.js路径以测试页面上的路径为准。
        <script type='text/javascript' src="<%=request.getcontextpath()%>/dwr/interface/Remote.js"></script>
        <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()%>/js/dwr/activeReverseAjax.js"></script>
        <script type="text/javascript" src="<%=request.getcontextpath()%>/js/jquery-1.4.2.min.js"></script>
        <script type="text/javascript">
            var path="<%=request.getcontextpath()%>";
            $(function(){
                 var code=$('#usercode').val();//这里是你传入的参数,可以是直接写自己的值
                 Remote.getData(code);//调用后台程序
            })
           
        </script>
你的目标页面必须要有<div id="myMessageBox"></div>这是消息框,



当你在页面进行了操作需要向指定用户发送消息时调用这个js Remote.putMessger(自己的值)函数,后台判断推送的目标用户

SSH项目中使用DWR框架实现即时精确消息推送的更多相关文章

  1. HTML5实现直播间评论滚动效果的代码

    这篇文章主要介绍了HTML5实现直播间评论滚动效果的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  4. HTML5中的Web Notification桌面通知功能的实现方法

    这篇文章主要介绍了HTML5中的Web Notification桌面通知功能的实现方法,需要的朋友可以参考下

  5. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  6. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. ios – Testflight无法安装应用程序

    我有几个测试人员注册了testflight并连接了他们的设备……他们有不同的ios型号……但是所有这些都有同样的问题.当他们从“safari”或“testflight”应用程序本身单击应用程序的安装按钮时……达到约90%并出现错误消息…

  9. xcode找不到匹配的配置文件

    我有一个AdhociOS应用程序,它给了我“在xcode6中找不到匹配的配置文件”,我创建了一个Adhoc配置文件,下载它,双击它并在General–Identity下选择了一个团队.但我接着得到了那条消息,并尝试使用“修复问题”按钮没有帮助.在构建设置–供应配置文件–发布我有“自动”.任何人都可以帮助我,我完全迷失了……

  10. ios – Reactive Cocoa – 以编程方式设置文本时不会调用UITextView的rac_textSignal

    我正在实现一个聊天UI,并使用ReactiveCocoa根据用户的类型调整聊天气泡的大小.目前,我正在基于textview的rac_textSignal更新UI的布局.一切都很好–除了一点:当用户发送消息时,我以编程方式清除文本字段:…我是否需要拥有一个持有currentTypedString的Nsstring,并在该字符串更新时驱动UI更改?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部