web.xml
<servlet> <servlet-name>dwr-invoke</servlet-name> <servlet-class> uk.ltd.getahead.dwr.DWRServlet </servlet-class> <init-param> <param-name> debug </param-name> <param-value> true </param-value> </init-param> <init-param> <!-- 这个是DWR2.0必须的,不然会报java.lang.IllegalArgumentException --> <param-name> classes </param-name> <param-value> java.lang.Object </param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoke</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
在Web-INF下创建dwr.xml
<?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>
<convert match="com.relonger.ccljent.entity.Message" converter="bean"> <!--javaBean-->
<param name="include" value="msg,time" />
</convert>
<create creator="spring" javascript="ChatService">
<param name="beanName" value="chatService" />
</create>
</allow>
</dwr>
ChatService 服务端
public class ChatService implements ApplicationContextAware {
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
this.ctx = ctx;
}
/**
* <b>function:</b> 向服务器发送信息,服务器端监听ChatMessageEvent事件,当有事件触发就向所有客户端发送信息
* * @author hoojo
* * @createDate 2011-6-8 下午12:37:24
* * @param msg
* */
public void sendMessage(Message msg) {
//发布事件
ctx.publishEvent(new ChatMessageEvent(msg));
}
}
ChatMessageClient 客户端
public class ChatMessageClient implements ApplicationListener,
ServletConfigAware {
private ServletContext ctx;
public ServletContext getCtx() {
return ctx;
}
public void setCtx(ServletContext ctx) {
this.ctx = ctx;
}
@Override
public void onApplicationEvent(ApplicationEvent event) {
//如果事件类型是ChatMessageEvent就执行下面操作
if (event instanceof ChatMessageEvent) {
Message msg = (Message) event.getSource();
ServerContext context = ServerContextFactory.get();
//获得客户端所有chat页面script session连接数
if(ctx != null){
System.out.print("==========");
}
WebContext contex = WebContextFactory.get();
if(contex != null){
System.out.print("====>>>>>>>");
}
Collection<ScriptSession> sessions = context.getScriptSessionsByPage("/DWR/chat.jsp");
// Collection<ScriptSession> sessions = context.getScriptSessionsByPage(ctx.getContextPath() + "/chat.jsp");
for (ScriptSession session : sessions) {
ScriptBuffer sb = new ScriptBuffer();
Date time = msg.getTime();
String s = time.getYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate() + " "
+ time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
//执行setMessage方法
sb.appendScript("showMessage({msg: '")
.appendScript(msg.getMsg()).appendScript("', time: '")
.appendScript(s)
.appendScript("'})");
System.out.println(sb.toString());
//执行客户端script session方法,相当于浏览器执行JavaScript代码
//上面就会执行客户端浏览器中的showMessage方法,并且传递一个对象过去
session.addScript(sb);
}
}
}
@Override
public void setServletConfig(ServletConfig arg0) {
// TODO Auto-generated method stub
}
}