1 需求背景
我們?cè)谄髽I(yè)應(yīng)用開(kāi)發(fā)中經(jīng)常會(huì)用到ActiveX控件,如:華表打印控件、密碼小鍵盤(pán)控件、寫(xiě)卡器控件、讀取客戶(hù)端IP、MAC信息的控件、二代身份證讀取控件。
1.1 問(wèn)題現(xiàn)象
這些控件在代碼中的調(diào)用方式不夠標(biāo)準(zhǔn),五花八門(mén),千差萬(wàn)別,如:
// 沒(méi)有版本號(hào),和本地安裝版本比對(duì)發(fā)現(xiàn)有新版本時(shí)不會(huì)提示用戶(hù)進(jìn)行升級(jí)
<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>
// 如果不寫(xiě),操作員沒(méi)有安裝,會(huì)直接報(bào)錯(cuò),不會(huì)提示安裝
<object classid="CLSID:636BCD61-4473-4FF5-A4C6-6E030C31EBD4" id="BossICCardOCX"></object>
// 沒(méi)有版本號(hào)
<object classid="clsid:3FA32835-2A6A-45E9-B6E9-B00A779A60F3" id="MINIPRINT" name="miniCell"
width="0" height="0" codebase="<%=miniPath%>"></object> |
1.2 問(wèn)題總結(jié)
由上面代碼可以看出,上面的代碼有的指定了codebase,有的沒(méi)有指定codebase,對(duì)于沒(méi)有指定codebase的情況,控件無(wú)法自動(dòng)下載安裝,用戶(hù)安裝該控件只有一種方式,那就是主動(dòng)下載控件安裝包進(jìn)行手工安裝。當(dāng)前所有的控件使用方式,都無(wú)法實(shí)現(xiàn)控件版本升級(jí)后自動(dòng)更新,只能靠通知用戶(hù)手工下載安裝包重新安裝來(lái)實(shí)現(xiàn)升級(jí)。因此,有必要對(duì)當(dāng)前系統(tǒng)中控件使用方法進(jìn)行規(guī)范,簡(jiǎn)化調(diào)用方式,減少代碼量,同時(shí)實(shí)現(xiàn)自動(dòng)升級(jí)。
2 解決方案(tag)
2.1 使用tag引用ActiveX控件
<xx:activex id='KeyCard1' code='KeyCard' style=”…..” /> // keyCard唯一標(biāo)記數(shù)據(jù)庫(kù)中一個(gè)控件
tag從數(shù)據(jù)庫(kù)中取出該控件的相關(guān)屬性(是否顯示、classid、codebase、版本號(hào)等),然后組裝成以下格式的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文件的版本號(hào)。IE會(huì)比較HTML中的版本號(hào)和已經(jīng)安裝的控件的版本號(hào),如果瀏覽器發(fā)現(xiàn)控件的版本升級(jí)了,就會(huì)自動(dòng)去更新控件。
后續(xù)需要發(fā)布新版本的ActiveX控件時(shí),只需要更新對(duì)應(yīng)的cab文件,并在數(shù)據(jù)庫(kù)中修改對(duì)應(yīng)的版本信息,用戶(hù)在用到該控件時(shí)瀏覽器會(huì)自動(dòng)提示下載更新。
2.2 數(shù)據(jù)庫(kù)
在數(shù)據(jù)庫(kù)中增加一個(gè)存放ActiveX信息的字典表SA_DB_ACTIVEX,格式如下:
字段名稱(chēng) |
字段說(shuō)明 |
字段類(lèi)型 |
備注 |
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 編寫(xiě)tag標(biāo)簽
編寫(xiě)ActiveXBean,包含成員code,prov,style,classid,codebase及相應(yīng)的get、set方法。
在系統(tǒng)初始化時(shí),將數(shù)據(jù)庫(kù)中配置的ActiveX控件信息緩存到一個(gè)Map中,key為$(code)_$(prov),value為編寫(xiě)標(biāo)簽
標(biāo)簽ActiveXTag,接收參數(shù):id(必須)、code(必須)、style(可選),并根據(jù)傳入的參數(shù),生成代碼:
其中,style、classid、codebase是從ActiveX緩存中獲得。
2.4 JSP代碼中引用
通過(guò)<xx:activex id='KeyCard1' style=”…..” code='KeyCard'/>方式進(jìn)行引用,對(duì)于不在頁(yè)面上顯示的控件,style也可以不用,只要在數(shù)據(jù)庫(kù)中配置好即可。