项目源码下载地址:http://download.csdn.net/detail/xiangxingrui1024/9720951
一、特别注意事项
1、webservice axis1.4在请求与响应参数方面,不支持List类型,但可以支持数组;如List<Student> 可以修改成Student[]写法;否则虽然服务可以提供,但具体使用调用时会报参数类型方面异常。
2、在提供的服务接口中,如有自定义实体bean、数组等复杂类型时,需要对其实体对象进行序列化和反序列化,虽然axis1.4支持绝大多数常用类型;如果未对自定义的实体Bean进行序列和反序列,在调用服务时,会报参数实体类型不匹配等异常错误。
二、实例项目结构图
1、目录说明:
entity:接口涉及到的实体Bean对象
service:服务接口
test:服务接口测试
2、文件说明:
deploy.bat:执行生成服务端配置的命令文件
deploy.wsdd:描述生成服务端配置文件
server-config.wsdd:服务端接口描述文件
3、操作步骤:
1)、创建project并导入axis1.4所需jar包;
2)、在web.xml配置axis;
3)、编程接口;
4)、配置deploy.wsdd文件;
5)、配置deploy.bat文件;
6)、启动项目,再执行deploy.bat文件,生成server-config.wsdd文件;
三、贴代码文件
1、IClaimsService.java代码
2、IClaimsServiceImpl.java代码
3、Teacher.java代码
4、Student.java代码
5、deploy.bat文件
6、deploy.wsdd文件
7、web.xml
8、server-config.wsdd文件(由于代码多,就不截图了,直接上代码)
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="sendMultiRefs" value="true"/>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="adminPassword" value="admin"/>
<parameter name="attachments.Directory" value="E:\workspace\myeclipse\axisTest\WebRoot\WEB-INF\attachments"/>(自定生成时,会有该东东,实际使用中必须删除该元素!!!)
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="sendXsiTypes" value="true"/>
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
</requestFlow>
</globalConfiguration>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
(通过deploy.wsdd文件自动生成的server-config.wsdd文件,下列红色元素为接口服务方法描述)
<service name="myTestAxisWService" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="com.axis.service.impl.IClaimsServiceImpl"/>
<beanMapping languageSpecificType="java:com.axis.entity.Student" qname="ns1:Student" xmlns:ns1="http://entity.axis.com"/>
<beanMapping languageSpecificType="java:com.axis.entity.Teacher" qname="ns2:Teacher" xmlns:ns2="http://entity.axis.com"/>
</service>
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion"/>
<parameter name="className" value="org.apache.axis.Version"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
<parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
<parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
四、最终获得的wsdl文件内容
五、依赖的jar包
六、客户端测试
1、Client.java代码文件
package com.axis.test;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import com.axis.entity.Student;
import com.axis.entity.Teacher;
public class Client {
public static void main(String[] args) throws Exception{
// test1();
// test2();
// test3();
// test4();
// test5();
test6();
}
/**
* 测试doTestD服务接口
* @param 传递实体Bean(单个)
* @return 返回集合实体Bean(多个)
* @throws Exception
*/
public static void test1()throws Exception{
String wsdlAddress = "http://localhost:8082/axisTest/axisTest/myTestAxisWService?wsdl";//wsdl地址
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(wsdlAddress);
QName inType = new QName("http://entity.axis.com", "Teacher");//第一个参数为空间名地址,第二个为实体序列/反序列名
call.registerTypeMapping(Teacher.class, inType, BeanSerializerFactory.class, BeanDeserializerFactory.class);
QName outType = new QName("http://entity.axis.com", "Student");
call.registerTypeMapping(Student.class, outType, BeanSerializerFactory.class, BeanDeserializerFactory.class);
call.setOperationName("doTestD");//调用的服务接口方法名
call.addParameter("teacher", XMLType.XSD_ANYTYPE, ParameterMode.IN);//传递的参数名(可随便取)
call.setReturnClass(Student[].class);//返回的是集合Bean时,必须定义javaBean为数组,如javaBean[]
Teacher teacher = new Teacher();
teacher.setAge(1);
teacher.setBirthday(new Date());
Student[] info = (Student[]) call.invoke(new Object[]{teacher});
System.out.println("--bean[]-"+info);
}
/**
* 测试doTestA服务接口
* @param 传递实体Bean(单个)
* @return 返回实体Bean(单个 )
* @throws Exception
*/
public static void test2()throws Exception{
String wsdlAddress = "http://localhost:8082/axisTest/axisTest/myTestAxisWService?wsdl";//wsdl地址
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(wsdlAddress);
QName outType = new QName("http://entity.axis.com", "Student");
call.registerTypeMapping(Student.class, outType, BeanSerializerFactory.class, BeanDeserializerFactory.class);
call.setOperationName("doTestA");//调用的服务接口方法名
call.addParameter("name", XMLType.XSD_ANYTYPE, ParameterMode.IN);//传递的参数名(可随便取)
call.setReturnClass(Student.class);//服务方法返回类型
Student info = (Student) call.invoke(new Object[]{"参数为单个字符串"});
System.out.println("--bean-"+info);
}
/**
* 测试doTestF服务接口
* @param 传递对象Map
* @return 返回字符串
* @throws Exception
*/
public static void test3()throws Exception{
String wsdlAddress = "http://localhost:8082/axisTest/axisTest/myTestAxisWService?wsdl";//wsdl地址
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(wsdlAddress);
QName outType = new QName("http://entity.axis.com", "Student");
call.registerTypeMapping(Student.class, outType, BeanSerializerFactory.class, BeanDeserializerFactory.class);
call.setOperationName("doTestF");//调用的服务接口方法名
call.addParameter("paramMap", XMLType.XSD_ANYTYPE, ParameterMode.IN);//传递的参数名(可随便取)
call.setReturnClass(String.class);//服务方法返回类型
Map<String, Student> paramMap = new HashMap<String, Student>();
Student sd = new Student();
sd.setAge(0);
paramMap.put("student1", sd);
String str = (String) call.invoke(new Object[]{paramMap});
System.out.println("--str-"+str);
}
/**
* 测试doTestC服务接口
* @param 传递对象Map
* @return 返回Map
* @throws Exception
*/
public static void test4()throws Exception{
String wsdlAddress = "http://localhost:8082/axisTest/axisTest/myTestAxisWService?wsdl";//wsdl地址
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(wsdlAddress);
QName outType = new QName("http://entity.axis.com", "Student");
call.registerTypeMapping(Student.class, outType, BeanSerializerFactory.class, BeanDeserializerFactory.class);
call.setOperationName("doTestC");//调用的服务接口方法名
call.addParameter("paramMap", XMLType.XSD_ANYTYPE, ParameterMode.IN);//传递的参数名(可随便取)
call.setReturnClass(Map.class);//服务方法返回类型
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("str", "随便值");
Map<String, Student> str = (Map<String, Student>) call.invoke(new Object[]{paramMap});
System.out.println("--map-"+str);
}
/**
* 测试doTestE服务接口
* @param 传递对象List<Teacher>
* @throws Exception
*/
public static void test5()throws Exception{
String wsdlAddress = "http://localhost:8082/axisTest/axisTest/myTestAxisWService?wsdl";//wsdl地址
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(wsdlAddress);
QName outType = new QName("http://entity.axis.com", "Teacher");
call.registerTypeMapping(Teacher.class, outType, BeanSerializerFactory.class, BeanDeserializerFactory.class);
call.setOperationName("doTestE");//调用的服务接口方法名
List<Teacher> infoList = new ArrayList<Teacher>();
Teacher info = new Teacher();
info.setAge(12);
infoList.add(info);
call.invoke(new Object[]{infoList});
System.out.println("-----无返回类型-----");
}
/**
* 测试doTestB服务接口
* @param 传递int and String
* @return 返回int
* @throws Exception
*/
public static void test6()throws Exception{
String wsdlAddress = "http://localhost:8082/axisTest/axisTest/myTestAxisWService?wsdl";//wsdl地址
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(wsdlAddress);
call.setOperationName("doTestB");//调用的服务接口方法名
call.addParameter("a", XMLType.XSD_ANYTYPE, ParameterMode.IN);//传递的参数名(可随便取)
call.addParameter("b", XMLType.XSD_ANYTYPE, ParameterMode.IN);//传递的参数名(可随便取)
call.setReturnClass(int.class);//服务方法返回类型
int number = (Integer) call.invoke(new Object[]{111,"字符串"});
System.out.println("--int-"+number);
}
}