用wsdd来开发web services
用wsdd来开发web services 用wsdd(服务部署描述语言),主要是编写java文件和编写wsdd文件。
1。编写java文件,最好是定义在某一个包下,否则便以后直接放到\WEB-INF\classes下,有时会出错,原因是在用deploy.wsdd部署时映射不对。然后直接包对应的包放到\WEB-INF\classes中。HelloWorldG.java文件:
package test.gaolong;
public class HelloWorldG{
public String sayHelloG(String name){
return 'HelloG '+name;
}
}
2。编写wsdd文件,根据wsdd文件的规范编写相关文档。例如:(deploy.wsdd)
<deployment xmlns='http://xml.apache.org/axis/wsdd/' xmlns:java='http://xml.apache.org/axis/wsdd/providers/java'><--命名空间-->
<service name='HelloWorldG' provider='java:RPC'><-服务名-->
<parameter name='className' value='test.gaolong.HelloWorldG'/><--对应的主类--->
<parameter name='allowedMethods' value='*'/><---注册相应的方法,如果只有一个方法,可以直接注册方法名--->
<parameter name='allowedRoles' value='user'/><--定义用户认证--->
<requestFlow><-用户认证的描述文件-->
<handler type='java:org.apache.axis.handlers.SimpleAuthenticationHandler'/>
<handler type='java:org.apache.axis.handlers.SimpleAuthenticationHandler'/>
</requestFlow>
</service>
</deployment>
3。部署wsdd文件:打开命令口,切换到deploy.wsdd目录下,运行java org.apache.axis.client.AdminClient即可完成部署。
这儿可能出错,正确的显示:
D:\bea\user_projects\domains\mydomain\applications\axis\WEB-INF\classes>java org.apache.axis.client.AdminClient -p 7001 deploy.wsdd
Processing file deploy.wsdd
<Admin>Done processing</Admin>
当在wsdl中使用deploy.wsdd来部署时,对于服务器是要打开的,而且当服务器的端口不是8080时,采用要求java org.apache.axis.client.AdminClient -p <port> deploy.wsdd 来指定并进行服务部署。
4。打开server-config.wsdd会发现增加了语句描述:<service name='HelloWorldG' provider='java:RPC'>
<requestFlow>
<handler type='java:org.apache.axis.handlers.SimpleAuthenticationHandler'/>
<handler type='java:org.apache.axis.handlers.SimpleAuthenticationHandler'/>
</requestFlow>
<parameter name='allowedRoles' value='user'/>
<parameter name='allowedMethods' value='*'/>
<parameter name='className' value='test.gaolong.HelloWorldG'/>
</service>
其实直接到该文件中增加该内容,不必用org.apache.axis.client.AdminClient来部署描述。
打开IE,可以在http://127.0.0.1:7001/axis/servlet/AxisServlet看到该服务部署到服务列表上。
5。编写测试application客户端,其代码如下:
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.namespace.QName;
public class ServiceClient{
public static void main(String[] args) throws Exception{
String endpoint='http://127.0.0.1:7003/axis/services/HelloWorldG';
String name='gaong1';
Service service=new Service();
Call call=(Call) service.createCall();//回调服务
call.setUsername('gaolong1');
call.setPassword('8001');//用户认证
call.setTargetEndpointAddress(new java.net.URL(endpoint));
// call.setOperationName('sayHelloG');
call.setOperationName(new QName('http://gaolong.test', 'sayHelloG'));//设置指定的命名空间,根据wsdl文件来决定
call.addParameter('name',XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);//XMLType.XSD_STRING);
String ret=(String)call.invoke(new Object[] {name});
System.out.println(ret);
}
}
运行之后有关的显示。
6。通过tcpmonitor来监听的soap消息如下:
请求soap:
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<soapenv:Body>
<ns1:sayHelloG soapenv:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:ns1='http://gaolong.test'>
<name xsi:type='xsd:string'>gaolong1</name>
</ns1:sayHelloG>
</soapenv:Body></soapenv:Envelope>
回应soap:
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<soapenv:Body>
<ns1:sayHelloGResponse soapenv:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:ns1='http://gaolong.test'>
<sayHelloGReturn xsi:type='soapenc:string' xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'>HelloG gaolong1</sayHelloGReturn>
</ns1:sayHelloGResponse>
</soapenv:Body>
</soapenv:Envelope>