在大多数WebGIS平台都采用Java Applet和Javascript结合的方式来实现客户端。一般用Applet来发布图形数据,属性数据采用html页面来输出。为了界面美观,一般把Applet和属性页面置于一个框架内,属性查询不再弹出新的页面而是刷新框架中的页面,根据属性记录也可以定位图形,要实现图属之间的这种交互,必须解决Java Applet和Javascript之间的通信问题。 图到属性可以通过打开窗口的时候指定同一个target就行了,也可以通过调用页面中Javascript来刷新属性页面。netscape包的JSObject提供这方面的支持。 属性到图必须通过嵌入的Javascript脚本来调用Applet的方法。默认情况下Javascript是不能调用Applet的方法的,必须通过设置参数MYSCRIPT来激活Applet。 把Applet嵌入页面用两种方式,一种使用applet标签,另一种采用object标签。如下:
<!--
<applet CODEBASE="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>
-->
====================================================================================
<!--
<object CLASSID="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标签是一种比较老的方式,每次都得下载所有的代码。速度比较慢,此外由于大多公司代码签名时用的都是测试用的数字签名,每次都会谈出对话框是否下载等等。另外发布时,有些客户端没有安装JRE,不能自动下载安装。
采用object标签就能克服以上缺点,自动检测客户端是否安装了JRE,没有安装自动从服务器端下载安装。不过如果已经安装有JRE 1.3会不下载,需要手工卸载才能自动下载。实现原理也很简单,IE根据object的CLSID去注册表中CLSID键下找是否已经安装了该组件,版本是否一致,否则下载并安装codebase指向的URL中的包。支持.exe、.cab、.dll和.ocx等等。
applet打包方式遵循Java Extension规范,一个每次都下载的很小的主JAR包,其它是一些扩展JAR包。主JAR包中有一个manifest文件,说明它依赖于哪几个包,如果包不在JRE\lib\ext\目录下,自动到指定的URL去下载。只有当版本更新时才自动下载更新本地JAR包,就是主JAR包中扩展包的版本比ext下扩展JAR包的版本新时会自动更新。
但是在打包时有几个注意事项,否则会碰到找不到类的错误。
1、主JAR包可以引用扩展包,但是反过来不行。当然扩展包之间相互引用没有问题。
2、如果使用Class.forName()来创建对象,被创建的对象类必须在同一个JAR包中。我没有尝试创建一个位于另一个扩展包中的对象,有兴趣的可以试试。
3、循环引用的类最好打在一个JAR包中,比如A引用B,B引用A,那么A和B最好放在一个JAR包中。