离线Web技术在医疗业务应用的设想及尝试 什么是离线Web技术 众所周知,Web的功能主要是依赖在线的网络,离开网络,Web应用几乎没 有什么用处。而随着当今Web2.0技术的快速发展,Web2.0时代最重要的创新技 术一一离线Web技术应运而生,离线Web应用的时代到来了 普通的应用程序是先下载安装程序,安装完成以后使用,而Web应用程序, 则是用浏览器打开一个网络应用程序页面,直接在浏览器页面中完成各种应用程 序操作。但是Web应用一般都需要网络服务器的支持,用户需要联网才能使用, 离线Web技术给Web应用程序提供了离线操作的功能,用Web打开一个网络页面, 当应用程序页面下载完毕后,这个软件就能使用了,就是离线了也能正常使用这 个软件。应用离线Web技术开发出来的Web应用程序让用户在没有网络的地方或 网络突然故障的时候,也能流畅的保持应用程序操作,等到网络通畅的时候,离 线操作过的应用自动被同步到Web上,大大方便了用户的使用。 离线Web技术在医疗行业应用设想 使用离线Web技术开发的Web应用程序既具有Web程序跨平台、穿透力强、 与Web应用无缝集成、良好的可移植性等各种优势,又实现了离线操作,并且大 大提高了Web程序的性能,因此离线Web技术完全可以被应用到企业的系统开发 中去。 国内许多大型医院正在实施“移动查房”,即使用无线网络和无线设备来实 现医生查房的数字化、护理记录数字化。医生携带无线设备,在覆盖无线网络的 病房査房时,边询问病人病情边在系统中实时记录。但是无线设备发出的信号有 时会对一些精密的医疗设备产生干扰,如果采用基于离线Web技术开发的系统, 可以很方便的解决这个问题,而不必采购昂贵的特制无线设备。即使小型医院也
离线 Web 技术在医疗业务应用的设想及尝试 什么是离线 Web 技术 众所周知,Web 的功能主要是依赖在线的网络,离开网络,Web 应用几乎没 有什么用处。而随着当今 Web2.0 技术的快速发展,Web2.0 时代最重要的创新技 术——离线 Web 技术应运而生,离线 Web 应用的时代到来了。 普通的应用程序是先下载安装程序,安装完成以后使用,而 Web 应用程序, 则是用浏览器打开一个网络应用程序页面,直接在浏览器页面中完成各种应用程 序操作。但是 Web 应用一般都需要网络服务器的支持,用户需要联网才能使用。 离线 Web 技术给 Web 应用程序提供了离线操作的功能,用 Web 打开一个网络页面, 当应用程序页面下载完毕后,这个软件就能使用了,就是离线了也能正常使用这 个软件。应用离线 Web 技术开发出来的 Web 应用程序让用户在没有网络的地方或 网络突然故障的时候,也能流畅的保持应用程序操作,等到网络通畅的时候,离 线操作过的应用自动被同步到 Web 上,大大方便了用户的使用。 离线 Web 技术在医疗行业应用设想 使用离线 Web 技术开发的 Web 应用程序既具有 Web 程序跨平台、穿透力强、 与 Web 应用无缝集成、良好的可移植性等各种优势,又实现了离线操作,并且大 大提高了 Web 程序的性能,因此离线 Web 技术完全可以被应用到企业的系统开发 中去。 国内许多大型医院正在实施“移动查房”,即使用无线网络和无线设备来实 现医生查房的数字化、护理记录数字化。医生携带无线设备,在覆盖无线网络的 病房查房时,边询问病人病情边在系统中实时记录。但是无线设备发出的信号有 时会对一些精密的医疗设备产生干扰,如果采用基于离线 Web 技术开发的系统, 可以很方便的解决这个问题,而不必采购昂贵的特制无线设备。即使小型医院也
可以利用有线网络加手持操作设备来实现移动查房的功能,花费的成本将远远小 于无线方案。 此外,医疗业务往往需要高可靠性、实时性的系统来支持运作,还必须配有 套应急方案来应对网络故障,避免网络瘫痪所造成的医疗业务瘫痪。传统做法 是开发另一套单机版系统,一旦发生网络故障,则立刻切换到单机系统中操作, 网络恢复后再将数据导入到网络服务器中。如果采用基于离线Web技术开发的系 统,用户就不需要手工切换不同的系统,一切网络连接操作都由系统自动处理完 成 我们还可以将应用扩大到OA、ERP系统中的某些应用,如0A中的论文申报、 科研申请、ERP中的财务差旅费报销申请等。这种需要通过在线申请,又要填写 大量详细资料,甚至于进行一些简单的文书处理的需求,可以通过用户离线操作 的方式来解决,而完全不用花费大量成本实施VPN,远程登陆内部系统操作,更 不需要一大堆的安全方案来确保网络接入的安全性。 基于以上一些设想,根据实际情况,我们在 Google的 Gears、 Microsoft 的 Silverlight, Adobe的 Apollo等离线平台中,选用 Google Gears+Dojo Offline做了一些简单的尝试 什么是 Google Gears Google Gears是一个开源的浏览器扩展,它允许网络应用程序使用以下Ja vaScript API提供离线功能 1.在本地储存及操作应用程序的资源; 2.将数据储存在本地的完全可搜索的关系数据里 3.运行异步 Javascript以提高应用程序的响应速度 更具体地说, Google Gears会将数据储存在你的硬盘上的一个 SQLite数据 库里,并且这些数据可以通过SQL命令获得
可以利用有线网络加手持操作设备来实现移动查房的功能,花费的成本将远远小 于无线方案。 此外,医疗业务往往需要高可靠性、实时性的系统来支持运作,还必须配有 一套应急方案来应对网络故障,避免网络瘫痪所造成的医疗业务瘫痪。传统做法 是开发另一套单机版系统,一旦发生网络故障,则立刻切换到单机系统中操作, 网络恢复后再将数据导入到网络服务器中。如果采用基于离线 Web 技术开发的系 统,用户就不需要手工切换不同的系统,一切网络连接操作都由系统自动处理完 成。 我们还可以将应用扩大到 OA、ERP 系统中的某些应用,如 OA 中的论文申报、 科研申请、ERP 中的财务差旅费报销申请等。这种需要通过在线申请,又要填写 大量详细资料,甚至于进行一些简单的文书处理的需求,可以通过用户离线操作 的方式来解决,而完全不用花费大量成本实施 VPN,远程登陆内部系统操作,更 不需要一大堆的安全方案来确保网络接入的安全性。 基于以上一些设想,根据实际情况,我们在 Google 的 Gears、Microsoft 的 SilverLight,Adobe 的 Apollo 等离线平台中,选用 Google Gears + Dojo Offline 做了一些简单的尝试。 什么是 Google Gears Google Gears 是一个开源的浏览器扩展,它允许网络应用程序使用以下 Ja vaScript API 提供离线功能: 1. 在本地储存及操作应用程序的资源; 2. 将数据储存在本地的完全可搜索的关系数据里; 3. 运行异步 Javascript 以提高应用程序的响应速度。 更具体地说,Google Gears 会将数据储存在你的硬盘上的一个 SQLite 数据 库里,并且这些数据可以通过 SQL 命令获得
Google gears的应用几乎是无限的,比如利用它 gmail可以实现离线阅读 及收发邮件,也可以实现 Google docs& Spreadsheets的离线编辑。或者想得 更远一些,有了 Google Gears,我们期昐已久的 GDrive离我们更近了。无论我 们是否与互联网连接,我们都将可以直接在浏览器里收发邮件、编辑文档、阅读 新闻、存储数据等,我们的日常电脑操作将会进一步从操作系统及单机软件转向 网络化 Dojo在 Google gears的基础上封装了 Do jo Offline,让开发者更加容易开 发离线的Web应用。 Google Gears使用体验 Google Gears主要包含3个模块 1. Localserver module(用于提供HTML, JavaScript,图片等的访问请 求)。 Localserver module就是本地服务器,大家都知道B/S的文件都 是存放在 server端的,不存在客户端,如果网络出了什么问题,那么 系统也就不能访问了, Localserver module就是为让断网的时候依然 可以使用B/S系统,将 server端的一些文件存储到本地。比如我们要 登记一个资料,以前没有B/S的系统断网了肯定不行,录入的界面打不 开,打开了也无法录入提交到服务器.用了 Localserver module,我们 就可以在断网的情况下打开录入界面,然后录入,然后使用 Database module存储,网络好了的时候在同步,我们也不用总是担心数据没及时 录入以免以后就忘记录入了。 2. Database module(本地数据库)。 Database module就是本地数据,可 以使用标准的sql语法操作,比如建表査询删除等等。这样很多常用数 据我们都可以本地化存储,不用每次都从 server端下载,提升了用户 体验,减少不必要的数据往返。特别是对网络环境不好的情况,用户在 操作的时候断网络,就可以把输入的数据现保存到本地库,后期网络正 常后在同步
Google Gears 的应用几乎是无限的,比如利用它 Gmail 可以实现离线阅读 及收发邮件,也可以实现 Google Docs & Spreadsheets 的离线编辑。或者想得 更远一些,有了 Google Gears,我们期昐已久的 GDrive 离我们更近了。无论我 们是否与互联网连接,我们都将可以直接在浏览器里收发邮件、编辑文档、阅读 新闻、存储数据等,我们的日常电脑操作将会进一步从操作系统及单机软件转向 网络化。 Dojo 在 Google Gears 的基础上封装了 Dojo Offline,让开发者更加容易开 发离线的 Web 应用。 Google Gears 使用体验 Google Gears 主要包含 3 个模块: 1. LocalServer module(用于提供 HTML, JavaScript, 图片等的访问请 求)。LocalServer module 就是本地服务器,大家都知道 B/S 的文件都 是存放在 server 端的,不存在客户端,如果网络出了什么问题,那么 系统也就不能访问了, LocalServer module 就是为让断网的时候依然 可以使用 B/S 系统,将 server 端的一些文件存储到本地。比如我们要 登记一个资料,以前没有 B/S 的系统断网了肯定不行,录入的界面打不 开,打开了也无法录入提交到服务器. 用了 LocalServer module,我们 就可以在断网的情况下打开录入界面,然后录入,然后使用 Database module 存储,网络好了的时候在同步,我们也不用总是担心数据没及时 录入以免以后就忘记录入了。 2. Database module(本地数据库)。Database module 就是本地数据,可 以使用标准的 sql 语法操作,比如建表查询删除等等。这样很多常用数 据我们都可以本地化存储,不用每次都从 server 端下载,提升了用户 体验,减少不必要的数据往返。特别是对网络环境不好的情况,用户在 操作的时候断网络,就可以把输入的数据现保存到本地库,后期网络正 常后在同步
3. Workerpool module(工作者池,通过异步的方式在后台进行资源访问 的操作,比如同步本地用户数据到服务器,使浏览器程序保持快速响应)。 WorkerPool module是一个最重要的模块,用过pool技术的都知道,p ool中的各个主体独自工作,这里的pool是实现了让多个js在后台异 步运行互不干涉,这样用户在使用系统的时候,是感受不到有js在运 行的,以前js运行的时候,界面都是不可操作的,必须要等js运行完 了,才能做其他操作,使用 WorkerPool module就可以解决这个问题。 比如在我们的系统中,要把服务器的数据库(某个表)本地化,大概需 要1个小时,如果使用传统的js来操作,界面就要运行一个小时(可能 没有响应),ie基本都是白屏。这显然是行不通的了,所有我们只能用 Workerpool module,在用户没有感觉的情况下,在后台通过ajax分段 获取到服务器的数据,然后启动 WorkerPool module写入 如何安装 Google Gears s=GoogleGears:http://code.googlecom/apis/gears/install.html 如何检查客户电脑上是否安装了 Google Gears? 在页面里面包含这一段js: 示例代码如下 if (!window. google I google. gears)t locationhref=http://gears.googlecom/?action=install&message= &return=syour websi te url> </script 我们看到其中提示用户安装的地址允许定制两个自定义信息 message:用户提示信息,不超过150个字
3. WorkerPool module(工作者池,通过异步的方式在后台进行资源访问 的操作,比如同步本地用户数据到服务器,使浏览器程序保持快速响应)。 WorkerPool module 是一个最重要的模块,用过 pool 技术的都知道,p ool 中的各个主体独自工作,这里的 pool 是实现了让多个 js 在后台异 步运行互不干涉,这样用户在使用系统的时候,是感受不到有 js 在运 行的,以前 js 运行的时候,界面都是不可操作的,必须要等 js 运行完 了,才能做其他操作,使用 WorkerPool module 就可以解决这个问题。 比如在我们的系统中,要把服务器的数据库(某个表)本地化,大概需 要 1 个小时,如果使用传统的 js 来操作,界面就要运行一个小时(可能 没有响应),ie 基本都是白屏。这显然是行不通的了,所有我们只能用 WorkerPool module,在用户没有感觉的情况下,在后台通过 ajax 分段 获取到服务器的数据,然后启动 WorkerPool module 写入。 如何安装 Google Gears 安装 Google Gears: http://code.google.com/apis/gears/install.html 如何检查客户电脑上是否安装了 Google Gears? 在页面里面包含这一段 js: 示例代码如下: if (!window.google || !google.gears) { location.href = "http://gears.google.com/?action=install&message=" + "&return="; } 我们看到其中提示用户安装的地址允许定制两个自定义信息: message: 用户提示信息,不超过 150 个字
return:安装完毕后返回的地址,也就是我们自己的web程序页面。 看一下 gears_init.js会发现,对 Windows而言,实际上 Google Gears 在客户端安装了一个 ActiveX对象: factory new ActiveXObject( Gears. Factory') Google gears的所有功能调用都是通过操纵该对象来完成的 数据库Demo http:/code.google.com/apisgears/samples/helloworlddatabasehtml 这个例子允许用户输入一些信息,并显示出最近输入的3条。在用户下次访 问时仍然存在。其界面如下 Google Gears Database Demo- Windows Internet Explorer ·Rh99 Coogle G 开始+ 设置 i 4 G Google Gears Database D 页面 Google Gears Database Demo To see how this works, use the view source feature of your browser Enter a phrase to store in the database Your last three phrases were (1)将计就计 (2)方法 (3)dfsdffgf This page uses Google Gears to record your entnes on the local disk. If you navigate away and revisit this page, all your data will still be here. Try it! □[
return: 安装完毕后返回的地址,也就是我们自己的 web 程序页面。 看一下 gears_init.js 会发现,对 Windows 而言,实际上 Google Gears 在客户端安装了一个 ActiveX 对象: factory = new ActiveXObject('Gears.Factory'); Google Gears 的所有功能调用都是通过操纵该对象来完成的。 数据库 Demo http://code.google.com/apis/gears/samples/hello_world_database.html 这个例子允许用户输入一些信息,并显示出最近输入的 3 条。在用户下次访 问时仍然存在。其界面如下:
首先在HTML页面里面包含如下代码,用于 gears的安装探测,这个是每 个页面必须的: 下面执行一些初始化工作,并打开数据库 //数据库连接对象 inito; //打开本页面对应的本地数据库 function inito i if (!window. google I google gears)t re turi } try t db google gears. factory create(beta database,1.0); I catch (ex) t setError c Could not create database:+ ex message) db.open( database-demo');//打开数据库 //创建表的语法 db. exe cute(create table if not exists demo (Phrase varchar (255), Times tamp int)) 获取最新的3条记录,并删除其他老的记录的实现代码 var recent phrases =[,, try t /这里返回的实际上是一个记录集的游标( cursor),和AsP的经典写法很类似 var rs =db. execute('select from Demo order by Timestamp desc); var index =0. while (rs. isvalidRoWO)[ if (index< 3)[ centphrases [index= rs field(o; f else i
首先在 HTML 页面里面包含如下代码,用于 gears 的安装探测,这个是每 个页面必须的: 下面执行一些初始化工作,并打开数据库: // 数据库连接对象 var db; init(); // 打开本页面对应的本地数据库. function init() { if (!window.google || !google.gears) { return; } try { db = google.gears.factory.create('beta.database', '1.0'); } catch (ex) { setError('Could not create database: ' + ex.message); } if (db) { db.open('database-demo'); // 打开数据库 // 创建表的语法 db.execute('create table if not exists Demo' + ' (Phrase varchar(255), Timestamp int)'); // } // } 获取最新的 3 条记录,并删除其他老的记录的实现代码: var recentPhrases = ['', '', '']; try { // 这里返回的实际上是一个记录集的游标(cursor),和 ASP 的经典写法很类似。 var rs = db.execute('select * from Demo order by Timestamp desc'); var index = 0; while (rs.isValidRow()) { if (index < 3) { recentPhrases[index] = rs.field(0); } else {
/这里可以看到 Temps tamp(时间戳)被当作主键使用了。 db. execute('delete from Demo where Timestamp=?, [rs field(1)]); nexto throw new Error(e message); 用户输入数据提交时,用如下逻辑实现插入数据的功能 function handl esubmito i if (i google gears. factory I !db)t return var elm = document. getElementById(submitvalue); ar phrase elm valt /注意 getTime(方法返回的是日期对象相当于某个基准时间的毫秒数,是一个大整数 var currTime new Date getTime o /插入新记录 Gears数据库能自动转义/反转义插入的值 // (The Gears database automatically escapes/unescapes inserted value Ib execute( insert into Demo values (? ?),[phrase, currTime]) ∥ Update the elm. value disp layRecen pHrases o; 关闭浏览器后,重新打开看这个页面,数据还在。可以将 Google的这个 demo页面代码复制到本地,打开html离线执行,其功能是一样的 在本机保存网上的资源 http:/lcode.google.com/apis/gears/samples/helloworldresourcestore.html 这个例子的内容是演示如何在本机保存网上的资源,以便开发离线应用
// 这里可以看到 Tempstamp(时间戳)被当作主键使用了。 db.execute('delete from Demo where Timestamp=?', [rs.field(1)]); } ++index; rs.next(); } rs.close(); } catch (e) { throw new Error(e.message); } 用户输入数据提交时,用如下逻辑实现插入数据的功能: function handleSubmit() { if (!google.gears.factory || !db) { return; } var elm = document.getElementById('submitValue'); var phrase = elm.value; // 注意 getTime() 方法返回的是日期对象相当于某个基准时间的毫秒数,是一个大整数 var currTime = new Date().getTime(); // 插入新记录 // Gears 数据库能自动转义/反转义插入的值。 // (The Gears database automatically escapes/unescapes inserted value s.) db.execute('insert into Demo values (?, ?)', [phrase, currTime]); // Update the UI. elm.value = ''; displayRecentPhrases(); } 关闭浏览器后,重新打开看这个页面,数据还在。可以将 Google 的这个 demo 页面代码复制到本地,打开 html 离线执行,其功能是一样的。 在本机保存网上的资源 http://code.google.com/apis/gears/samples/hello_world_resourcestore.html 这个例子的内容是演示如何在本机保存网上的资源,以便开发离线应用
要注意的是这个离线资源是和浏览器的缓存无关的,可以拔掉网线,删除浏 览器缓存,这时仍然可以通过常规URL(比如:htp!/ /code. google. com/apis/q ears/ samples/hello world resourcestore htm)访问页面的功能! Google Gears Resource store Demo To see how this works, use the view source feature of your browser Create Store Capture Uncapture Remove Store Capturing /apis/gears/samples/hello world resourcestore html captured succeeded sample. js captured succeeded mple. css captured succeeded gears_init s captured succeeded This page demonstrates basic usage of Resource Store Things you can d Press the Create Store button to create a resource store to contain captured Press the Capture button to capture this page o Unplug the network cable and verify that you can still access this page o Delete your browser cache and verify that you can still access this page Press the Uncapture button to remove the page from the Resource Store. Verify that can no longer access the page offline Press the Remove Store button to remove the resource store 口口 Internet 该应用的初始化阶段,需要用js先创建本地服务器对象 var localserver= google gears. factory create(beta. localserver,1.0) 例子界面中的几个按钮功能的分析如下 1. CreateStore:创建一个 Store。 Store之于 Localserver,类似于数据库 的 Table之于 DataBase的关系。 var STORE =helloworld-store /如果该名称的 Store已经存在,则会打开已有的 var store= localserver. createstore (STORE_NAME)
要注意的是这个离线资源是和浏览器的缓存无关的,可以拔掉网线,删除浏 览器缓存,这时仍然可以通过常规 URL (比如:http://code.google.com/apis/g ears/samples/hello_world_resourcestore.html)访问页面的功能! 该应用的初始化阶段,需要用 js 先创建本地服务器对象: var localServer = google.gears.factory.create('beta.localserver', '1.0'); 例子界面中的几个按钮功能的分析如下: 1. CreateStore:创建一个 Store。Store 之于 LocalServer,类似于数据库 的 Table 之于 DataBase 的关系。 var STORE_NAME = 'helloworld-store'; // 如果该名称的 Store 已经存在,则会打开已有的。 var store = localServer.createStore(STORE_NAME);
Capture:捕获需要的资源到本地。 //先在一个数组里定义好需要获取到本机的资源名称 var filesToCapture =D location. pathname,//代表当前页面的ur1 sample. cSs gears_Init. Js ] //捕获文件到本地,允许指定一个回调函数进行自定义的处理 store capture(files Tocapture, capturecal lback) /回调函数。这里仅仅做一下进展状态的汇报工作 function captu recal lback(url, success, captureD) t adds tatus (ur1 captured +(success succeede i1ed")); 3. UnCapture:取消捕获 for (var i =0; i< filesToCapture. length; i++)t store. remove(fi lesTocapture[i]) 4. RemoveStore:删除 Store /删除 store之前需要首先用 openstope方法测试其是否存在 if (localserver. openstore(STORE_NAME))t ocalserver. removes tore(STORE_NAME) /释放 store占用的指针,标志为可垃圾回收资源 store 本地操作数据库 1.创建新的连接类( Factory class) db google gears. fac tory. create( beta. database,1. 0 object create(c l assName, version) Suppor ted class names are: beta database, beta. locals rver, beta workerpool 用 getBui ldInfo(可以获取版本状态 var info=google gears. factory. getBuildInfoO: alert (info)
2. Capture: 捕获需要的资源到本地。 // 先在一个数组里定义好需要获取到本机的资源名称 var filesToCapture = [ location.pathname, // 代表当前页面的 url 'sample.js', 'sample.css', 'gears_init.js' ]; // 捕获文件到本地,允许指定一个回调函数进行自定义的处理 store.capture(filesToCapture, captureCallback); // 回调函数。这里仅仅做一下进展状态的汇报工作 function captureCallback(url, success, captureId) { addStatus(url + ' captured ' + (success ? 'succeeded' : 'failed')); } 3. UnCapture: 取消捕获 for (var i = 0; i < filesToCapture.length; i++) { store.remove(filesToCapture[i]); } 4. RemoveStore: 删除 Store // 删除 Store 之前需要首先用 openStore 方法测试其是否存在 if (localServer.openStore(STORE_NAME)) { localServer.removeStore(STORE_NAME); // 释放 store 占用的指针,标志为可垃圾回收资源 store = null; } 本地操作数据库 1. 创建新的连接类(Factory class) db = google.gears.factory.create('beta.database', '1.0'); Object create(className, version) Supported class names are: beta.database,beta.localserver,beta.workerpool 用 getBuildInfo() 可以获取版本状态 var info=google.gears.factory.getBuildInfo();alert(info)
2.打开数据库 db. open('database-demo) 如果数据库不存在则创建该数据库) 3.创建表 db. execute(create table if not exis ts demo+(phrase varchar(255), time stamp int)); create table if not exists表名〔字段名类型(长度)) (如果数据表不存在则创建该数据表) 4.插入新记录 db. exe cute( insert into Demo values (?, ?), [phrase, currTime]); ( phrase, currTime是js里的变量,字段的值) 5.查找记录 db. execute('select from Demo order by Ti mest amp desc) 6.删除记录 db. execute (de lete from Demo where Times tamp=?, [rs field(1)]); 使用 Dojo offline开发 Do jo Offline包装了 Gears,使开发者更轻便简易地 coding。 首先要先下载0.9或以上版本的Dojo源码,解压后的文件里含有4个目录 dijit,dojo, do jox,util。这里将此4个目录放置在dojo-js文件夹中,web app的包结构如下: doj-js内含4个文件 WEB-INF含有1ib和web.xml,这里不涉及这些东西,可忽略。 test.html测试网页,源码如下
2. 打开数据库 db.open('database-demo'); (如果数据库不存在则创建该数据库) 3. 创建表 db.execute('create table if not exists Demo' +' (Phrase varchar(255), Time stamp int)'); create table if not exists 表名 (字段名 类型(长度)) (如果数据表不存在则创建该数据表) 4. 插入新记录 db.execute('insert into Demo values (?, ?)', [phrase, currTime]); (phrase, currTime 是 js 里的变量,字段的值) 5. 查找记录 db.execute('select * from Demo order by Timestamp desc'); 6. 删除记录 db.execute('delete from Demo where Timestamp=?', [rs.field(1)]); 使用 Dojo Offline 开发 Dojo Offline 包装了 Gears,使开发者更轻便简易地 coding。 首先要先下载 0.9 或以上版本的 Dojo 源码,解压后的文件里含有 4 个目录 dijit,dojo,dojox,util。这里将此 4 个目录放置在 dojo-js 文件夹中,web app 的包结构如下: dojo-js 内含 4 个文件 WEB-INF 含有 lib 和 web.xml,这里不涉及这些东西,可忽略。 test.html 测试网页,源码如下: