Google Gears 指南
?
Gears概述
????????
??????? Google Gears 是一個開源的瀏覽器插件,它支持用戶瀏覽器能夠使用開發者創建的基于 Gears 的離線應用。它提出了一種離線應用的思想,它的三大核心模塊將幫助開發者更好地運用這個思想來開發。Gears 技術是基于客戶端語言 JavaScript 技術的擴展。
???????? Google Gears提供一種瀏覽器存儲支持技術,這種技術使得傳統的WEB應用的瀏覽器層再不僅僅只具有頁面的顯示能力,而還將具備把遠程數據同步到本地,并在本地對數據結構化利于訪問和查詢,最后還能把處理之后的數據在后臺同步到服務器。其總體框架如下圖:
???????? Google Gears是作為一個瀏覽器的插件被安裝在本機的,Gears 所支持的操作系統和瀏覽器包括 Windows, Windows Mobile, Mac (Firefox, Safari), Linux and Android。因此,Gears支持目前主流的操作系統和瀏覽器,具有極強的兼容性和廣泛的適用范圍。、
Gears具有如下特性:
- 能夠讓WEB應用程序可以更自然的與本地桌面應用交互
- 能夠把數據以結構化的形式存儲到本地數據庫,方便查詢
- 能夠在后臺運行JavaScript以提高執行效率
???????? Gears 實際上提供了一種離線模型來設計應用程序,我們可以把這種模式理解為一種本地服務模式。事實上,Gears就是通過它的關鍵組件來緩存應用資源,并在離線狀態下可用。因此,存儲應用資源就是Gears的一個關鍵技術。
???????? 在傳統的應用中,應用資源及數據都是被存儲在服務器一端的,即使在客戶端也是一些有限的非結構化的數據,比如Cookie等。然而,要是采用離線式的應用形式,數據就必須要存儲到本地;而存儲的數據為了能夠方便的訪問和查詢,就必須要以結構化的數據存儲。因此,提供一個本地的關系數據庫是一種比較好的形式。當作業在離線完成之后,就需要使得本地的數據能夠和服務器的數據進行同步;當然,這里有很多方案可供選擇;因為,不同的系統結構可能不同的方案。另外,Gears的數據庫提供了全文簡述的方式,因此Gears能夠在數據庫文件中很快做文本查詢。
???????? Gears由于數據的處理有一部分是在客戶端進行的,因此可能存在客戶端處理大量的數據或是在同步的時候要同步大量的數據,那么執行性能可能會有所降低。不過,Gears提供了一種叫做WorkerPool的技術,使得這類操作可以在程序執行的后臺進行操作,從而使得這種需要長期等待的作業不會影響用戶的其他操作。
Gears的體系結構
?
在研究Gears的體現結構之間,我們先來看看一些常見的數據處理結構。
?
缺乏數據層的結構
典型的就是直接使用AJAX的遠程調用,AJAX把服務器暴露出來的APIs理解為一個數據源,通常AJAX只用獲取服務器的數據而不緩存數據。
具有一個數據層的結構
如果你的AJAX程序通過一個JSON訪問Internet應用,當然你還可以通過中間對象來傳遞數據;你可以通過該對象判斷數據是來自服務端、客戶端存儲的或兩者的協作數據。使用中間對象可以傳遞到服務器,也可以接受服務器的數據到客戶端,它還可以選擇是否同步服務器和客戶端的數據。這樣做的好處是,客戶端動過一個數據對象和服務器進行交互處理。但是,這存在一個問題,就是在數據層里不是很容易區分服務端的數據、客戶端的數據或需要同步的數據。
提供數據選擇器的結構
如果你在數據層之上增加一個數據選擇器充當數據層的數據接口,那么你就可以通過選擇器區分那些數據層的數據來自服務器,那些來自客戶端,那些要同步。顯然,這樣做解決了上述區分數據的問題。但是,在客戶端的數據都只能是暫時存儲的,要是結束應用就必須要把長期存儲的數據同步到服務器上去。
通過本地存儲的結構
那么接下來,我們要是在本地增加一個數據層并提供一個本地的數據庫,那么我們的數據層就會有兩個,一個來自服務器,另一個則來自本地。這樣做,你可以把離線數據存儲到本地庫,并通過與服務器交互的數據層進行同步。
???????? 通過上述四種結構的演繹,我們的目的是要使得離線模型的應用程序成為可能。當然,并不是任何應用都需要采用離線模型,這一切都要取決與應用的邏輯和連接策略。比如,你的數據是實時更新的,就好像股票的信息你可能在客戶端只需要知道當前的實事數據那么就不需要離線作業,再比如,一些在線聊天系統的消息等,這些都不需要離線模型來進行處理。
???????? 總的來說,應用訪問本地數據的性能肯定要比每次都使用來自服務端的數據要高。但必須要考慮程序的代價和收益,因為本地離線數據也是要與服務器同步的。
后臺同步結構
如上圖通過一個同步引擎在后臺同步本地和服務器之間的數據,這樣做的好處很明顯,客戶在離線作業的時候不需要考慮應用的狀態同步,而是通過一個后臺引擎同步。而Gears的結構就是這樣一種結構。
?
Gears的安全性
????????
??????Gears提供的最基本的安全機制是,通過對一個域(及端口)提供一個數據庫和一個服務。另外,當用戶訪問某個Internet應用的時候,插件會提示用戶是否啟用Gears。同時,在瀏覽器終端Gears也會通過客戶在操作系統登錄的用戶以確保終端文件的安全性;因此,在同一個操作系統上兩個不同的用戶訪問的也是不同的Gears文件。最后,為了防止SQL的注入攻擊,Gears還提供了(?)輸入參數化來防止攻擊,以提高安全性。
??????例如,我們通常推薦這樣db.execute('insert into MyTable values (?)', data);而不同推薦這樣db.execute('insert into MyTable values (' + data + ')');。
Gears功能預覽
?
- l? 本地數據庫
- l? 訪問文件的能力
- l? 本地化
- l? 與本地桌面交互
- l? 后臺處理
后面我們將通過一個專題一個例子的方式來介紹Gears的這些功能,并討論這些功能的應用范圍。
???????? 要使用Gears就必須去先安裝Gears插件到瀏覽器,并在頁面中引入gears_init.js文件,加載并初始化gears插件。
本地數據庫
???????? 就如同我們在Gears的體現結構中談到的那樣,Gears提供了一個本地數據庫,事實上這個本地數據庫是一個SQLite數據庫。該數據庫的文件位置如果在Windows上就是在Windows的用戶文件夾的目錄下:
??????文件里有三個db文件,分別是geolocation.db、localserver.db和permissions.db文件,geolocation是國際化庫,localserver是Gears服務庫而permissions是Gears的MetaData數據庫。我們的數據文件,是根據域來存放的。
????? 我們已經大致了解了Gears的工作情況,在前面的Gears的體系結構中,我們也知道Gears提供了JavaScript的接口供用戶在頁面訪問該數據庫。操作Gears的數據庫和通常下的數據庫訪問代碼類似。大致步驟如下:
1.???????? 創建連接到數據服務上
2.???????? 打開服務上的某個數據庫
3.???????? 執行SQL指令(DDL和DML)
???????? 例如如下代碼:
???????? db = google.gears.factory.create('beta.database');
???????? db.open('database-personInfo');
???????? db.execute('SQL Command');
另外,如果在執行Select語句的時候可能會產生結果集,在結果集的處理上通過db.execute方法返回一個rs結果集,在結果集上可以通過isValidRow方法判斷是否可以繼續迭代,并通過next方法進行迭代。在結果集上,如果要取的所迭代的行上的數據可以通過field(index)方法,其中index參數表示行中列的索引。如下代碼:
var rs = db.execute('select * from XXX ');
while (rs.isValidRow()) {
???????? col0=rs.field(0)
???????? rs.next();
}
???????? 基于代碼封裝的考慮,我們建議對上述代碼進行包裝,這里提供一種包裝實現以方便以后的復用。
//GearsDB用于封裝Gears的數據庫操作function?GearsDB(databasename){
?????????var?_this=this;
?????????var?db=null;
?????????_this.dbname='';
?????????var?isopen=false;
?????????//構造函數
?????????var?init?=?function()
????{
?????????????_this.dbname=databasename;
????};
init();?????????
?
?????????//打開Gears的數據庫連接
?????????this.open=function(){
???????????????????var?result=true;
???????????????????if?(window.google?&&?google.gears)?{
????????????????????????????try?{
?????????????_this.db?=?google.gears.factory.create('beta.database');
?????????????if?(_this.db)?{
???????????????_this.db.open(_this.dbname);
???????????????_this.isopen=true;
?????????????}//end?if;
???????????}?catch?(ex)?{
????????????????result=false;
???????????}//end?true;
???????????????????}//end?if;
???????????????????return?result;
?????????}
?????????
?????????//在Gears創建的數據庫中建表
?????????this.createTable=function(ddl){
???????????????????if(_this.db?&&?_this.isopen){
????????????????????????????_this.db.execute(ddl);
???????????????????}//end?if;
?????????}
?????????
?????????//封裝執行更新的SQL代碼
?????????this.executeUpdate=function(sql,params){
???????????????????if(_this.db?&&?_this.isopen){
????????????????????????????_this.db.execute(sql,params);
???????????????????}//end?if;
?????????}
?????????
?????????//封裝執行查詢的SQL代碼,查詢通過rowmap回調函數完成對結果集數據賦值
?????????this.executeQuery=function(sql,params,rowmap){
???????????????????var?resultlist=null;
???????????????????if(_this.db?&&?_this.isopen){
????????????????????????????resultlist=new?Array();
????????????????????????????var?rs=_this.db.execute(sql,params);
????????????????????????????while?(rs.isValidRow())?{
?????????????????????????????????????var?col=rowmap(rs);
?????????????????????????????????????resultlist.push(col);
?????????????????????????????????????rs.next();
????????????????????????????}//end?while;
???????????????????}//end?if;
???????????????????return?resultlist;
?????????}
?????????
?????????//關閉Gears的數據庫連接
?????????this.close=function(){
???????????????????if(this.db?&&?this.isopen){
????????????????????????????this.db.close();
???????????????????}//end?if;????????????
?????????}
}
?
訪問本地文件及上傳
???????? 訪問本地文件實際上就是通過Gears與本地的桌面系統交互,Gears為此提供了一個Desktop的訪問對象,該對象實際具備兩個操作一個是訪問桌面的問文件系統,另一個則是用來創建快捷圖標到桌面。openFiles方法就是用來打開本地文件的,它可以通過一個系統提供的文件選擇對話框對文件進行選擇。該方法的原型為:void openFiles(callback, [options]),其中callback表示在選擇文件后的回調函數(注:之后上傳功能就在該函數中完成),options是選項類型OpenFileOptions。其中,回調函數的原型是OpenFilesCallback(File[] files),該函數中的files表示選擇的文件數組。File是Gears提供的文件類型,其中有兩個只讀屬性name和blob。name表示文件名,blob表示以二進制存儲的文件內容。OpenFileOptions也是由Gears提供的數據類型,有兩個配置屬性singleFile和filter,singleFile是個boolean值,true為只選擇一個文件,false表示可以選擇多個;filter表示要過濾的文件類型。具體操作,如下例:
//用來創建desktop對象
var desktop = google.gears.factory.create('beta.desktop');
//調用openFiles方法,打開文件
desktop.openFiles(
? function(files) {//回調函數
??? if(files.length==0) return;
??? var msg='';
??? for (var i = 0; i < files.length; i++) {
????? msg+=' '+files[i].name;
??? }
??? alert(msg);
? },
? { singleFile:true,filter: ['text/plain', '.html'] }
);
上述功能,用來打開單個文件,默認只顯示text和html文件,文件打開后顯示剛才選擇的文件名。
???????? 通過Gears我們可以選擇并打開文件,那么要上傳文件Gears又為我們提供了一個HttpRequest類,通過該類我們可以通過http協議把文件流傳輸到服務器上。該類實際上是W3C的XMLHttpRequest的特定實現,之所以如此是因為Gears的HttpRequest類能夠更好的運作在Gears的后臺處理中,它除了具備XMLHttpRequest的功能意外,關鍵是能夠和Gears更好的協同作業。要使用HttpRequest對象首先要先創建該對象,如下代碼負責創建:
var httpUploadRequest=google.gears.factory.create("beta.httprequest");
當完成創建之后,則可以通過open方法連接服務器端的處理上傳的URI上去。如下代碼:httpUploadRequest.open("PUT", fileURI);
當要上傳到服務器的時候,可以通過一個進度條或之類的方式表示文件正在上傳中,這種情況可以通過一個回調函數有用戶決定如何處理,如下代碼:
httpUploadRequest.upload.onprogress = _onprogress();
httpUploadRequest.onreadystatechange = function()
{
?switch(httpUploadRequest.readyState)
?{
?case 0:???
?//Uninitialized;
?case 1:???
?//Open;
?case 2:???
?//Sent;
?case 3:???
?//Interactive;
?case 4:???
?//complete;
?break;
?}
};
其中,代碼中_onprogress由用戶自己實現上傳過程中的任務。
而當上傳處理的時候,HttpRequest和
???????? 如果要上傳文件,則可以通過send方法發送文件的內容,blob是以二進制字節流的方式發送數據。如下代碼:
httpUploadRequest.send(file.blob);
本地桌面交互
???????? 前面已經介紹了Desktop類的訪問本地文件的能力,下面我們再來討論一下它的另一個功能就是在本地桌面創建到頁面應用的快捷圖標的能力。createShortcut方法就可以通過gears在桌面創建圖標,圖標的大小有四類:16x16、32x32、48x48 和 128x128。如果,在windows系統下可以選擇把圖標創建在桌面、開始菜單和快速啟動欄。具體操作如下代碼:
? var desktop = google.gears.factory.create("beta.desktop");
? var description = "This shortcut launches the Gears shortcut sample page.";
?//圖標的路徑
? var icons = {
??? "16x16": "icon16.png",
??? "32x32": "icon32.png",
??? "48x48": "icon48.png",
??? "128x128": "icon128.png"
? };
?
? desktop.createShortcut("Gears Shortcut Sample",? // 標題
???????????????????????? "hello_world_shortcuts.html",? // 快捷方式連接的url
???????????????????????? icons,? // 圖標數組
???????????????????????? description);? // 描述信息
執行上述代碼如下圖:
本地化
通過Gears的本地化,可以很容易的獲得用戶的時區、地理位置、所在地等信息。具體操作如下:
var geolocation = google.gears.factory.create('beta.geolocation');//創建本地化對象
然后,通過void getCurrentPosition(successCallback, [errorCallback], [options])可以獲得用戶的本地信息。
geolocation.getCurrentPosition(successCallback,
?????????????????????????????????? errorCallback,
?????????????????????????????????? { enableHighAccuracy: true,
???????????????????????????????????? gearsRequestAddress: true });
這里我們可以看到,有兩個回調函數,successCallbak表示獲取本地化信息成功,errorCallback表示獲取失敗。若獲取成功,我們可以把取得信息輸出,如下代碼:
function successCallback(p) {
??? var address = p.gearsAddress.city + ', '
????????????????? + p.gearsAddress.region + ', '
????????????????? + p.gearsAddress.country + ' ('
????????????????? + p.latitude + ', '
????????????????? + p.longitude + ')';
?
??? clearStatus();
??? addStatus('Your address is: ' + address);
? }
其中,參數p是一個Position類,該類提供了一些屬性獲得地理位置。
后臺處理
???????? Gears提供了WorkerPool使得客戶端的JavaScript代碼可以在后臺運行,從而不用通過阻塞的方式在頁面工作。在頁面操作的時候,可能存在大量數據的I/O操作,這樣有可能使得UI操作被阻塞,那么通過Gears的WorkerPool就可以使得這類操作在后臺進行。
???????? Gears的WorkerPool實際上就是一個線程池,由于采用了池的方式管理線程,因此,要比多個線程效率高,并且在執行的過程中每個worker是不會共享任何狀態。WorkerPool中的各個worker之間由于不是通過共享狀態傳遞信息,所以有效的避免了沖突;但是,他們又是通過什么來傳遞消息呢?事實上,worker之間的消息傳遞是通過消息傳遞來完成的。
???????? 由上面我們知道Gears的WorkerPool是不會共享任何狀態的,那么對于DOM,比如document或window對象也同樣不能被共享。因此,只有在主worker才能獲取DOM,而其它worker則不能。
???????? Worker之間的消息傳遞通過sendMessage方法發送,在處理發送過來的消息的時候通過onMessage事件來接收并處理。
Gears網站
Google Gears 首頁:http://gears.google.com/
Google Gears?下載:http://code.google.com/apis/gears/tools.html
?
?
轉載于:https://www.cnblogs.com/fdszlzl/archive/2009/06/08/1498374.html
總結
以上是生活随笔為你收集整理的Google Gears 指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Appium Java
- 下一篇: python训练聊天机器人_一个可以进行