axis2之前只用过jws方式的即时部 署,最近一个项目要搞web service,一搜搜出一堆,发现自己已经太落后了,axis2怎么怎么好,XFire怎么性能高,绑定的方式有adb,xmlbeans,jibx等 等好几种,简直眼花缭乱,废话少说了,折腾了一个星期,总结了一点小经验,给大家少走弯路。一般网上的教程都是下载axis2的war包放到 webapps下,很少有说把axis2集成到自己的web项目中的。经过测试,按以下几步即可:
第一步:下载axis2的war, 放到tomcat下的webapps目录下,启动tomcat,自动解包出 axis2目录。
第 二步:将axis2目录下的关键文件和目录拷贝到自己的项目中。拷贝axis2/web-inf下的所有目录到你自己的web目录的web-inf下面, 除了modules目录(这个没用)。lib下的jar包还是单独拷吧,别覆盖了你的jar包。另外关键的是要修改conf目录下的axis2.xml, 注释掉关于module方面的代码就是addressing的那一行一定要注释掉。
第三步:修改你的web.xml,增加axis2的servelet
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/ *</url-pattern>
</servlet-mapping>
第四步:写服务端代码并编译:
package axis2test;
public class AddService {
public int add(int a,int b)
{
return a+b;
}
}
第 五步:进入web-inf/services目录下,可以看见原来axis2自带的一个version.*.aar, aar其实就是一个jar,改名了而已,用winrar打开他,清空里面的东西,然后把你的class带着目录拷贝进来,再建立一个META-INF目 录,里面放一个services.xml, 这样tomcat启动时候就可以自动部署它了。下面看看services.xml怎么写:
<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
<service name="NBIService">
<description>This is the service for revoking certificate.</description>
<parameter name="ServiceClass" locked="false">oma.nbi.NBIServer</parameter>
<operation name="sayHello">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
<actionMapping>urn:sayHelloRequest</actionMapping>
</operation>
</service>
</serviceGroup>
这是一种RawXMLINOutMessageReceiver模式的,适用于axiom绑定的架构,我们不用它,用RPC方式:
<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
<service name="AddService">
<description>This is the service for revoking certificate.</description>
<parameter name="ServiceClass" locked="false">axis2test.AddService</parameter>
<operation name="add">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
</service>
</serviceGroup>
好了,server端就部署好了,现在启动tomcat,用ie查看wsdl,顺利的话,应该可以看到
http://localhost:8080/你web项目的名字/services/AddService?wsdl 来查看
第六步:
下面写客户端代码:
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class TestClient {
public static void main(String[] args) throws AxisFault {
EndpointReference targetEPR = new EndpointReference(
"http://localhost/ext2/services/AddService.AddServiceHttpSoap11Endpoint/ ");
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
options.setTo(targetEPR);
String ns = "http://axis2test";// 这里axis2test应该是你的package路径,否则会报错找不到
QName opAdd = new QName(ns, "add");
Class[] returnTypes = new Class[]{Integer.class};
Object[] opAddArgs = new Object[]{"199", "6"};
Object[] response = serviceClient.invokeBlocking(opAdd,opAddArgs, returnTypes);
Integer result = (Integer) response[0];
if (result == null) {
System.out.println("hello didn't initialize!");
return;
}
System.out.println(result);
}
}
http://localhost:8080/你web项目名字/services/AddService/add?a=5&b=17
,结果得到 :<ns:return>22</ns:return>