使用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.pswp.cn/news/372883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

同步時間

同步時間 [rootlocalhost 03]# ntpdate 0.centos.pool.ntp.org 轉載于:https://www.cnblogs.com/cglWorkBook/p/5556920.html

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;如此多的數據庫連…

安裝openstack時遇到的錯誤

學習opensatck的第一步是安裝DevStack來進行本機操作 1. 下面命令沒有權限&#xff0c;解決辦法&#xff1a;切換到root用戶下執行sudo -s echo "stack ALL(ALL) NOPASSWD: ALL" >> /etc/sudoers2. 執行下面命令提示沒有git&#xff0c;解決辦法&#xff1a;su…

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 復制一份然后修改配置文件中的下面…

不成為編程天才的5種貢獻方式

安迪萊斯特&#xff08;Andy Lester&#xff09;早在三月發布了原始指南&#xff0c;其中介紹了14種不成為編程天才或搖滾明星的貢獻開源的方法 &#xff0c;我真的很喜歡這個想法。 這就是為什么我決定稍微采納一下這篇文章&#xff0c;并告訴您如何以及可以做什么來支持自己喜…

mysql數據庫設計與應用答案智慧樹_智慧樹_MySQL數據庫設計與應用_完整免費答案...

單位工程施工組織設計的技術經濟指標體系包括有()。A&#xff0e;工期指標B&#xff0e;勞動指標C&#xff0e;臺班利用率D&#xff0e;成本降低大跨徑橋梁采用()將會取得良好的技術經濟效益。A&#xff0e;橫移法施工B&#xff0e;頂推法施工C&#xff0e;轉體法施工D&#xf…

拓撲排序最長鏈-P3119 [USACO15JAN]草鑒定Grass Cownoisseur

https://www.luogu.org/problem/show?pid3119 本來我是來練習tarjan的&#xff0c;結果tarjan部分直接copy了&#xff0c;反而拓撲排序部分想了好久&#xff1b; 這道題SZB大神兩次就AC&#xff1b; 但我等到AC&#xff0c;寫好題解就只能洗洗睡了&#xff1b; 唉~ 差距怎…

談談父類和子類的隔離性

以前寫代碼知道要給類外設置訪問接口, 例如下例: 1 class Money2 {3 public:4 Money(int money) : m_curValue(money){}5 6 void store(int money) { m_curValue money;}7 void spent(int money){ m_curValue - money;}8 private:9 int m_curValue…

用于數據庫測試的DBUnit,Spring和注釋

如果您曾經嘗試用Java編寫數據庫測試&#xff0c;則可能會碰到DBUnit 。 DBUnit允許您設置和拆除數據庫&#xff0c;以便它包含可針對其編寫測試的一致行。 通常&#xff0c;您可以通過編寫一個簡單的XML文檔來指定要DBUnit插入的行&#xff0c;例如&#xff1a; <?xml ve…

阿里云centos 7.6安裝mysql_阿里云Centos7上安裝MySQL教程

1 基本安裝過程1.查看系統是否安裝了mysql軟件# rpm -qa|grep -i mysql2.將已經安裝過的軟件卸載掉。注意&#xff1a;這樣的卸載是不徹底&#xff0c;不過這里夠用了# yum remove 軟件名3.CentOS 7的yum源中默認是沒有mysql的。所以&#xff0c;為了解決這個問題我們首先下載安…

Struts2中數據封裝方式

一、通過ActionContext類獲取 public class ActionContextDemo extends ActionSupport { Override public String execute() throws Exception { //獲取ActionContext對象 ActionContext context ActionContext.getContext(); //調用getParameters…

第五章、搭建S3C6410開發板的測試環境

通過對本章的學習&#xff0c;我對s3c6410開發板的測試環境有了一定的認識&#xff0c;并掌握了如下的知識點&#xff1a;一、對于s3c6410這款開發板&#xff0c;它是一款低功耗、高性價比的處理器&#xff0c;它是基于ARM11的內核。二、不同開發板的區別主要在燒錄嵌入式系統的…

IBM JVM調整– gencon GC策略

本文將向您詳細介紹從Java虛擬機&#xff08;例如HotSpot或JRockit&#xff09;遷移到IBM JVM時重要的Java堆空間調整注意事項。 該調整建議基于我為我的一個IT客戶端執行的最新故障排除和調整任務。 IBM JVM概述 正如您可能從其他文章中看到的那樣&#xff0c;IBM JVM在某些方…

mysql主從配置錯誤_mysql主從配置失敗,主從通訊失敗

配置mysql主從的時候&#xff0c;檢查slave狀態&#xff0c;發現報錯信息&#xff0c;Error The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement on query.mysql> show slave status\G*************************** 1. r…

echarts如何顯示在頁面上

echarts如何顯示在頁面上 1.引入echarts的相關.js文件 <script src"js/echarts.min.js"></script> 2.新建一個div&#xff0c;style自己定&#xff0c;但必須要有width和height <div id"history_state" style"width: 400px;height: 20…

懶惰的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…