马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
原文网址:
https://mp.weixin.qq.com/s/yjdmeqbFl-OyaWjOf_6J1g
今天进入我们这个技术文章系列的重头戏!我们来分析一下Volt的源代码。我们是怎么得到Volt的源代码的呢?来源有两个:
Volt应用数据库volt/<应用的Uid>.nsf中的“资源-文件”。这些文件是Volt应用运行时所需的一些Web资源,例如图片、js,json、css、html等等。获取这些代码很容易,会使用Domino Designer的技术人员很容易获得这些源代码文件的。需要说明的一点是:在“资源-文件”中的文件名称如果是desktop/..../xxxx格式的,我们导出以后会变为desktop_2f_...._2f_....这个样的文件名,这里的“_2f_”代表“/”而已。 我们使用了特殊方式去“窥视”了一下Volt的一些jar包。具体的方法就不说了,懂行的人立马明白,不懂行的人也别追究了。这里必须说明一下:这些源代码是有知识产权的,学习和借鉴过程中,千万不要侵犯HCL的知识产权!
二、技术原理
Volt其实是Domino OSGi的一种技术实现。Domino本身就是应用了大量的Java技术,从IBM Domino R8.5开始就开始把OSGi引入到Domino Web开发中,允许Java程序员利用OSGi对Domino平台进行扩展。我们熟知的XPages技术就是一种OSGi。
Volt的核心系统代码就在Domino服务器的osgi/volt/eclipse/plugins目录里面。如下图所示。
在这些Volt的系统代码(就是Java程序代码)中,我们可以看到如下几大类组件:
IBM Form Platform Service组件 —— 其实Volt的本源就是IBM Forms,后来叫HCL Leap,把IBM Forms(HCL Leap)改造一下并封装成Domino OSGi应用后就变成了HCL Domino Volt。 HCL Domino Leap(dleap) —— 一个Domino OSGi应用,就是HCL Domino Volt的主体程序。
邮件 —— javax.mail API :用于发送邮件。 PDF —— Apache PDFBox :用于操作PDF文件。 POI —— Apache POI:用于操作Excel文件。 Logging —— Apache Common Logging:用于进行日志记录。 Apache HTTP Client , Commons IO , Commons File Upload—— 用于实现REST API访问、文件操作、文件上传等HTTP操作。 JNA —— Java本地资源访问的JNI的封装。 Apache Abdera —— 一个用Java实现的Atom协议,基于HTTP实现Web资源的编辑和发布的协议。现在您明白了为什么要在安装HCL Domino Volt后,需要在Domino服务器的notes.ini文件中加入“HTTPEnableMethods=GET,POST,PUT,DELETE,HEAD”参数了吧。
其它辅助性组件
运行Volt应用所需的Web资源文件中,所有的js文件中的Javascript代码都是基于Dojo框架的。从IBM Domino R8.5开始,Dojo就一直是Domino Web应用所采用的默认的JS框架,官方的XPages和Domino扩展组件(当然也包括Volt)的前台JS框架都是Dojo。找个源代码文件给大家看看就知道了。如下图。
当Domino服务器启动以后,Volt就作为Domino OGSi应用随Domino启动并加载。所有Volt的功能均由hleap这个OSGi应用提供服务。当你访问一个Volt应用时,系统会根据volt/VoltBuilder.nsf中的应用列表找到 volt/<应用的Uid>.nsf 进行数据操作,而Volt应用的用户界面则是由Volt提供,仅仅把 volt/<应用的Uid>.nsf 当做一个数据库使用。但是如果需要展现数据,就需要使用 volt/<应用的Uid>.nsf 里面的Notes视图来定义前台如何显示数据表格(不是直接在Web端显示Notes视图,而是用Notes视图作为一种显示格式的定义,比如有几列,每列显示什么内容,同时读取Notes视图的数据REST API来读取数据)。
二、1、前台代码分析
我们需要重点分析的是Volt应用数据库中的“资源-文件”中desktop/xxx.js 这样的JS文件里面的代码。这种JS文件里面是一个前台显示的Volt表单的JS。因为这样的JS代码是开放的,我们进行分析的顾虑就小了很多。我们使用VS Code打开这样的JS文件。哈哈!原来我们看到的Volt表单里面最主要的部分在这里定义的。见下面两个图。第一张图是Volt表单界面,第二张图是这个Volt表单对应的JS文件。
Volt表单范例:我们看到的界面。
Volt表单对应的JS文件。
我们看一下在JS文件中定义的Volt表单的主体的HTML代码部分。主体部分是dojo.declare声明的——你设计一个Volt表单时有几个页面(Page),就有几个dojo.declare。每个dojo.declare定义一个页面(Page)的HTML主体部分。下图是一个Volt表单的一个页面(Page)的定义。
Volt表单中每一个页面的JS定义。
我们可以看到键值“templateString”就是这个Volt表单的一个页面的主体HTML代码。但是HTML代码中还有很多动态参数定义。这些动态参数定义将在前端被替换为实际的内容。我们摘取其中一段来讲解一下。- <font size="3" face="微软雅黑"><font size="3"><label id="${_uid}F_Paragraphtext1-label" for="${_uid}F_Paragraphtext1-widget" class="lfFormLabel">多行条目</label>\n<div class="hint lfFormFieldHint" id="${_uid}F_Paragraphtext1-hint" style="display: block;">这里是您的个人简介</div></font></font>
复制代码 这里面的${_uid}将被替换为真实的Uid。见下图。
那么这个Uid是怎么来的呢?在哪里定义的呢?我在这里先提及一下。来自于"资源-文件"中的application.xml。后面我们会单独分析这个文件。这个文件太重要了,是一切Volt系统程序的起点。上一篇文章说过,当你用Volt设计应用时,所有的设计元素,表单、页面、表格、输入框……全部都会自动被标识上一个Uid。如果你在设计Volt表单时还使用了服务(Service),那么这些内容的前台定义都在该表单名称相关的html,js,json中。具体的就不细讲了。
我们还要关注的是类似于“desktop/widget/F_xxx_P_xxx.html”这样的html文件。我们打开看一看,这里面是啥玩意。
我的天啊,里面全部是基于dojo的HTML代码啊。但是请注意,里面还是有${_uid}这样的动态标签,会被替换成真实的Uid的内容。
下面,我们看一看Volt表单在浏览器端的代码是啥样的。可以说,全部是通过dojo与后台Volt系统交互出来的HTML代码。就说一点:就是前台的dojo去访问后台的这些Web资源文件(通过Volt代码,不是直接访问Notes数据库的文件资源)由前台JS动态生成的Web界面。
在此范例的Web源代码中,最重要的一句话是:if(FREEDOM.theMainFormName != null) {
dojo.require("freedom.widget.solution.environment.CurrentItemView");
dojo.require("freedomapplication._92fc4c93_1c65_42de_85a2_41f6f6ad273e");
dojo.require('freedom.client.DataStore');
dojo.require('freedom.client.SimpleController');
}
看到那个Volt应用的Uid了吗?这就是一切Volt程序的起点。通过这个Uid,系统自动找到Volt应用数据库(volt/92fc4c93_1c65_42de_85a2_41f6f6ad273e.nsf)然后后台加载数据库中的“资源-文件”,返回到前台后由dojo在动态生成表单界面。
我们总结一下前台代码分析的结果:
前台Volt表单显示并不是使用的Notes表单直接显示的,而是通过Volt系统动态生成的。 当我们启动一个Volt应用显示我们设计好的表单界面时,Volt会从Volt应用数据库中的“资源-文件”中加载表单对应的html,js,json,css等Web资源文件,在处理以后发送给前台的dojo。 Volt在应用数据库的“资源-文件”中缓存了该Volt应用的前台的UI代码、js代码,css代码,这样做其实是加快了后台处理速度。(这点值得学习) 至于那些"desktop/....html,js,json"是到底是什么样的关系,起到什么作用,只有您亲自去研究了。我就不讲了,嘿嘿……(这也是我们的一点点私心嘛,请您理解哟)。提示一下:前台看到一段代码,就反推回去,再对照“资源-文件”中的那些文件,看看里面的内容,就会搞明白了哟。
为什么要要研究Volt的前台代码的技术原理呢?因为你可以改那些资源文件嘛。改一改就知道Volt前台的用户界面也是可以从底层就被您换掉的喽。这也属于Volt应用深度定制的一种方法呀。
其余部分请访问: https://mp.weixin.qq.com/s/yjdmeqbFl-OyaWjOf_6J1g
|