在大多數(shù)WebGIS平臺(tái)都采用JavaApplet和Javascript結(jié)合的方式來(lái)實(shí)現(xiàn)客戶端。一般用Applet來(lái)發(fā)布圖形數(shù)據(jù),屬性數(shù)據(jù)采用html頁(yè)面來(lái)輸出。為了界面美觀,一般把Applet和屬性頁(yè)面置于一個(gè)框架內(nèi),屬性查詢不再?gòu)棾鲂碌捻?yè)面而是刷新框架中的頁(yè)面,根據(jù)屬性記錄也可以定位圖形,要實(shí)現(xiàn)圖屬之間的這種交互,必須解決Java Applet和Javascript之間的通信問(wèn)題。圖到屬性可以通過(guò)打開(kāi)窗口的時(shí)候指定同一個(gè)target就行了,也可以通過(guò)調(diào)用頁(yè)面中Javascript來(lái)刷新屬性頁(yè)面。netscape包的JSObject提供這方面的支持。屬性到圖必須通過(guò)嵌入的Javascript腳本來(lái)調(diào)用Applet的方法。默認(rèn)情況下Javascript是不能調(diào)用Applet的方法的,必須通過(guò)設(shè)置參數(shù)MYSCRIPT來(lái)激活A(yù)pplet。 把Applet嵌入頁(yè)面用兩種方式,一種使用applet標(biāo)簽,另一種采用object標(biāo)簽。如下:
<!--
<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標(biāo)簽是一種比較老的方式,每次都得下載所有的代碼。速度比較慢,此外由于大多公司代碼簽名時(shí)用的都是測(cè)試用的數(shù)字簽名,每次都會(huì)談出對(duì)話框是否下載等等。另外發(fā)布時(shí),有些客戶端沒(méi)有安裝JRE,不能自動(dòng)下載安裝。
采用object標(biāo)簽就能克服以上缺點(diǎn),自動(dòng)檢測(cè)客戶端是否安裝了JRE,沒(méi)有安裝自動(dòng)從服務(wù)器端下載安裝。不過(guò)如果已經(jīng)安裝有JRE1.3會(huì)不下載,需要手工卸載才能自動(dòng)下載。實(shí)現(xiàn)原理也很簡(jiǎn)單,IE根據(jù)object的CLSID去注冊(cè)表中CLSID鍵下找是否已經(jīng)安裝了該組件,版本是否一致,否則下載并安裝codebase指向的URL中的包。支持.exe、.cab、.dll和.ocx等等。
applet打包方式遵循JavaExtension規(guī)范,一個(gè)每次都下載的很小的主JAR包,其它是一些擴(kuò)展JAR包。主JAR包中有一個(gè)manifest文件,說(shuō)明它依賴于哪幾個(gè)包,如果包不在JRE\lib\ext\目錄下,自動(dòng)到指定的URL去下載。只有當(dāng)版本更新時(shí)才自動(dòng)下載更新本地JAR包,就是主JAR包中擴(kuò)展包的版本比ext下擴(kuò)展JAR包的版本新時(shí)會(huì)自動(dòng)更新。
但是在打包時(shí)有幾個(gè)注意事項(xiàng),否則會(huì)碰到找不到類的錯(cuò)誤。
1、主JAR包可以引用擴(kuò)展包,但是反過(guò)來(lái)不行。當(dāng)然擴(kuò)展包之間相互引用沒(méi)有問(wèn)題。
2、如果使用Class.forName()來(lái)創(chuàng)建對(duì)象,被創(chuàng)建的對(duì)象類必須在同一個(gè)JAR包中。我沒(méi)有嘗試創(chuàng)建一個(gè)位于另一個(gè)擴(kuò)展包中的對(duì)象,有興趣的可以試試。
3、循環(huán)引用的類最好打在一個(gè)JAR包中,比如A引用B,B引用A,那么A和B最好放在一個(gè)JAR包中。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=235996