DWR实现后台推送消息到web页面

DWR简介

DWR(Direct Web Remoting)可用于实现javascript直接调用java函数和后台直接调用页面javascript代码,后者可用作服务端推送消息到Web前端。

(服务器推送技术又称为Comet技术,是继AJAX后又一热门技术)

 

以下链接可作简单了解

官网

http://directwebremoting.org/dwr/

JavaDoc

http://www.directwebremoting.org/dwr/javadoc/

入门讲解(前端)

http://directwebremoting.org/dwr/introduction/getting-started.html

入门讲解(后台)

http://directwebremoting.org/dwr/documentation/server/javaapi.html

下载地址

http://directwebremoting.org/dwr/downloads/index.html

 


 

需求场景

移动端用户向后台上传实时坐标后,后台需通知WEB页面在地图上实时更新用户位置。

 

实现过程

1、导入jar包(若用maven则添加依赖关系)

  地址: http://directwebremoting.org/dwr/downloads/index.html

 

2、web.xml中添加servlet

复制代码
<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>
        org.directwebremoting.servlet.DwrServlet
    </servlet-class>
    <init-param>
        <param-name>pollAndCometEnabled</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
复制代码

 

3、编写前端

1)页面引入dwr相关js(无需导入js文件)

1
2
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>

2)页面初始化时初始dwr参数

$(function(){
    initDwr(); 
});
//初始化dwr
function initDwr(){ 
    dwr.engine.setActiveReverseAjax(true);  //在web.xml配置无效只好在此配置
}

3)编写供后台调用的函数

//更新用户位置
function updateUserLocation(userid, longitude, latitude){
    mapMarkerList[userid].setPosition(new AMap.LngLat(longitude,latitude)); //更新地图Marker的位置
}

 

5、后台

1)编写DwrUtil工具类

复制代码
public class DwrUtil {
    /**
     * 调用页面javascript函数
     * @param functionName
     * @param args
     */
    public void invokeJavascriptFunction (String _funcName, List _args){
        final String funcName = _funcName;
        final List args = _args;
        Browser.withAllSessions(new Runnable(){ 
            private ScriptBuffer script = new ScriptBuffer(); 
            public void run(){ 
                //拼接javascript
                script = script.appendScript(funcName+"(");
                for(int i=0; i<args.size(); i++){
                    if(i != 0){
                        script = script.appendScript(",");
                    }
                    script = script.appendData(args.get(i));
                }
                script.appendScript(")"); 
                //System.out.println(script.toString());   
                 
                Collection<ScriptSession> sessions = Browser.getTargetSessions(); 
                for (ScriptSession scriptSession : sessions){ 
                    scriptSession.addScript(script); 
                } 
            } 
        });
    }
}
复制代码

2)业务逻辑中调用javascript代码实现推送功能

复制代码
@RequestMapping(value = "api/apiBaseController/testUploadLocation.do")
@ResponseBody
public AjaxJson testUploadLocation(HttpServletRequest request) {
    // 参数获取
    String userid = request.getParameter("userid");
    String longitude = request.getParameter("longitude");
    String latitude = request.getParameter("latitude");
    //推送到web端
    DwrUtil t =  new DwrUtil();
    List args = new ArrayList();
    args.add(userid);
    args.add(longitude);
    args.add(latitude);
    t.invokeJavascriptFunction("updateUserLocation",args);
         
    AjaxJson ajaxjson = new AjaxJson();
    ajaxjson.setStatusmsg("上传成功");
    ajaxjson.setUsermsg("上传成功");
    return ajaxjson;
}
复制代码

 

posted @   leapMie  阅读(10396)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示