首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

dw之IM项目(第一个容易的dwr推送程序)

2012-12-20 
dw之IM项目(第一个简单的dwr推送程序)2.3第一个简单的dwr推送程序第一步à?将dwr相关的jar包导入到工程第二

dw之IM项目(第一个简单的dwr推送程序)

2.3第一个简单的dwr推送程序

第一步à?将dwr相关的jar包导入到工程

第二步à配置web.xml文件

?

?

<!--EndFragment-->

<!--EndFragment-->
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <servlet>    <servlet-name>dwr-invoker</servlet-name>    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>    <!-- 设置是否允许使用dwr推送技术 -->    <init-param>      <param-name>activeReverseAjaxEnabled</param-name>      <param-value>true</param-value>    </init-param>    <init-param>      <param-name>maxWaitAfterWrite</param-name>      <param-value>-1</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>dwr-invoker</servlet-name>    <url-pattern>/dwr/*</url-pattern>  </servlet-mapping></web-app>

?

简明:activeReverseAjaxEnabled变量是设置是否使用dwr推送技术,若设置为true声明为使用,若设置为false,就不好使了。?对于maxWaitAfterWrite变量,一开始我也不知道它是干吗用的。于是我就做了一个小测试,第一次设置maxWaitAfterWrite变量为-1,第二次使用默认值或者使用其它值。有兴趣的读者还可以通过查看dwr的源码来理解maxWaitAfterWrite变量的作用。我们可以在BasePollHandler类里面找到设置maxWaitAfterWrite变量的方法setMaxWaitAfterWrite。

?

第三步à编写com.im.service.SendPushService类

?

<!--EndFragment-->

<!--EndFragment-->
public class SendPushService {    //发送消息public void send(String msg) {System.out.println("==========调用了send方法==========");ScriptBuffer scriptBuffer = new ScriptBuffer(); //构造js脚本WebContext webContext=WebContextFactory.get();ScriptSession myScSession = webContext.getScriptSession();scriptBuffer.appendScript("dwrtest(");scriptBuffer.appendData(msg);scriptBuffer.appendScript(")");Util util = new Util(myScSession);util.addScript(scriptBuffer); //向客户端推送消息}}

?

简明:刚接触dwr推送技术内容的大部分读者看到上面这段代码的第一反应à什么是ScriptSession,ScriptSession似乎跟HttpSession有什么关系?我的第一反应就是这样,不知道您是否也一样。不用急,我们先把这个HelloWorld程序做完成先,要看到效果才有动力学习嘛!

?

?

第四步à?在dwr.xml文件定义向外暴露的接口

?

<!--EndFragment-->

<!--EndFragment-->
<allow><create creator="new" javascript="SendPushService"> <param name="class" value="com.im.service.SendPushService"/></create></allow>

?

简明:这是一个把自己编写好的java服务类暴露给客户端直接调用的简单配置方式,对于不熟悉dwr框架的读者,可参看相关的dwr文档,里面有详细的介绍,在此就不用扼要。

?

?

第五步:?编写jsp文件.

?

?

<!--EndFragment-->

<!--EndFragment-->
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns=" http://www.w3.org/1999/xhtml">  <head>    <base href="${basePath }" />    <script type='text/javascript' src='${basePath}dwr/engine.js'></script>    <script type='text/javascript' src='${basePath}dwr/util.js'></script>    <script type='text/javascript' src='${basePath}dwr/interface/SendPushService.js'></script>    <script type="text/javascript">    function hello(){    SendPushService.send("第一个dwr推程序");    }    /**由dwr在后台调用这个方法**/    function dwrtest(data){    alert(data);    }    </script>    <title>第一个dwr推程序</title>  </head>  <body onload="dwr.engine.setActiveReverseAjax(true);"><input type="button" value="点击我" onclick="hello();" />     </body></html>

?

简明:SendPushService是在第四步里面声明的服务类,在这里已转化为js对象调用,通过src=”?dwr/interface/SendPushService.js”?引入;onload事件触发了dwr.engine.setActiveReverseAjax(true)方法,只有激活了这个方法之后,推送才会真正生效,有兴趣的读者不妨一试,去掉onload事件,看看执行效果如何!

?

细心的读者在第三步会发现Util?util?=?new?Util(myScSession);,Util画了一条删除线,因为我使用的是dwr3.0版本,在3.0版本里面新增了一个更好用的类Browser,Util所能实现的功能在Browser类都已实现,官方建议我们使用Browser,所以将Util设置为过期。(设置过期的好处是告诉使用者说我这个类已经过期了,最好不要使用,因为已经有别的类替代它了!为了向后兼容,官方才没把它删除!)

改SendPushService类如下:

?

?

public class SendPushService {    ScriptBuffer scriptBuffer = new ScriptBuffer(); //构造js脚本 public void send(String msg){   System.out.println("==========调用了send方法==========");WebContext webContext=WebContextFactory.get();final ScriptSession myScSession = webContext.getScriptSession();scriptBuffer.appendScript("dwrtest(");scriptBuffer.appendData(msg);scriptBuffer.appendScript(")");/**向访问当前页面响应js函数**/   Browser.withCurrentPage(new Runnable() {   public void run() {myScSession.addScript(scriptBuffer);}}); }}

?

<!--EndFragment-->

<!--EndFragment-->

热点排行