HCL 中文技术社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5877|回复: 1

源码级解构HCL Domino Volt低代码工具(二、技术原理)

[复制链接] TA的帖子

124

主题

200

帖子

4452

积分

超级版主

Rank: 8Rank: 8

积分
4452

活跃会员热心会员灌水之王最佳新人

发表于 2020-9-24 13:22:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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目录里面。如下图所示。
640.png
640 (1).png

在这些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。找个源代码文件给大家看看就知道了。如下图。
640 (2).png

当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文件。
640 (3).png

Volt表单范例:我们看到的界面。

640 (4).png
Volt表单对应的JS文件。

我们看一下在JS文件中定义的Volt表单的主体的HTML代码部分。主体部分是dojo.declare声明的——你设计一个Volt表单时有几个页面(Page),就有几个dojo.declare。每个dojo.declare定义一个页面(Page)的HTML主体部分。下图是一个Volt表单的一个页面(Page)的定义。
640 (5).png

Volt表单中每一个页面的JS定义。

我们可以看到键值“templateString”就是这个Volt表单的一个页面的主体HTML代码。但是HTML代码中还有很多动态参数定义。这些动态参数定义将在前端被替换为实际的内容。我们摘取其中一段来讲解一下。
  1. <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。见下图。
640 (6).png

那么这个Uid是怎么来的呢?在哪里定义的呢?我在这里先提及一下。来自于"资源-文件"中的application.xml。后面我们会单独分析这个文件。这个文件太重要了,是一切Volt系统程序的起点。上一篇文章说过,当你用Volt设计应用时,所有的设计元素,表单、页面、表格、输入框……全部都会自动被标识上一个Uid。如果你在设计Volt表单时还使用了服务(Service),那么这些内容的前台定义都在该表单名称相关的html,js,json中。具体的就不细讲了。
我们还要关注的是类似于“desktop/widget/F_xxx_P_xxx.html”这样的html文件。我们打开看一看,这里面是啥玩意。
640 (7).png

我的天啊,里面全部是基于dojo的HTML代码啊。但是请注意,里面还是有${_uid}这样的动态标签,会被替换成真实的Uid的内容。
下面,我们看一看Volt表单在浏览器端的代码是啥样的。可以说,全部是通过dojo与后台Volt系统交互出来的HTML代码。就说一点:就是前台的dojo去访问后台的这些Web资源文件(通过Volt代码,不是直接访问Notes数据库的文件资源)由前台JS动态生成的Web界面。
640 (8).png

在此范例的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




回复

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2021-5-4 22:54:21 | 显示全部楼层

They sterilized source cytology warrant.

Many nww.eequ.lotusfans.cn.kzh.gw faulty marriages viagra online pills cialis sublingual prednisone thailand synthroid over the counter prednisone in canada priligy purchase hydroxychloroquine online from canada lasix 40mg no prescription amoxil equivalent prices in uk amoxil buy finasteride 5mg with amex prednisone canada 10 mg pharmacy medicament levitra generic hydroxychloroquine europe buy fml forte online cheap viagra invariably, inspiratory harming <a href="http://itravel4life.com/low-cost-viagra/">low cost viagra</a> <a href="http://doctor123.org/product/cialis-sublingual/">cialis sublingual hong kong</a> generic cialis sublingual overnight deliver western union <a href="http://doctor123.org/cheapest-generic-prednisone-prices/">buy cheap prednisone from india</a> <a href="http://thenectarystpaul.com/product/synthroid/">synthroid express shipping in new jersey</a> <a href="http://goldpanningtools.com/prednisone/">over the counter prednisone in canada</a> <a href="http://nwdieselandauto.com/item/cheap-priligy-tabs/">priligy and paypal</a> <a href="http://dallasneurological.com/hydroxychloroquine/">hydroxychloroquine</a> <a href="http://goldpanningtools.com/item/lasix/">lasix, greece</a> <a href="http://refrigeratordealers.com/prices-in-uk-amoxil/">amoxil generic overnight shipping</a> <a href="http://gasmaskedlestat.com/propecia-online/">propecia prescription online</a> <a href="http://goldpanningtools.com/prednisone-canada-10-mg-pharmacy/">prednisone canada 10 mg pharmacy</a> <a href="http://losangelesathleticassociation.org/pill/levitra/">levitra</a> levitra sin receta <a href="http://doctor123.org/product/generic-hydroxychloroquine-europe/">best price for hydroxychloroquine at pharmacy</a> <a href="http://greatlakestributarymodeling.net/pill/fml-forte/">black market fml-forte</a> <a href="http://fountainheadapartmentsma.com/viagra-generic-cena/">viagra generic cena</a> malleolar hair dyspepsia, http://itravel4life.com/low-cost-viagra/ viagra medicines 100mg viagra pills http://doctor123.org/product/cialis-sublingual/ cialis sublingual pas chere http://doctor123.org/cheapest-generic-prednisone-prices/ venta prednisone online http://thenectarystpaul.com/product/synthroid/ levothyroxine skin buy levothyroxine online http://goldpanningtools.com/prednisone/ prednisone http://nwdieselandauto.com/item/cheap-priligy-tabs/ buy priligy houston http://dallasneurological.com/hydroxychloroquine/ hydroxychloroquine emails http://goldpanningtools.com/item/lasix/ online prescription sales of lasix http://refrigeratordealers.com/prices-in-uk-amoxil/ cheapest amoxil price amoxil http://gasmaskedlestat.com/propecia-online/ propecia online http://goldpanningtools.com/prednisone-canada-10-mg-pharmacy/ get some prednisone prednisone http://losangelesathleticassociation.org/pill/levitra/ buy levitra online usa http://doctor123.org/product/generic-hydroxychloroquine-europe/ hydroxychloroquine generic thailand http://greatlakestributarymodeling.net/pill/fml-forte/ buy fml forte online cheap http://fountainheadapartmentsma.com/viagra-generic-cena/ best viagra price online payments non-contributory nondirective.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|HCL 中文技术社区 ( 沪ICP备17044822号 )

GMT+8, 2022-6-27 22:52 , Processed in 1.078545 second(s), 31 queries .

快速回复 返回顶部 返回列表