dwr 使用

2 篇文章 0 订阅

参考:http://www.directwebremoting.org/dwr/introduction/getting-started.html
http://blog.csdn.net/lxn39830435731415926/article/details/45799467
dwr很老的东西,官网的demo是09年的,本来想直接集成springmvc用注解那种,但是看官方的例子知道spring3.x版本,实际我们使用的是4.0的,就放弃了,用dwr单独管理那种方法带配置文件的那种

注意,

Browser.withCurrentPageFiltered 和 Browser.withAllSessionsFiltered 的不同,如果是不同的页面监听不同的session,使用withAllSessionsFiltered

 


1.引入dwr
<dependency>
<groupId>org.directwebremoting</groupId>
<artifactId>dwr</artifactId>
<version>3.0</version>
</dependency>
2.web.xml加入
<!--dwr配置开始 -->
  <servlet>
  <description>Direct Web Remoter Servlet</description>
  <display-name>DWR Servlet</display-name>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>

    <!-- This should NEVER be present in live -->
    <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param>
      
    <!-- Remove this unless you want to use active reverse ajax -->
    <init-param>
      <param-name>activeReverseAjaxEnabled</param-name>
      <param-value>true</param-value>
    </init-param>




    <!-- By default DWR creates application scope objects when they are first
    used. This creates them when the app-server is started -->
    <init-param>
      <param-name>initApplicationScopeCreatorsAtStartup</param-name>
      <param-value>true</param-value>
    </init-param>




    <load-on-startup>2</load-on-startup>
  </servlet>
   
   
  <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
  
  <!--dwr配置结束 -->


3.增加dwr.xml,和web.xml同级。这里注意用的是creator="spring" ,让spring自动管理。因为service层以前是自动管理的,所以对应的类,我加到了service层,对应使用value就是spring管理的bean的名称。如果creator="new" 那么就不是spring管理,name就应该是"class" 对应的value填写对应类的全路径
<?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="spring" javascript="alterInfoMessager">
      <param name="beanName" value="alterInfoMessagerService"/>
    </create>
    <convert converter="bean" match="com.xxx.vo.DwrMessageVO"/>
  </allow>
</dwr>


4.service层增加对应的类,保证service在配置中能被扫描到,能自动注入。
package com.xxx.dwr.service;




import com.xxxx.vo.DwrMessageVO;




接口
/**
 * 
 * 修改信息消息管理者
 * @author xxx
 *
 *  @date 2017年6月14日 下午7:11:19
 */
public interface AlterInfoMessagerService {
/**
* 推送修改消息
* @param vo
* @author xxxx
* @date 2017年6月15日 上午11:13:40
*/
public void pushAlterMsg(DwrMessageVO vo);
}


实现类
package com.xxxx.dwr.service.impl;




import org.directwebremoting.Browser;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;
import org.directwebremoting.ScriptSessions;
import org.directwebremoting.WebContextFactory;
import org.springframework.stereotype.Service;




import com.xxxx.dwr.service.AlterInfoMessagerService;
import com.xxxx.vo.DwrMessageVO;




/**
 * 修改信息消息管理者
 * @author xxx
 *
 *  @date 2017年6月14日 下午7:13:20
 */
@Service("alterInfoMessagerService")
public class AlterInfoMessagerServiceImpl implements AlterInfoMessagerService{




//过滤的属性
private final static String SCRIPT_SESSION_SHIXIANG_GUID = "SCRIPT_SESSION_SHIXIANG_GUID";


private DwrMessageVO currentVo;

@Override
public void pushAlterMsg(DwrMessageVO vo) {
currentVo  = vo;
        ScriptSessionFilter attributeFilter= new AttributeScriptSessionFilter(SCRIPT_SESSION_SHIXIANG_GUID);




        Browser.withCurrentPageFiltered(attributeFilter, new Runnable()
        {
            public void run()
            {
            //回调
            ScriptSessions.addFunctionCall("receiveAlterMsg", currentVo);
            currentVo=null;
            }
        });
}

public void addAttributeToScriptSession(DwrMessageVO vo) {
       ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
       scriptSession.setAttribute(SCRIPT_SESSION_SHIXIANG_GUID, vo.getShiXiangGuid());
}




    public void removeAttributeToScriptSession() {
        ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
        scriptSession.removeAttribute(SCRIPT_SESSION_SHIXIANG_GUID);
    }


/**

* @author xxxx
*
*  @date 2017年6月14日 下午7:47:35
*/
protected class AttributeScriptSessionFilter implements ScriptSessionFilter
    {
        public AttributeScriptSessionFilter(String attributeName)
        {
            this.attributeName = attributeName;
        }




        /* (non-Javadoc)
         * @see org.directwebremoting.ScriptSessionFilter#match(org.directwebremoting.ScriptSession)
         */
        public boolean match(ScriptSession session)
        {
            Object check = session.getAttribute(attributeName);
            if(check==null){
            return false;
            }
            if(attributeName.equals(SCRIPT_SESSION_SHIXIANG_GUID)){
            return check.equals(currentVo.getShiXiangGuid());
            }
            return false;
        }




        private final String attributeName;
    }






}
5.
增加了一个消息传递的vo类,目前只有一个属性,后面根据需要对应的自己增加属性
package com.xxxx.vo;








/**
 * 消息传输类
 * @author xxxx
 *
 *  @date 2016年5月24日 下午12:21:10
 */
public class DwrMessageVO {

/**
* 事项guid,根据业务不同,是不同业务的主键
* shiXiangGuid
*/
private String shiXiangGuid;

public DwrMessageVO() {




}




public String getShiXiangGuid() {
return shiXiangGuid;
}




public void setShiXiangGuid(String shiXiangGuid) {
this.shiXiangGuid = shiXiangGuid;
}




}
6.引入js,js都是自动生成的。
<script type="text/javascript" src="${base}/dwr/engine.js"></script>
<script type="text/javascript" src="${base}/dwr/util.js"></script>
<!--根据业务不同,调用不同的业务js-->
<script type="text/javascript" src="${base}/dwr/interface/alterInfoMessager.js"></script>


$(function() {
initEngine();//初始化dwr引擎
});
//初始化dwr引擎 
function initEngine(){
dwr.engine.setActiveReverseAjax(true);//开启服务器推

dwr.engine.setNotifyServerOnPageUnload(true);//当页面被卸载时,让ScriptSession失效。
dwr.engine.setErrorHandler(errorHandler);//设置错误处理函数
var obj={"shiXiangGuid":xxxx};//事项guid 事情的主键,根据业务不同,传递不同,区分不同业务
alterInfoMessager.addAttributeToScriptSession(obj);//加入修改信息消息管理     
}




//错误处理
function errorHandler(message, ex) {
alert(message);
}




//dwr接受修改消息回调方法
function receiveAlterMsg(messages) {
    对应处理自己的事
}


//对应要发消息的地方调用如下
var obj={"shiXiangGuid":xxxxx};
alterInfoMessager.pushAlterMsg(obj);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值