本篇文章主要介绍了"B/S技术开发桌面应用",主要涉及到方面的内容,对于SQLite感兴趣的同学可以参考一下:
B/S技术开发桌面应用随着HTML5规范的越来越完善,其功能也越来越强大,用来构建界面的代价远远小于传统桌面程序。笔者从事web开发多年,对B/S开发技术积累比...
B/S技术开发桌面应用
随着HTML5规范的越来越完善,其功能也越来越强大,用来构建界面的代价远远小于传统桌面程序。笔者从事web开发多年,对B/S开发技术积累比较好,对传统桌面开发只知道一些皮毛。最近有这样一个需求:将一个用java开发的web网站做成单机版,前端页面使用到了ativex技术(IE Only)。于是笔者踏上了漫漫长征路,期间用到了Java、Node.js、C/C++、VB6.0、C#这5种开发语言,碰到了各种各样奇葩的问题,所幸的是百度虽不靠谱但谷歌还是靠谱的,国内外优秀的文章帮我解决了不少问题,下面进入正题。
1、客户端
经过我的调研,目前适合做成客户端的浏览器主要有两款,Electron 和 NW.JS。您可能要说了,为什么不用Delphi或者VB6.0内嵌的WebBrower控件做客户端,基于IE内核的,刚好需求里面网页也用到的了activeX,一举两得。笔者尝试过类似的解决方案,试了J2SE的两款swing浏览器,DJNativeSwing和JDIC,都是基于IE内核的,这种方法的主要问题是需要设置用户的IE浏览器,要允许AtiveX控件运行、加入可信站点、允许跨域访问什么的,而且客户机器千奇百怪很有可能缺少xxx.dll或者IE本身就是有问题的,因此客户端选择独立浏览器是我最终的选择。
言归正传,Electron 和 NW.JS技术架构是一致的,界面展示基于chromium浏览器(Chrome的内核也是chromium,chromium对HTML5支持的相当好),然后对本地操作的能力是利用的node.js,在此不详细展开说chromium和node.js怎么结合起来的,相关知识大家自行了解,我们来说一下这两者区别:
(1)Electron http://www.wllm.com.cn/
①node.js的context和javascript的context是混合的,即在node.js里面可以访问页面dom元素
②node.js的第三方扩展用node-gyp编译后可以直接使用,无需再次编译
③不支持XP
(2)NW.JS(原名Node-Webkit)http://nwjs.io/
①v0.13.0以前的版本node.js和javascript的context是分开的,不可在node.js里里面访问页面dom元素
②v0.13.0以前的版本node.js的第三方扩展用node-gyp编译后,还得经过nw-gyp编译才能使用(大坑,很多第三方扩展node-gyp编译好了,nw-gyp怎么也编译不通过)
③支持XP
综上,我选择了NW.JS的最新版本(v0.13.0-rc1),要在去年还真不好决定选用哪个(2015年我尝试了nw.js的v0.12.0,死在nw-gyp打包第三方扩展上了)。
好了,独立浏览器已就绪,能很好的支持HTML5了,但是问题来了,Ativex呢?
我们来分析下,这个Activex控件就是VB和Delphi里面的RichTextBox,作用是用来显示RTF富文本格式文档的。那么解决问题的办法有两个:
(1)将rtf转换成pdf
我们知道Chrome是原生支持打开pdf格式文档的,直接拖进去就可以打开,这个功能其实在chromium就有,但是有弊端,就是pdf文档的周围会有一堆工具按钮,打印、旋转什么的,我尝试了一下,无法隐藏,没去深究,放弃。
(2)将rtf转换成html5
在网上搜索了rtf转html方案,得到两个dll,一个dll是vc写的,支持将rtf转换成html4+图片文件,一个dll是c#写的,支持将rtf转换成html5,图片以base64编码形式内嵌在html5页面里面,我选择了c#的dll程序集。但是这两个dll都不支持rtf文档里面同时含有内码和unicode码,转换会出现乱码,解决方法是调用RichTextBox控件先将同时含有内码和unicode码的rtf文本转成只含有内码的rtf文本再转换为html5.
下面就是node.js和c#程序集、VB的ocx控件交互的问题。
碰到多语言交互我的第一想法就是建立一个统一的接口,各个语言开发接口的实现类和调用类,然后客户端按照接口调用服务端就完事。找到了大名鼎鼎的Thrift,能生成所有主流编程语言接口。