实例分为两个页面
sendMsg.jsp页面 ,发送一段消息给后台 ,然后后台将消息推送到showMsg.jsp页面
web.xml配置
- <?xmlversion="1.0"encoding="UTF-8"?>
- <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID"version="2.5">
- <display-name>dwr3</display-name>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>dwr-invoker</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>
- <!--使用polling和comet的方式-->
- <init-param>
- <param-name>pollAndCometEnabled</param-name>
- <param-value>true</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <url-pattern>/dwr/*</url-pattern>
- </servlet-mapping>
- </web-app>
sendMsg.java 推送类
- packagecom.zf.dwr;
- importjava.util.Collection;
- importorg.directwebremoting.ScriptBuffer;
- importorg.directwebremoting.ScriptSession;
- importorg.directwebremoting.WebContext;
- importorg.directwebremoting.WebContextFactory;
- importorg.directwebremoting.proxy.dwr.Util;
- publicclassSendMsg{
- @SuppressWarnings("deprecation")
- publicvoidsendMsg(Stringmsg){
- //得到上下文
- WebContextcontex=WebContextFactory.get();
- //得到要推送到的页面dwr3为项目名称,一定要加上。
- Collection<ScriptSession>sessions=contex.getScriptSessionsByPage("/dwr3/showMsg.jsp");
- //不知道该怎么解释这个,
- Utilutil=newUtil(sessions);
- //下面是创建一个javascript脚本,相当于在页面脚本中添加了一句show(msg);
- ScriptBuffersb=newScriptBuffer();
- sb.appendScript("show(");
- sb.appendData(msg);
- sb.appendScript(")");
- //推送
- util.addScript(sb);
- }
- }
dwr.xml配置
- <!DOCTYPEdwrPUBLIC
- "-//GetAheadLimited//DTDDirectWebRemoting3.0//EN"
- "http://getahead.org/dwr/dwr30.dtd">
- <dwr>
- <allow>
- <createcreator="new"javascript="SendMsg">
- <paramname="class">com.zf.dwr.SendMsg</param>
- </create>
- </allow>
- </dwr>
sendMsg.jsp
- <%@pagelanguage="java"contentType="text/html;charset=utf-8"
- pageEncoding="utf-8"%>
- <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <Metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
- <scripttype="text/javascript"src="dwr/util.js"></script>
- <scripttype="text/javascript"src="dwr/engine.js"></script>
- <scripttype="text/javascript"src="dwr/interface/SendMsg.js"></script>
- <scripttype="text/javascript"src="jquery-1.7.1.js"></script>
- <scripttype="text/javascript">
- $(function(){
- dwr.engine.setActiveReverseAjax(true);
- $("#but").click(function(){
- SendMsg.sendMsg($("#msg").val());
- });
- });
- </script>
- <title>Inserttitlehere</title>
- </head>
- <body>
- <inputtype="text"id="msg"/>
- <inputtype="button"value="发送"id="but"/>
- </body>
- </html>
showMsg.jsp
- <scripttype="text/javascript"src="jquery-1.7.1.js"></script>
- <scripttype="text/javascript">
- $(function(){
- //这句话千万不能少,表示允许使用推送技术
- //这个函数是提供给后台推送的时候调用的
- functionshow(msg){
- $("#message").text(msg);
- </script>
- <title>Inserttitlehere</title>
- </head>
- <body>
- <divid="message"style="width:200px;height:200px;border:1pxsolidred;text-align:center;padding:5px;"></div>
- </html>
使用dwr推送技术时 需要有WebContext 对象,但是WebContext 对象需要通过WebContextFactory.get();获取 , 而WebContextFactory.get(); 方法只有当页面请求某个java方法时,在该方法中调用WebContextFactory.get(); 才能得到值。 否则是取不到值的。
然后通过WebContext 获取指定的页面 。再向页面推送消息 。
有一个问题是当后来又新开了页面,却收不到消息 。
可以使用一个线程,去定时的更新Collection<ScriptSession> 对象