如何将基于Axis2的Web Service集成到自己的webapp
本文主要描述如何使用Apache开源项目Axis提供的API来实现Web Services并集成到我们的应用程序当中。
本文的读者应有JAVA web 应用开发基础。应该具有看过WSDL,SOAP,XML等的基本规范。熟悉Eclipse+MyEclipse开发环境。
一、环境准备
使用Axis来开发Web services 需要准备 web 服务器,Axis API。本文使用的Web container 是Tomcat5.5, Axis API 采用版本2。
1.1软件下载准备
Tomcat下载地址:http://tomcat.apache.org/download-55.cgi#5.5.20
Axis标准包:
http://apache.etoak.com/ws/axis2/1_5_1/axis2-1.5.1-bin.zip
Axis War包:
http://apache.etoak.com/ws/axis2/1_5_1/axis2-1.5.1-war.zip
Eclipse+MyEclipse:可以到官方网站下载(本文为3.3+6.5GA)
1.2安装
A.首先搭建开发环境,需要将下载到的Eclipse解压缩到一个目录。
B. 安装MyEclipse6.5GA。然后启动MyEclipse。
C.下面开始搭建Web Services的部署环境。将下载的tomcat包解压缩到一个目录。完成web container的安装。
E.将axis2.war包拷贝到tomcat安装目录下的webapps目录中。
F.启动Tomcat(windows 下为TOMCA_HOME/bin中的startup.bat;Linux,unix环境为startup.sh文件),打开浏览器输入并访问:http://ip:port/axis2来查看。(如果没有进行配置文件的修改此地址应该为http://localhost:8080/axis2),如果能看到下面的页面则说明已经安装完成。
二、Quick Start
环境准备好后,先从一个简单的例子开始。以便对使用Axis来开发Web services的大致流程有个了解。
2.1编写自己的应用服务端。
A.启动MyEclipse,新建立一个WebApps(File->New->Project->Web Project),给Project Name 为SayHello,其他保持不改变。目录结构如下图所示:
B.我们需要一个简单的web service,建包com.dm.service , 包下新建类MyService。代码如下:
package com.dm.service;
publicclass MyService {
public String sayHello(String name) {
return"Hello, " + name + ".";
}
}
C.将Axis2集成到我们自己的webapp中。首先我们需要将Axis2 Servlet写到我们的web.xml中。代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="wmf" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<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>
</web-app>
D.把tomcat安装目录下的webapps/axis2/WEB-INF下的service和conf文件件拷至SayHello下的WEB-INF目录下,并修改conf目录下的axis2.xml,找到<module ref="addressing"/>并将其注释掉。把lib下的jar包也拷过去。以下jar包是必须的。
activation-1.1.jar
axiom-api-1.2.8.jar
axiom-impl-1.2.8.jar
axis2-adb-1.5.1.jar
axis2-kernel-1.5.1.jar
axis2-transport-http-1.5.1.jar
axis2-transport-local-1.5.1.jar
commons-fileupload-1.2.jar
commons-httpclient-3.1.jar
geronimo-javamail_1.4_spec-1.6.jar
geronimo-stax-api_1.0_spec-1.0.1.jar
geronimo-ws-metadata_2.0_spec-1.1.2.jar
httpcore-4.0.jar
neethi-2.0.4.jar
woden-api-1.0M8.jar
wsdl4j-1.6.2.jar
wstx-asl-3.2.4.jar
XmlSchema-1.4.3.jar
E.接下来,我们需要为MyService写一个部署描述。在services下新建SayHello/META-INF路径,META-INF下新建services.xml,内容如下:
<service name="SayHello">
<description>
HelloWorld Service Example
</description>
<parameter name="ServiceClass">
com.dm.service.MyService
</parameter>
<operation name="sayHello">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
</service>
F.启动tomcat后访问http://localhost:8080/SayHello/services/SayHello?wsdl能看到服务信息了。
2.2 编写客户端。
A.新建立一个java工程(File->New->Project->java Project),给Project Name 为SayHelloClient。
B.导入SayHello项目中相同的jar包。
C.编写客户端调用程序。在src下建包client,在包中写一个Client.java类。内容如下:
package client;
import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Client {
public static void main(String[] args) {
try{
RPCServiceClient secl = new RPCServiceClient();// 使用RPC方式调用WebService
Options op = secl.getOptions();
EndpointReference targetEPR = new EndpointReference("http://localhost:8080/SayHello/services/SayHello");
op.setTo(targetEPR);// 指定调用WebService的URL
Object[]opAddEntryArgs=new Object[]{"香帅"}; // 指定sayHello方法的参数值
Class[] classes= new Class[]{String.class}; // 指定sayHello方法返回值的数据类型的Class对象
QName opAddEntry=new QName("http://service.dm.com","sayHello"); // 指定要调用的sayHello方法及WSDL文件的命名空间
System.out.println(secl.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0]); //调用sayHello方法并输出该方法的返回值
}catch(Exception e){
e.printStackTrace();
}
}
}
D.运行,结果为
Hello, 香帅.
至此,实现了在我们的应用中集成Axis2开发WebService的一个简单demo。