使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)

原始帖子可以在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 5.6.23免安装_mysql5.6.23免安装配置

1.官网下载&#xff0c;并解压2.环境变量&#xff0c;path下&#xff0c;追加mysql的bin路径D:\Program Files\mysql\bin;3.mysql目录下的my-default.ini重命名为my.ini&#xff0c;并添加下面的代码basedirD:/Program Files/mysql #mysql路径datadirD:/Program Files/mysql/d…

在Intellij IDEA中运行Vaadin应用

在本文中&#xff0c;我将向您展示如何使用Intellij IDEA运行vaadin应用程序。 Vaadin提供了一些用于Eclipse和Netbeans的插件。 但是对于Intellij IDEA来说&#xff0c;还没有插件。 但是部署vaadin应用程序比其他两个IDE容易。 这是您要遵循的步骤。 1.首先创建一个新项目&am…

mysql主从数据库

Mysql主从配置&#xff0c;实现读写分离 大型网站为了软解大量的并发访问&#xff0c;除了在网站实现分布式负载均衡&#xff0c;远远不够。到了数据业务层、数据访问层&#xff0c;如果还是传统的数据结构&#xff0c;或者只是单单靠一台服务器扛&#xff0c;如此多的数据库连…

Java EE 6示例– Galleria –第3部分

关于Galleria示例的先前文章&#xff08; 第1 部分 | 第2部分 | 第3部分 | 第4部分 &#xff09;指导您完成基础知识以及对GlassFish和WebLogic的初始部署。 从今天开始&#xff0c;我尝试在其中添加一些企业级功能&#xff0c;因为我发现他们在自己的项目中提出了很多要求。 我…

在 Windows 上测试 Redis Cluster的集群填坑笔记

redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje集群环境至少需要3个节点。推荐使用6个节点配置&#xff0c;即3个主节点&#xff0c;3个从节点。新建6个文件夹 分别是 7000/7001/7002/7003/7004/7005将redis.windows.conf 复制一份然后修改配置文件中的下面…

拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur

https://www.luogu.org/problem/show?pid3119 本来我是来练习tarjan的&#xff0c;结果tarjan部分直接copy了&#xff0c;反而拓扑排序部分想了好久&#xff1b; 这道题SZB大神两次就AC&#xff1b; 但我等到AC&#xff0c;写好题解就只能洗洗睡了&#xff1b; 唉~ 差距怎…

IBM JVM调整– gencon GC策略

本文将向您详细介绍从Java虚拟机&#xff08;例如HotSpot或JRockit&#xff09;迁移到IBM JVM时重要的Java堆空间调整注意事项。 该调整建议基于我为我的一个IT客户端执行的最新故障排除和调整任务。 IBM JVM概述 正如您可能从其他文章中看到的那样&#xff0c;IBM JVM在某些方…

懒惰的JSF Primefaces数据表分页–第2部分

页面代码非常简单&#xff0c;没有复杂性。 检查“ index.xhtml”代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www…

java实现报表_用存储过程和 JAVA 写报表数据源有什么弊端?

用存储过程和 JAVA 写报表数据源有什么弊端&#xff1f;跟着小编一起来一看一下吧&#xff01;我们在报表开发中经常会使用存储过程准备数据&#xff0c;存储过程支持分步计算&#xff0c;可以实现非常复杂的计算逻辑&#xff0c;为报表开发带来便利。所以&#xff0c;报表开发…

SpringMVC学习笔记整理

SpringMVC学习笔记 以下是我整理的SpringMVC学习笔记&#xff1a; 导入jar包 一&#xff1a;springmvc工作流程。 ①. servlet容器初始化一个request请求 ②. DispatcherServlet分发器负责发送请求到映射器. ③. despatcherServlet把请求交给处理器映射Mapping&…

springboot2 使用hikaridatasource 并测试_基于Spring Boot 2.x的后端管理网站脚手,源码免费分享...

基于Spring Boot 2.x 的 Material Design 的后端管理网站脚手架 &#xff1a;提供权限认证 用户管理 菜单管理 操作日志 等常用功能去繁就简 重新出发基于Spring Boot 集成一些常用的功能&#xff0c;你只需要基于它做些简单的修改即可。功能列表&#xff1a;权限认证权限管理用…

测试驱动开发–双赢策略

敏捷从业人员谈论测试驱动开发 &#xff08;TDD&#xff09;&#xff0c;所以许多关心代码质量和可操作性的开发人员也是如此。 我曾几何时&#xff0c;不久前设法阅读了有关TDD的文章。 据我了解&#xff0c;TDD的关键是&#xff1a; 编写测试&#xff0c;但失败 代码&#x…

设计模式学习(三)——装饰器模式

前言 距离上一次正儿八经地写随笔已经有一段时间了&#xff0c;虽然2月10号有一篇关于泛型的小记&#xff0c;但是其实只是简单地将自己的学习代码贴上来&#xff0c;为了方便后续使用时查阅&#xff0c;并没有多少文字和理解感悟。之所以在今天觉得有必要写点东西&#xff0c;…

PCL学习八叉树

建立空间索引在点云数据处理中有着广泛的应用&#xff0c;常见的空间索引一般 是自顶而下逐级划分空间的各种空间索引结构&#xff0c;比较有代表性的包括BSP树&#xff0c;KD树&#xff0c;KDB树&#xff0c;R树&#xff0c;四叉树&#xff0c;八叉树等索引结构&#xff0c;而…

Android实现自定义带文字和图片的Button

在Android开发中经常会需要用到带文字和图片的button&#xff0c;下面来讲解一下常用的实现办法。 一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现&#xff0c;这种方式代码量最小。在Button的属性中有一个是drawableLeft&#xff0c;这个 属性可以…

mysql语句中的注释方法_MySQL语句注释方式简介

MySQL支持三种注释方式&#xff1a;1.从‘#字符从行尾。2.从‘-- 序列到行尾。请注意‘-- (双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。3.从/*序列到后面的*/序列。结束序列不一定在同一行中&#xff0c;因此该语法允许注释跨越多行。…

android框架----下沉文字Titanic的使用

Titanic is a simple illusion obtained by applying an animated translation on the TextView TextPaint Shaders matrix. Titanic的使用 Titanic的使用&#xff0c;项目结构如下&#xff1a; 一、下载Titanic并且部署到项目中 Titanic的项目地址&#xff1a; https://github…

linux 自动安装mysql_Linux安装mysql

一、下载这里我创建了一目录software用于存放我们待会要下载的mysql包&#xff0c;先去到该目录命令&#xff1a;cd /software命令&#xff1a;wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar下载完成后&#xff0c;你会在software这个…

Animation用法

测试代码及说明&#xff1a; <!DOCTYPE html> <html lang"en-US"> <head><meta charset"UTF-8"><title>Simple CSS3 Animation</title><style type"text/css">#demo {position: absolute;left: 30%;t…