原始帖子可以在ekito网站上找到。

对于我们的一位客户,我们需要显示一张具有实时更新的车辆位置的地图。
因此,我开始使用Play制作原型! 框架及其最新发布的版本2.0,使用Java API。 我从Play的网络聊天室开始! 2.0个样本。

原型的目的是在地图上显示正在行驶的车辆。 车辆的位置通过REST调用发送到服务器(最后,它将由Android应用程序发送),并且连接的用户可以在其地图上实时查看车辆的行驶情况。

首先,让我们看一个小演示!

因此,首先,为了使事情变得更漂亮,我决定使用LessCss集成Twitter Bootstrap (v2.0.1)。 为此,我使用了下一篇文章中的技巧(这里没有困难)。

然后,我集成了OpenLayers ,一个用于地图可视化的Javascript框架。 我使用了Google Maps集成示例 ,并添加了一些KML图层。 这是在map.scala.html和maptracker.js文件中完成的,这里没什么花哨的(它是纯Javascript,而且我不是专家……)。

有趣的部分是使用WebSocket的部分。 在客户端,这是相当标准的:

var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket
var mapSocket = new WS("@routes.Application.mapsocket().webSocketURL(request)");mapSocket.onmessage = function(event) {var data = JSON.parse(event.data);marker = moveMaker(map, marker, data.longitude, data.latitude);}// if errors on websocket
var onalert = function(event) {$(".alert").removeClass("hide");
} mapSocket.onerror = onalert;
mapSocket.onclose = onalert;

当客户端从websocket接收JSON数据时,它将在地图上移动标记。 并且如果在websocket上发生错误(例如,服务器已停止),则由于Twitter Bootstrap会显示一个相当大的错误:

在服务器端,websocket 由Application控制器创建,并由MapAnime.java Akka actor处理。 它访问Akka本机库来处理来自控制器的事件。

public class MapAnime extends UntypedActor {static ActorRef actor = Akka.system().actorOf(new Props(MapAnime.class));Map<String, WebSocket.Out<JsonNode>> registrered = new HashMap<String, WebSocket.Out<JsonNode>>();/*** * @param id* @param in* @param out* @throws Exception*/public static void register(final String id,final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out)throws Exception {actor.tell(new RegistrationMessage(id, out));// For each event received on the socket,in.onMessage(new Callback<JsonNode>() {@Overridepublic void invoke(JsonNode event) {// nothing to do}});// When the socket is closed.in.onClose(new Callback0() {@Overridepublic void invoke() {actor.tell(new UnregistrationMessage(id));}});}public static void moveTo(float longitude, float latitude) {actor.tell(new MoveMessage(longitude, latitude));}@Overridepublic void onReceive(Object message) throws Exception {if (message instanceof RegistrationMessage) {// Received a Join messageRegistrationMessage registration = (RegistrationMessage) message;Logger.info("Registering " + registration.id + "...");registrered.put(registration.id, registration.channel);} else if (message instanceof MoveMessage) {// Received a Move messageMoveMessage move = (MoveMessage) message;for (WebSocket.Out<JsonNode> channel : registrered.values()) {ObjectNode event = Json.newObject();event.put("longitude", move.longitude);event.put("latitude", move.latitude);channel.write(event);}} else if (message instanceof UnregistrationMessage) {// Received a Unregistration messageUnregistrationMessage quit = (UnregistrationMessage) message;Logger.info("Unregistering " + quit.id + "...");registrered.remove(quit.id);} else {unhandled(message);}}public static class RegistrationMessage {public String id;public WebSocket.Out<JsonNode> channel;public RegistrationMessage(String id, WebSocket.Out<JsonNode> channel) {super();this.id = id;this.channel = channel;}}public static class UnregistrationMessage {public String id;public UnregistrationMessage(String id) {super();this.id = id;}}public static class MoveMessage {public float longitude;public float latitude;public MoveMessage(float longitude, float latitude) {this.longitude = longitude;this.latitude = latitude;}}}

控制器调用“ register”和“ moveTo”方法,它们将消息发送到Akka系统。 这些消息由“ onReceive”方法处理。 例如,当它收到MoveMessage时,它将创建一个具有经度和纬度的JSON对象,并通过websocket发送给客户端。

我还快速编写了一个测试类 , 该类分析文本文件,并每100毫秒将具有新位置的REST请求发送到服务器。

该项目托管在Github上 。 它可与Google Chrome v17和Firefox v11一起使用。

为了测试

  • 下载播放! 2.0
  • 克隆Git仓库
  • 在项目目录中开始“播放运行”
  • 连接到“ http:// localhost:9000 / map ”
  • 在另一个终端中,运行“播放测试”以发送REST请求并让车辆行驶

我现在需要解决的问题是应用程序不是无状态的,因为在Actor中,我存储了已连接客户端的Map 。 也许我需要看一下Redis或其他任何东西,将不胜感激。

因此,总而言之,我能够快速开发出可运行的原型,并且我想我将尝试使用Play! 在多个项目中为2.0

有什么好的:

