在大多數WebGIS平臺都采用JavaApplet和Javascript結合的方式來(lái)實(shí)現客戶(hù)端。一般用Applet來(lái)發(fā)布圖形數據,屬性數據采用html頁(yè)面來(lái)輸出。為了界面美觀(guān),一般把Applet和屬性頁(yè)面置于一個(gè)框架內,屬性查詢(xún)不再彈出新的頁(yè)面而是刷新框架中的頁(yè)面,根據屬性記錄也可以定位圖形,要實(shí)現圖屬之間的這種交互,必須解決Java Applet和Javascript之間的通信問(wèn)題。圖到屬性可以通過(guò)打開(kāi)窗口的時(shí)候指定同一個(gè)target就行了,也可以通過(guò)調用頁(yè)面中Javascript來(lái)刷新屬性頁(yè)面。netscape包的JSObject提供這方面的支持。屬性到圖必須通過(guò)嵌入的Javascript腳本來(lái)調用Applet的方法。默認情況下Javascript是不能調用Applet的方法的,必須通過(guò)設置參數MYSCRIPT來(lái)激活Applet。 把Applet嵌入頁(yè)面用兩種方式,一種使用applet標簽,另一種采用object標簽。如下:
<!--
<appletCODEBASE="classes/" CODE="sam.class" NAME="sam" WIDTH="800"HEIGHT="600" HSPACE="0" VSPACE="0" ALIGN="middle"archive="shspsims.jar" MAYSCRIPT>
<param name="cabbase" value="shspsims.cab">
<param name="DebugOutput" value="TRUE">
jad -s java -f -t -8 -r -o *.class
<param name="Language" value="zh_CN">
<param name="datasource" value="SHSPS">
<param name="IniFile" value="sam_ini.asp">
<param name="ScaleDisplay" value="0.000331">
<param name="DecimalDigits" value="3">
</applet>
-->
====================================================================================
<!--
<objectCLASSID="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" ID="sam"WIDTH="100%" HEIGHT="100%"codebase="<%=sBaseURL%>/isclient/components/download/j2re-1_4_2_06-windows-i586-p.exe#Version=1,4,2,mn">
<param name="code" value="inta.sam">
<param name="archive" value="classes/sam.jar">
<param name="DebugOutput" value="TRUE">
<param name="IniFile" value="sam_ini.asp">
<param name="Language" value="zh_CN">
<param name="datasource" value="SHSPS">
<PARAM NAME="MAYSCRIPT" VALUE="true">
<param name="ScaleDisplay" value="0.000331">
<param name="DecimalDigits" value="3">
</object>
-->
采用applet標簽是一種比較老的方式,每次都得下載所有的代碼。速度比較慢,此外由于大多公司代碼簽名時(shí)用的都是測試用的數字簽名,每次都會(huì )談出對話(huà)框是否下載等等。另外發(fā)布時(shí),有些客戶(hù)端沒(méi)有安裝JRE,不能自動(dòng)下載安裝。
采用object標簽就能克服以上缺點(diǎn),自動(dòng)檢測客戶(hù)端是否安裝了JRE,沒(méi)有安裝自動(dòng)從服務(wù)器端下載安裝。不過(guò)如果已經(jīng)安裝有JRE1.3會(huì )不下載,需要手工卸載才能自動(dòng)下載。實(shí)現原理也很簡(jiǎn)單,IE根據object的CLSID去注冊表中CLSID鍵下找是否已經(jīng)安裝了該組件,版本是否一致,否則下載并安裝codebase指向的URL中的包。支持.exe、.cab、.dll和.ocx等等。
applet打包方式遵循JavaExtension規范,一個(gè)每次都下載的很小的主JAR包,其它是一些擴展JAR包。主JAR包中有一個(gè)manifest文件,說(shuō)明它依賴(lài)于哪幾個(gè)包,如果包不在JRE\lib\ext\目錄下,自動(dòng)到指定的URL去下載。只有當版本更新時(shí)才自動(dòng)下載更新本地JAR包,就是主JAR包中擴展包的版本比ext下擴展JAR包的版本新時(shí)會(huì )自動(dòng)更新。
但是在打包時(shí)有幾個(gè)注意事項,否則會(huì )碰到找不到類(lèi)的錯誤。
1、主JAR包可以引用擴展包,但是反過(guò)來(lái)不行。當然擴展包之間相互引用沒(méi)有問(wèn)題。
2、如果使用Class.forName()來(lái)創(chuàng )建對象,被創(chuàng )建的對象類(lèi)必須在同一個(gè)JAR包中。我沒(méi)有嘗試創(chuàng )建一個(gè)位于另一個(gè)擴展包中的對象,有興趣的可以試試。
3、循環(huán)引用的類(lèi)最好打在一個(gè)JAR包中,比如A引用B,B引用A,那么A和B最好放在一個(gè)JAR包中。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=235996