1 需求背景
我们在企业应用开发中经常会用到ActiveX控件,如:华表打印控件、密码小键盘控件、写卡器控件、读取客户端IP、MAC信息的控件、二代身份证读取控件。
1.1 问题现象
这些控件在代码中的调用方式不够标准,五花八门,千差万别,如:
// 没有版本号,和本地安装版本比对发现有新版本时不会提示用户进行升级
<object classid="clsid:80B7C135-4C0B-48DE-BA77-0E353012C169" id="TcpCfg"
codebase="<%=request.getContextPath()%>/data/gettcpcfg.ocx">
</object>
// Jsp所在路径才行,否则找不到
<object id="ThirdParty" name="ThirdParty" classid="clsid:DAD0331B-6F7E-4CFB-89BF-1DE86A0AC626"
codebase="ThirdParty.ocx" width="10" height="10">
</object>
<object classid="clsid:14B8260F-CBF7-41C0-B52B-062F712ACBF1" id="CRSClientHUB" height="0" width="0" ></object>
// 如果不写,操作员没有安装,会直接报错,不会提示安装
<object classid="CLSID:636BCD61-4473-4FF5-A4C6-6E030C31EBD4" id="BossICCardOCX"></object>
// 没有版本号
<object classid="clsid:3FA32835-2A6A-45E9-B6E9-B00A779A60F3" id="MINIPRINT" name="miniCell"
width="0" height="0" codebase="<%=miniPath%>"></object> |
1.2 问题总结
由上面代码可以看出,上面的代码有的指定了codebase,有的没有指定codebase,对于没有指定codebase的情况,控件无法自动下载安装,用户安装该控件只有一种方式,那就是主动下载控件安装包进行手工安装。当前所有的控件使用方式,都无法实现控件版本升级后自动更新,只能靠通知用户手工下载安装包重新安装来实现升级。因此,有必要对当前系统中控件使用方法进行规范,简化调用方式,减少代码量,同时实现自动升级。
2 解决方案(tag)
2.1 使用tag引用ActiveX控件
<xx:activex id='KeyCard1' code='KeyCard' style=”…..” /> // keyCard唯一标记数据库中一个控件
tag从数据库中取出该控件的相关属性(是否显示、classid、codebase、版本号等),然后组装成以下格式的HTML:
<object id="KeyCard1" style="display:none" classid="clsid:ACFC1E38-2FA5-4D00-BA69-0EFB62BC96C6" codebase="/data/KeyCard.cab#version=1,0,0,0">
</object>
其中Codebase部分包括.ocx文件的版本号。IE会比较HTML中的版本号和已经安装的控件的版本号,如果浏览器发现控件的版本升级了,就会自动去更新控件。
后续需要发布新版本的ActiveX控件时,只需要更新对应的cab文件,并在数据库中修改对应的版本信息,用户在用到该控件时浏览器会自动提示下载更新。
2.2 数据库
在数据库中增加一个存放ActiveX信息的字典表SA_DB_ACTIVEX,格式如下:
字段名称 |
字段说明 |
字段类型 |
备注 |
CODE |
ActiveX控件编码 |
VARCHAR2(32) |
在Tag中引用 |
CLASSID |
ActiveX Classid |
VARCHAR2(64) |
如:clsid:ACFC1E38-2FA5-4D00-BA69-0EFB62BC96C6 |
STYLE |
ActiveX显示属性 |
VARCHAR2(256) |
如:display:none |
CODEBASE |
ActiveX安装包及版本 |
VARCHAR2(256) |
如:/data/KeyCard.cab#version=1,0,0,0 |
DESCRIPTION |
ActiveX描述 |
VARCHAR2(256) |
|
2.3 编写tag标签
编写ActiveXBean,包含成员code,prov,style,classid,codebase及相应的get、set方法。
在系统初始化时,将数据库中配置的ActiveX控件信息缓存到一个Map中,key为$(code)_$(prov),value为编写标签
标签ActiveXTag,接收参数:id(必须)、code(必须)、style(可选),并根据传入的参数,生成代码:
其中,style、classid、codebase是从ActiveX缓存中获得。
2.4 JSP代码中引用
通过<xx:activex id='KeyCard1' style=”…..” code='KeyCard'/>方式进行引用,对于不在页面上显示的控件,style也可以不用,只要在数据库中配置好即可。