<b>关于JSP发布地图服务</b>
首先介绍下用于发布地图服务的ArsIMS
ArsIMS是一个由Presentation层,Business Logic层,data层组成的多层架构,另外,它还有一个用于管理地图网页发布的应用程序集.
(1)presentation 层是ArcIMS的客户端,可以获得,浏览和分析地理数据(geographic data)
(2)business logic 层的组件用于请求处理和ArcIMS的网页管理
(3)data 层包含了所有ArcIMS可用的数据源
(4)应用程序集 为business logic层Authoring, Designing,Adminisering ArcIMS Service 提供入口
business logic 层是整个ArcIMS的核心,是负责客户端和数据源交互的中间过程,包括服务启动和处理请求(request)和反应(response).
一个请求处理的过程是:
当一个包含地理数据分析的请求从客户端到达WebServer(Tomcat,IIS等)时,WebServer需要将请求传送给ArcIMS Application Server,它是一个后台执行的程序,传递请求到ArcIMS Spatial Server,并列出ArcIMS Spatial Server正在运行的服务.后者处理请求,返回一个Response,这个Response逆序传到客户端,由客户端解析
(parse)并呈现.
这个过程中由于WebServer从客户端获得的请求可能是多种语言形式的,而ArcIMS Application Server和ArcIMS Spatial Server之间的交互是通过ArcXML(an implementation of XML used with ArcIMS)来进行的.所以在WebServer和ArcIMS Application Server之间需要有一个connector作为ArcXML的翻译器,ArcIMS自带了四种可选的connector:
ArcIMS Servlet Connector ArcIMS默认的connector,HTML, Java Custom, and Java Standard 视图均可.ArcIMS自带的ArcExplorer, ArcMap, 和ArcPad也用这个connector.
ArcIMS ColdFusion Connector 不懂
ArcIMS ActiveX Connector 支持ASP
ArcIMS Java Connector 支持JSP
采用什么connector这里面除了有个选择的开发语言外,还有性能的问题(即Client Side versus Server Side Processing).
选用ArcIMS Servlet Connector,是Client Side Processing,应该就是所谓的"胖客户"吧,客户端产生直接ArcXML形式的请求,connector没有任何解析作用,只是传递ArcXML请求和回应,客户端需要解析ArcXML回应以呈现地图.
选用Java Connector,是所谓的"瘦客户",ArcXML的所有处理,包括请求和回应,都是在服务器端完成的.Jsp传递一个请求,WebServer先接受这个请求,Java Connector将这个请求翻译为ArcXML,然后传交给Application Server和ArcIMS Spatial Server.当ArcIMS Spatial Server产生回应,原路返回到 Java Connector时,Java Connector又将这个ArcXML形式的回应翻译为JSP的回应,再通过WebServer传给客户端,并动态更新JSP.
很明显使用Java Conector客户端的速度会快很多,因为地图的矢量数据比较大,所有的请求和回应都在客户端进行将影响性能.
下文讨论用JSP发布地图网页的两种形式.
使用Java框架来发布ArcIMS,需要有JavaVM,WebServer和Servlet引擎.在我的电脑上,使用的是java1.4sdk,Tomcat,Java Connector.
由于我自己对Servlet了解不深,说一点自己的见解,以期抛砖引玉.
<b>Servlet是嵌入在WebServer中的,通过一组servlet API使JavaVM和WebServer连接起来,以完成对JSP等包含JAVA语言的请求的处理.</b>所以这里的JavaVM不能使用JRE(Java Runtime Enviroment),因为它只运行java的class文件,不进行编译,而需要JDK(Java Developing Kit).
ArcIMS中自带了Java Connector,它是以.jar形式存在的,使用时应将它放在WEB-INF下的lib文件下.
Java Connector自带了一组JavaBean和一个JSP Tag 库.两者总的功能都是将JSP的请求转化成ArcXML.
这些Javabean是编写独立和可重用的组件成为可能.它们都有一系列良好封装的Set, Get方法,我们可以利用这些JavaBean和它们的方法来实现地图的各种显示功能,描画地图符号(点,线等),增加动态图层,查询相关数据,管理和鉴别服务等,我的理解是ArcGIS等地理绘图软件可以做到的功能,在这些JavaBean中均可找到相应的方法.这些JavaBean构成了ArcIMS Java Connector Object Model.
JSP Tag 库是建立在ArcIMS Java Connector Object Model上的JSP 标记的集合.这些标记提供了Object Model的接口.我们可以认为这个标记是JavaConnector中的Connector.因为它连接了JSP和JavaBean.用这种标记语言 Tag的写的JSP请求由JSP Tag 库转化成JavaBean能够识别的对象,这些JavaBean再将请求转化成ArcXML.
JSP Tag 库包含标记(Tag)的名称,属性,以及嵌套的标记(Tag).
下面给出一个使用JSP Tag 库的JSP例子,能够用JSP发布一幅地图有放大功能.
example.jsp
<%@page contentType="text/html"%>
<%@taglib uri="arcims_taglib.tld" prefix="aims" %>
<%
String theMapAction = request.getParameter("mapaction");
String x = request.getParameter("map.x");
String y = request.getParameter("map.y");
String mapMaxX =null;
String mapMaxY =null;
String mapMinX =null;
String mapMinY =null;
if (request.getParameter("maxx") != null) {
if (!request.getParameter("maxx").equalsIgnoreCase("")) {
mapMaxX = request.getParameter("maxx");
mapMaxY = request.getParameter("maxy");
mapMinX = request.getParameter("minx");
mapMinY = request.getParameter("miny");
}
}
%>
<aims:tcpConnection id="myConnection" host="localhost" port="5300" debug="true"/>
<aims:mapService id="myMapService" connectionId="<%=myConnection%>" name="NetUniversity" loadEnvelope="false" loadExtensions="false" loadRecordset="false" loadRenderer="false"/>
<aims:map id="myMap" serviceId="<%=myMapService%>" width="500" height="350" envelope="myEnvelope" >
<%
if (request.getParameter("maxx") != null) {
if (!request.getParameter("maxx").equalsIgnoreCase("")) { %>
<aims:envelope minx="<%=mapMinX%>" miny="<%=mapMinY%>" maxx=">%=mapMaxX%<" maxy="<%=mapMaxY%>" />
<%
}
}
if(theMapAction != null){
if(theMapAction.equals("zoomin")){
%>
<aims:zoom factor="2" x="<%=x%>" y="<%=y%>" />
<%
}
}
%>
</aims:map>
<html><head><title>Simple Zoom In</title></head><body>
<p align="center">
<form action="example.jsp" method="post">
<table border="1" cellpadding="5" width="500" align="center">
<tr><td align="center">
<input type="image" name="map" src="<%=myMap%>">
</td></tr>
</table>
<input type="hidden" name="mapaction" value="zoomin" >
<input type="hidden" name="maxx" value="<%=myEnvelope.getMaxX()%>">
<input type="hidden" name="maxy" value="<%=myEnvelope.getMaxY()%>">
<input type="hidden" name="minx" value="<%=myEnvelope.getMinX()%>">
<input type="hidden" name="miny" value="<%=myEnvelope.getMinY()%>">
</form>
</p>
</body>
</html>
用JSP发布地图优势是明显的,连接Oacle数据库只需写一个数据库连接的JavaBean就可以实现,也可以读取地图上Symbol的信息作为查询条件,想象的前景是美好的.
暂时先写到这里,由于库中JavaBean较多,相关方法也不清楚,也许是清楚方法不能写程序,现在非常郁闷.还请大家特别是师兄们给我指点迷津.