  • 高产
  • 基于Scala的Typesafe视图模板
  • LessCss集成
  • Akka整合
  • 使用Google Closure编译器编译的javascript
  • 暂时不用学习Scala,万岁!

有待改进:

  • Scala的编译时间应该增加,因为在我的PC上,编译视图最多需要4s的时间,并且会中断我的流程 (当从IDE切换到Web浏览器时,我使用“〜run”命令获得1s)。
  • Scala编译器错误是神秘的
  • 我无法在Heroku上部署该演示,因为它不支持(但?)websockets

更新:稍后,我使用类似的技术从@steve_objectify发现了一篇文章: http : //www.objectify.be/wordpress/?p=341

参考:来自JCG合作伙伴 Sebastian Scarano的Twitter Bootstrap,WebSockets,Akka和OpenLayers的Play!ing(2.0),来自Play框架的乐趣! 博客。

翻译自: https://www.javacodegeeks.com/2012/04/playing-20-with-twitter-bootstrap.html

使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)相关推荐

  1. 带有Spring,Hibernate,Akka,Twitter Bootstrap,Apache Tiles和jQuery的Maven Web项目Kickstarter代码库...

    我很高兴将第二个项目上传到GitHub,以帮助人们尽快开始Java Web App开发. 我正在与Apache License 2.0共享此代码. 这是相同的网址: https://github.co ...

  2. 如何更改Twitter Bootstrap模式框的默认宽度?

    本文翻译自:How can I change the default width of a Twitter Bootstrap modal box? I tried the following: 我尝 ...

  3. 如何使用Twitter Bootstrap获得中心内容?

    本文翻译自:How do you get centered content using Twitter Bootstrap? I'm trying to follow a very basic exa ...

  4. 将功能绑定到Twitter Bootstrap Modal关闭

    我在一个新项目上使用Twitter Bootstrap lib,我希望页面的一部分刷新并检索模式关闭时的最新json数据. 我看不到文档中的任何地方,有人可以向我指出或提出解决方案. 使用记录方法的两 ...

  5. 如何在悬停而不是单击时使Twitter Bootstrap菜单下拉列表

    我想让我的Bootstrap菜单在悬停时自动下拉,而不必单击菜单标题. 我还想丢失菜单标题旁边的小箭头. #1楼 这将隐藏上升的 .navbar .dropdown-menu:before {disp ...

  6. 12个免费的 Twitter Bootstrap 后台模板

     12个免费的 Twitter Bootstrap 后台模板 在互联网上提供很多免费的 Bootstrap 管理后台主题.所有你需要做的就是将它们下载并安装它们,这真的不是什么难事.问题是如何寻找 ...

  7. 推荐13款优秀的Twitter Bootstrap JavaScript插件

    Bootstrap是基于HTML,CSS和JavaScript的简洁灵活的流行前端框架及交互组件集,由微博先驱Twitter在2011年8月开源的整套前端解决解决方案,拥有非常完备和详尽的开发文档,有 ...

  8. 城市简码_如何使用简码在WordPress中添加Twitter Bootstrap CSS

    城市简码 Adding CSS elements like tooltips, colorful buttons, and roll-over effects can help your conten ...

  9. Bootstrap V3 dropdown的hover玩法

    这里记录一下Bootstrap V3 中dropdown的玩法. 在Bootstrap V3的帮助文档中,导航条中的dropdown是这样的:点击一下,然后dropdown-menu出现.要是我想鼠标 ...

最新文章

  1. boost信号量 boost::interprocess::interprocess_semaphore的用法
  2. 判断两个链表是否相交
  3. Linux基础命令介绍
  4. python微信跳一跳小游戏刷分
  5. Git的smart Checkout\force checkout\Don‘t Checkout的区别
  6. RuntimeException 和 Exception 区别、异常的子父级关系
  7. php html class,html中规定元素的类名的属性class
  8. 使用jQuery开发tab选项卡插件
  9. windows下nginx+mono+fastCGI部署asp.net网站
  10. 拓端tecdat|R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化
  11. codeforces 459 E. Pashmak and Graph(dp)
  12. eclipse插件下载地址
  13. 波束形成MATLAB代码
  14. WLAN与WiFi的区别和联系
  15. asp.net前端页面上使用if
  16. 百度网盘非会员上传大于4G的文件
  17. 画fits图像上的极小值点
  18. 老兵新传 Visual Basic核心编程及通用模块开发pdf
  19. HDUOJ 1847 Good Luck in CET-4 Everybody!(尼姆博奕)
  20. windows命令行中 启动应用程序

热门文章

  1. spring(3)高级装配
  2. tomcat(11)org.apache.catalina.core.StandardWrapper源码剖析
  3. 如何下载、配置IDEA的Maven
  4. 如何用JS实现音乐播放、暂停
  5. gradle配置_Gradle配置
  6. elk 聚合日志_使用ELK堆栈进行日志聚合
  7. java jdk设置字符集_使用JDK 11在Java字符串上的新方法
  8. lambda设计模式_使用lambda的装饰器设计模式
  9. 带有Prometheus的Spring Boot和测微表第6部分:保护指标
  10. tomcat 轮询_用Spring长轮询Tomcat