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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端