Q: How does Axis figure out which deployed service to call?
A: Axis has a very flexible dispatch mechanism, with three built-in options, and the ability to customize your own. Dispatch to a service in Axis really means setting the service field in the MessageContext as it flows through the various Handlers in your configuration. Once the service is set, the engine will be able to call it at the appropriate time. So who does the setting? Any Handler who wants to. The default dispatch mechanism for Axis is by URL, so that if you access http://myhost/axis/services/WeatherReport , you will get the "WeatherReport" service. This mechanism works because the HTTP transport in Axis has the URLMapper (org.apache.axis.handlers.http.URLMapper) Handler deployed on the request chain. The URLMapper takes the incoming URL, extracts the last part of it as the service name, and attempts to look up a service by that name in the current EngineConfiguration .
Similarly you could deploy the HTTPActionHandler to dispatch via the SOAPAction HTTP header. You can also feel free to set the service in your own custom way - for instance, if you have a transport which funnels all messages through a single service, you can just set the service in the MessageContext before your transport calls the AxisEngine . Or if you dispatch based on the contents of a SOAP header, or the time of day, you could write a Handler which did that.
If no Handler has set the service by the time someone needs to deserialize the SOAP message, we will attempt to look it up using the namespace of the first body element. So for instance:
<Body> <ns:MyMethod xmlns:ns="http://ws.apache.org/axis/Weather"/> </Body>
This message would look up "http://ws.apache.org/axis/Weather" in the namespace mapping list to see if there was an associated service.