1、web.xml的配置,红色部分为dwr推技术的主要配置
<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>
<param-name>logLevel</param-name>
<param-value>ERROR</param-value>
</init-param>
<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>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>
<!-- 开启反转Ajax 即所谓推技术 -->
<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>1000</param-value>
</init-param>
<!-- 对dwr scriptSession 自定义管理 -->
<init-param>
<param-name>org.directwebremoting.extend.ScriptSessionManager</param-name>
<param-value>com.xx.xx.util.DwrScriptSessionManagerUtil</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2、由于使用dwr推技术,在每次刷新的时候都会产生一个新的scriptsession,而dwr本身并没有对旧的scriptsession进行处理,所以需要自己对其进行处理,在初始化配置中加入自己的scriptsession管理类:DwrscriptSessionManagerUtil
public class DwrScriptSessionManagerUtil extends DefaultScriptSessionManager{
public static final String SS_ID="DWR_ScriptSession_Id";
public DwrScriptSessionManagerUtil(){
try{
addScriptSessionListener(new ScriptSessionListener() {
public void sessionDestroyed(ScriptSessionEvent event) {
}
public void sessionCreated(ScriptSessionEvent event) {
ScriptSession scriptSession = event.getSession();//得到新创建的scriptSession
HttpSession httpSession = WebContextFactory.get().getSession();//得到产生的httpSession
Users user = (Users) httpSession.getAttribute(Constant.LG_SESSION_USER);//得到当前用户
//如果当前用户已经退出系统,然后销毁这个scriptsession
if(user==null)
{
scriptSession.invalidate();
httpSession.invalidate();
return;
}
String ssId = (String) httpSession.getAttribute(SS_ID);//查找SS_ID
if(ssId!=null)
{
//说明已经存在旧的scriptSession.注销这个旧的scriptSession
DefaultScriptSession oldScriptSession = sessionMap.get(ssId);
if(oldScriptSession!=null)
{
invalidate(oldScriptSession);
}
}
httpSession.setAttribute(SS_ID,scriptSession.getId());
scriptSession.setAttribute(Constant.LG_USER_ID,user.getId());//绑定用户ID到ScriptSession上
}
});
}catch (Exception e) {
System.out.println("zhelichucuo");
e.printStackTrace();
}
}
public static void invalidate(String ssId)
{
Browser.withSession(ssId,new Runnable() {
public void run() {
Collection<ScriptSession> sessions = Browser.getTargetSessions();
for(ScriptSession session : sessions)
{
session.invalidate();
}
}
});
}
}
3.js中开启dwr推功能
在window.onload中使用dwr.engine.setActiveReverseAjax(true);
//dwr3使用新的方式进行推送,2的方法已被注明为过时,一般来说,很少是做全推送的,基本都是有针对性的半推
//送,所以我们将使用一个过滤器来过滤要推送的scriptsession,这里涉及到我的具体业务,这个过滤器的原理是会对
//所有的进行循环过滤后,将符合条件的scriptsession存放到一个集合中,才开启新线程进行处理的。
Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
public boolean match(ScriptSession session) {
Long loginUserId = (Long) session.getAttribute(Constant.LG_USER_ID);
if(loginUserId!=null && targetIdList.contains(loginUserId))
{
targetIdList.remove(loginUserId);//如果找到了,说明将被推送,所以不用再处理,剩下的都是要被处理的
return true;
}
return false;
}
},new Runnable() {
private ScriptBuffer script = new ScriptBuffer();
public void run()
{
script.appendCall("这里写你页面的js函数",这个参数是传给js函数的);
Collection<ScriptSession> sessions = Browser.getTargetSessions();
for (ScriptSession scriptSession : sessions)
{
scriptSession.addScript(script);
}
//ScriptSessions.addFunctionCall("ExtTalk.updateMegGroup",data);//之所以不用这个方法,是因为这个
//方法有bug的存在,会对所有不论过不过滤的scriptsession进行推送,相当于全推送,没有起到过滤的作用
}
});