发表用户:Marsblade
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=11&ID=7475
信息原始来源:原创

文章标题:项目结束,与大家分享一些MapXtreme for Java开发经验和教训!(原创)


开发环境:Window2000 Professional ,WebLogic 8.1.2 ,Oracle 9.0.1
开发工具:JBuilderX,MapXtreme For Java 4.7.1
数据方式:地图数据采用Mapinfo文件形式,属性及动态生产数据存放于Oracle

以下为开发此项目过程中所记下的一些经验和教训,希望能对大家有所帮助。

1.  当用Applet调用Servlet进行地图刷新时,例如:http://202.194.146.199:7001/scsd/MapServer?toolnum=120
第一次能够成功调用Servlet进行处理,但第二次如果仍然使用此工具,则Servlet不会对此进行反应。
可在Servet中给Session添加一个判断数字,例如refreshNum,当每次调用Servlet时,在程序中增加该值,在调用Servlet时使用如下方式调用:
http://202.194.146.199:7001/scsd/MapServer?toolnum=120&refreshnum=refreshNum
因为每次调用Servlet都会对refreshnum的值进行改变,所以Servlet认为每一次的调用都是不同的,故能对提交的请求进行处理。


 2. 在jsp中利用Js调用Applet时,如果出现莫名其妙的错误,应该首先考虑到jre的问题。
    最好用最新版本的jre,最少要用1.4.1以上的版本.
     经目前测试,在1.4.1以下版本中(例1.4.0中),会出现在JSP页面中直接用JS调用Applet
 中的方法时报“没有发现此对象或方法”错误。


3.当混用Mapxtreme47和4.7.1的lib中的jar时,会出现SaxBuilder类中的setXmlFilter()调用的错误。(未经测试)
  解决方法:解包,反编译,加入缺少的方法,重新打包。(jdom.jar)

4.自带的mapXtreme47(471).war与weblogic有冲突。删掉web。xml中配置的manager Servlet可以解决。

5.如果自己的应用也带有mapxtreme servlet的配置。最好将mapXtremeServlet配置至另一应用中,从自己的应用配置调用mapXtremeServelt的自己的Servlet(MapServer),

6.当用中客户端进行开发时,一定要加人miappletsup.jar.共需jar31个

7.当进行数据库绑定时,如果地图图层tab文件是用中文建立的(例油井层.tab)。在程序中进行绑定时,会出现汉字乱码错误。可将文件名改为E文(例:oillayer.tab),然后将定义文件MDF中的该图层定义路径直接改为:oillayer.tab,不必修改层名的定义。这样在程序中进行图层控制所看到的图层名就会是中文,不必在页面中再进行转换.
  但在程序中进行图层搜索时,在程序中所搜索的图层名称应该都是中文名称(例:油井层)

8.页面的错误也有可能与IE的版本有关。

9.绑定以后search feature的数据项。
 例:绑定的Sql:select id,name,data1,data2,data3,data4 from table,地图文件中tab中的id和数据库中的id为绑定列
0:绑定列字段的值 
1:MI_PRINX(mapinfo默认的字段,从1递增的整数)
2:name     3:data1      4:data2      5:data3      6:data4

10.Oracle中的中文显示乱码,调整注册表中的machine/oracle/home0/nls_lang
  为AMERICAN_AMERICA.US7ASCII

11.做动态数据的专题图时,要注意生成的专题图的图例信息要与所查询的动态数据的字段一一对应。不可多,但可以少。

12.因为所有的专题图层都是用的同一个名字,所以当产生新的专题图之前要删掉原有的专题图

13.当在页面中通过JS将从session或request中的参数传递给Applet时,要注意参数的写法
   例: String strScript = "<script language=\"javascript\">";
    strScript += "window.top.frames[\"mainFrame\"].MapApplet.doTheme(" + Const.TOOL_THEME + "," + "\"" + paramStr + "\");";
    strScript += "</script>";
    尤其当传递的字符串参数不是数字时,当为数字时,
 String strScript = "<script language=\"javascript\">";
        strScript += "top.window.frames[\"mainFrame\"].MapApplet.doDirect(" + MapProcesser.TOOL_LAYER_CONTROL + "," +  refreshNum + ");";
        strScript += "</script>";
    不带前后"\""也可以,因为解析时Js当它直接为数字传递入Applet。
    而当上例中的refreshNum="abd";字母时,就会报错:abd未定义,因为此时Js当abd为一变量。故需在前后加上"\""引号。

14.当用request传递特殊符号(#,+)时,会出现符号丢失情况。

15.当用String的ReplaceAll方法时,例:name.replaceAll("&","^"),name本身所指向的字符串不会改变,所以应该用另外一个字符串来指向replace后的字符串。
    例:newName = name.replaceAll("&","^");

16.用浏览器访问页面时,必须指定绝对路径。 
其实你既然已经知道又CodeBase的说法应该自己构建一个完整的URI,然后用这个URI构造File。 
String filename = getCodeBase().toString() + getParameter("dat"); 
File f = new File(new URI(filename));

17.paint()方法是Applet的灵魂,因为Applet本身是一个容器,任何的输出都必须用图形方法paint();
当小应用首次被装载,以及每次窗口放大、缩小、刷新时都要调用paint方法
paint()是由浏览器调用的, 而不是由程序调用,当程序希望调用paint方法时,用repaint()命令
paint方法的参数是Graphics类的对象 g,它在java.awt.Graphics内


18.采用双缓冲技术来解决画面的闪烁问题。
   即,在后台另生成一个Image对象,取其Graphics,每次生成地图,现在后台此Image的Graphics对象中生成地图。然后一次行绘出地图,重而比免了画面的闪烁问题。

19.当在Applet里面加入一个组件(Component)时,默认加入的时候要调用该Component的Paint()方法.


20。需用过渡画面的功能:图层控制页面设置的时候,专题图的创建,临时图层清除

    清除临时图层功能不彻底,没有清除掉绑定图层的生成的Theme图层

21.当在页面中利用JS调用Applet中的方法时.注意不要使用类似于window.frames["XXXX"].location="???.jsp?pra=xx"
   这种方式,因为这种方式每次都要重新生成Applet.应该直接利用以下方法
   window.frames["xxx"].AppletName.DoXXX(para);调用


22.在URL中传递字符串参数最大长度不能超过约1024个字符,否则链接失效

补:去除Weblogic控制台地图渲染信息的方法。在Classes目录下的log4j.properties中将log级别设置为OFF即可。