直接贴代码吧。这里dwr并没有配置到spring的xml里面,因为试图配置的时候,总是找不到interface下的js。后来选择直接配置,创建方式改为spring,想必也是一样的。
dwr.xml
dwr-invoker
org.directwebremoting.servlet.DwrServlet
contextConfigLocation
/WEB-INF/dwr.xml
debug
true
crossDomainSessionSecurity
false
scriptCompressed
false
pollAndCometEnabled
true
disconnectedTime
5000
dwr-invoker
/dwr/*
org.directwebremoting.servlet.EfficientShutdownServletContextListener
org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener
这段代码要说一下,creator="spring"是说把该类交由spring来管理,,这里一定得是beanName,value是你注入的名称,如@service("testDwr")。
TestDwr.java
@Service("testDwr")
public class TestDwr {
@Autowired
private QuestionMapper qm;
public String hello() {
System.out.println("3333");
sendMsg("hello tui tui");
return "hello world!";
}
public String helloworld(String world) {
Question q = new Question();
q.setCreator("kehui");
q.setAnswer("yjing");
qm.insert(q);
return "hello " + world;
}
}
至此其实一般使用就够了。但如果要推送怎么办呢?
推送的配置,在上面的web.xml中已经配置好了。
在代码中,你要推送,可以分为在dwr中推送和在dwr外推送。这个怎么理解呢?比如你调用一个dwr的方法,在这个方法执行过程中推送,这叫dwr里面推。 如果你在一个controller方法里执行推送,这叫外部。
以下讲在springMVC中,两种推送的调用方式,我提供一个推送类,可以直接copy,一般使用都没有问题的。
import org.directwebremoting.*;
import org.directwebremoting.proxy.dwr.Util;
import javax.servlet.ServletContext;
import java.util.Collection;
/**
* Created by kehui on 2014/8/19.
*/
public class SendMessageUtil {
private static void sendMsg(String functionName, String pageUrl, ServerContext context, Object... params) {
Collection sessions = context.getScriptSessionsByPage(pageUrl);
if (sessions == null || sessions.size() == 0)
return;
Util util = new Util(sessions);
if (params == null) {
util.addFunctionCall(functionName);
return;
}
switch (params.length)
{
case 0 :
util.addFunctionCall(functionName);
break;
case 1 :
util.addFunctionCall(functionName, params[0]);
break;
case 2 :
util.addFunctionCall(functionName, params[0], params[1]);
break;
case 3 :
util.addFunctionCall(functionName, params[0], params[1], params[2]);
break;
case 4 :
util.addFunctionCall(functionName, params[0], params[1], params[2], params[3]);
break;
case 5 :
util.addFunctionCall(functionName, params[0], params[1], params[2], params[3], params[4]);
break;
case 6 :
util.addFunctionCall(functionName, params[0], params[1], params[2], params[3], params[4], params[5]);
break;
case 7 :
default :
util.addFunctionCall(functionName, params[0], params[1], params[2], params[4], params[5], params[6], params[7]);
break;
}
}
public static void sendMsg(String functionName, String pageUrl, Object... params) {
//得到上下文
WebContext context = WebContextFactory.get();
sendMsg(functionName, pageUrl, context, params);
}
public static void sendMsgOther(String functionName, String pageUrl, ServletContext context, Object... params) {
//得到上下文
ServerContext serverContext = ServerContextFactory.get(context);
sendMsg(functionName, pageUrl, serverContext, params);
}
}
if (sessions == null || sessions.size() == 0)
return;
这句很重要,在外部使用的时候,如果没有客户端页面,是没法推的。我是用定时器发现这个问题的,每隔5秒去推一次,但我的项目刚启动,获取不到scriptsession,报了几次空指针之后,就出socket异常,目前也没有完全解决,只是做了空指针判断,会好点,期待有更好的办法解决这个问题。
* springMVC获取servletcontext,要实现ServletContextAware
* 要用到推送的话,在页面上一定要加上一句 dwr.engine.setActiveReverseAjax(true);