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也可以不用,只要在數據庫中配置好即可。