参考: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);