二 两种方式自定义Web Service
在IDE里创建一个Web Service工程是很容易的,只要找到【File】-【New】-【Web Service】菜单就可以了,点击这个菜单将会弹出下面的对话框:
这里的Web service type有两种选择:一种是Bottom up、另外一种是Top down。这两种方式分别对应了自下而上和自上而下两种新建Web Service的模式。如果你已经有了实现的功能类,现在想要把它封装成Web Service,那么你应当选择Bottom up模式;如果你首先定义了Web Service的描述文件(wsdl),现在想要实现这个wsdl的功能,那么你应当选择Top down模式。
三 实现Web Service的功能
不管通过Bottom up还是Top down方式,当你把Web Service的框架搭起来以后,剩下的工作就是如何去实现Web Service的功能了。下面让我们通过讲解一个网络分析Web Service的实现,来了解自定义Web Service的运作。
这个网络分析的Web Service需要的功能是预先定义好的,其中有比如上下游追溯、连通性分析等等,这里只挑连通性分析这个小功能进行说明。
首先,我们通过给定的wsdl新建了一个Web Service工程,然后找到实现类,在这个类中已经根据wsdl自动生成了对应各个功能的方法,这里就连通性分析功能进行讲解,对应的方法是connectivity,下面是这个方法的实现:
public class TestGISAnalysisSoapBindingImpl implements TestGISAnalysisPortType
{
private GeoNetworkAnalysis geoNetAnalysis;
public TestGISAnalysisSoapBindingImpl()
{
geoNetAnalysis = new GeoNetworkAnalysis();
}
public java.lang.String connectivity(String sourceDeviceType
, String sourceDeviceID
, String targetDeviceType
, String targetDeviceID,
String type) throws java.rmi.RemoteException
{
String result = "";
try
{
result = geoNetAnalysis.findPath(Integer.parseInt (sourceDeviceType)
, Integer.parseInt (sourceDeviceID)
, Integer.parseInt (targetDeviceType)
, Integer.parseInt (targetDeviceID)
, type);
}
catch (Exception ex)
{
ex.printStackTrace();
}
return result;
}
}
怎么这么简单?当然,因为这里对功能做了封装,真正的分析功能在geoNetAnalysis这个对象中,在这个对象中进行的都是直接对AO的操作,我们通过一些代码片段来看一下这个功能的实现:
public class GeoNetworkAnalysis
{
public GeoNetworkAnalysis()
{
try {
EngineInitializer.initializeEngine();
new AoInitialize().initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo);
ResourceBundle bundle = ResourceBundle.getBundle("geometrynetwork");
traceFlowSolver = new TraceFlowSolver();
INetSolver netSolver = (INetSolver) traceFlowSolver;
geometricNetwork = openNetwork(bundle.getString("workspacePath"),
bundle.getString("datasetName"),bundle.getString("networkName"));
pNetElements = new INetElementsProxy(geometricNetwork.getNetwork());
netSolver.setSourceNetworkByRef(geometricNetwork.getNetwork());
...
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 连通性分析
*
* @param sourceLyrID
* 起点的图层ID
* @param sourceFeatID
* 起点的要素ID
* @param targetLyrID
* 终点的图层ID
* @param targetFeatID
* 终点的要素ID
* @param type
* @return
*/
public String findPath(int sourceLyrID
, int sourceFeatID
, int targetLyrID
, int targetFeatID
, String type) throws Exception
{
this .putTraceOrigins(getOriginPoints(sourceLyrID
,sourceFeatID
,targetLyrID
,targetFeatID));
IEnumNetEID[] junctionEIDS = new IEnumNetEID[1];
IEnumNetEID[] edgeEIDs = new IEnumNetEID[1];
Object[][] costArray = new Object[1][1];
traceFlowSolver.findPath(esriFlowMethod.esriFMConnected,
esriShortestPathObjFn.esriSPObjFnMinSum
, junctionEIDS
, edgeEIDs
, 1
, costArray);
...
Set junctions = this .getSolverResultFeature(junctionEIDS[0]);
Set edges = this .getSolverResultFeature(edgeEIDs[0]);
return FeatureUtil.networkResultToJSON(junctions, edges);
}
}
注意,上面只是代码片段,整个功能的实现代码太长了,和我们要了解的Web Service其实又没有什么关系,所以,就看个大概吧。
做完这些,在很多场合都可以调用这个自定义的Web Service了,比如上面这个功能我们是在Flex中调用的:
showBusyCursor="true"
concurrency="last"
result="onWsAnalysisResult(event)"
fault="onWsAnalysisFault(event)"/>
试想一下,是不是不同的业务系统之间交互也可以做了呢?