AXIS和AXIS2很类似,只是一些文件名和配置不一样,在客户端调用基本一样。
WebService一共有四种,在抉择上:
1、如果应用程序需要多语言的支持,Axis2 应当是首选了;
2、如果应用程序是遵循 Spring 哲学路线的话,Apache CXF 是一种更好的选择,特别对嵌入式的 Web
Services 来说;
3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如 Axis1,XFire,Celtrix或
BEA 等等厂家自己的 Web Services 实现,就别劳民伤财了。
相互之间的对比可参考:http://www.cnblogs.com/growup/archive/2011/03/06/1972464.html。
接下来我们看下AXIS实例。
一:首先创建一个Maven项目,并在pom.xml中引入AXIS依赖的jar包。
二:修改web.xml文件
<!-- 加载Axis --> <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class> org.apache.axis.transport.http.AxisServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
三:创建实体类和实现类:
package com; public class User { private String name; private Integer age; public User(){} //get/set方法... }
package com; public class AxisMethod { public String HelloWorld(String name){ return "Hello World:" + name; } public String getUserInfo(User user){ return "name:" + user.getName() +",age:" + user.getAge(); } }
四:创建配置文件,在WEB-INF中新建文件名为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 标签内容为系统默认 无需更改--> <globalConfiguration> <parameter name="adminPassword" value="admin"/> <parameter name="attachments.Directory" value="./attachments"/> <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/> <parameter name="sendXsiTypes" value="true"/> <parameter name="sendMultiRefs" value="true"/> <parameter name="sendXMLDeclaration" value="true"/> <parameter name="axis.sendMinimizedElements" value="true"/> <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="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <!-- 下面才是重点,是需要自己配置的内容--> <!--name 是url中需要的参数 --> <service name="axisDemo" provider="java:RPC"> <!-- allowedMethods的value值是方法名,可以写成* --> <parameter name="allowedMethods" value="*"/> <!-- className的value值是类路径 --> <parameter name="className" value="com.AxisMethod"/> <!-- wsdlTargetNamespace的wsdl文件中TargetNamespace的值 --> <parameter name="wsdlTargetNamespace" value="http://axistest.com"/> <!-- 这里很重要,如果方法需要传实体类,需要配置此处,其中qname="myNs+类名",
languageSpecificType="java:类名全路径"
--> <beanMapping qname="myNS:User" xmlns:myNS="urn:BeanService" languageSpecificType="java:com.User"/> </service> <!-- 默认配置 --> <transport name="http"> <requestFlow> <handler type="URLMapper"/> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder"/> </responseFlow> </transport> </deployment>
五:部署后访问:http:// localhost:80/AXISDemo/services/axisDemo?wsdl结果报错!
说明还存在某些依赖的jar包为引入,LZ就按照报错的日志,去Maven中央库中找到相应的jar包引入,最后发现少了三个:
<dependency> <groupId>commons-discovery</groupId> <artifactId>commons-discovery</artifactId> <version>0.2</version> </dependency> <dependency> <groupId>org.eclipse.birt.runtime.3_7_1</groupId> <artifactId>javax.wsdl</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>javax.xml.rpc</groupId> <artifactId>javax.xml.rpc-api</artifactId> <version>1.1</version> </dependency>
最后引入完进行测试,出现下面图像说明配置成功。
六:现在来测试下客户端能否获取,为了方便,就在AXISDemo中新建了一个Client类
package com; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; 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; public class Client { public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException { Service service = new Service(); Call call =(Call)service.createCall(); //wsdl的地址 call.setTargetEndpointAddress(new URL("http://127.0.0.1/AXISDemo/services/axisDemo")); //设定调用3分钟不返回则超时 call.setTimeout(new Integer(180000)); //QName和AXIS2一样,第一个参数是wsdl的targetNameSpace名称,第二个参数是方法名称 call.setOperationName(new QName("http://axistest.com","HelloWorld")); //参数类型,第一个参数是参数的名称与HelloWorld类中的参数名称相同。第二个参数是参数的类型
//也必须与HelloWorld类中参数类型相同。第三个参数是参数模式,IN or OUT,多个参数就继续addParameter call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN); //返回值类型 call.setReturnType(XMLType.XSD_STRING); //参数值 String getReturnStr = (String)call.invoke(new Object[]{"JAVA"}); System.out.println(getReturnStr); //测试参数是实体类的方式,其中客户端也需要建立相应的User类,
//这里因为放在了同一个项目中,所以不需要在创建一个User类了。 User user = new User(); user.setName("小明"); user.setAge(21); //要重新建一个call,不容后面addParamter意思就是第二个参数类型了 call =(Call)service.createCall(); call.setTargetEndpointAddress(new URL("http://127.0.0.1/AXISDemo/services/axisDemo")); call.setTimeout(new Integer(180000)); call.setOperationName(new QName("http://axistest.com","getUserInfo")); //注册SimpleObject的序列化类型 QName qName = new QName("urn:BeanService","User"); call.registerTypeMapping(User.class, qName,
new BeanSerializerFactory(User.class, qName),
new BeanDeserializerFactory(User.class, qName)
); //参数类型,可省略 call.addParameter("user", XMLType.XSD_ANYTYPE, ParameterMode.IN); //返回值类型 call.setReturnType(XMLType.XSD_STRING); System.out.println((String)call.invoke(new Object[]{user})); } }
运行结果是: