一、实验要求
1.编写两个程序,分别实现两个数的加法和减法逻辑,程序的接口定义如下:
interface CalculatorAdd{
public double Add(double x, double y);}
interface CalculatorSub{
public double Add(double x, double y);}
2.将这两个程序发布为Web服务
方法1:发布一个基于pojo的webservice
方法2:利用services.xml来发布webservice
3. 编写调用客户端程序,分别调用加法和减法,并输出预期的计算结果
二、实验设备(环境)及要求
1.Java运行环境 JDK1.6版本
2.Servlet容器运行环境Tomcat 6.0版本
3.Webservice容器运行环境AXIS2 1.5.war
4.Web服务客户端运行环境AXIS2 1.5类库
三、实验前期准备
1.搭建Web服务平台环境
将axis2-1.5.1-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目>/webapps目录中,并启动Tomcat。
2.测试web服务运行环境运行是否正常
在浏览器地址栏中输入如下的URL:http://localhost:8080/axis2/,在浏览器中显示AXIS运行控制台,运行正常。
3.编写服务端逻辑实现类
建立一个java Project工程。编写Java程序分别实现CalculatorAdd和CalculatorSub接口
四、发布一个基于pojo的webservice
// Calculator.java
public class Calculator {
public int CalculatorAdd(int i, int j){
return i+j;
}
public int CalculatorSub(int i, int j){
return i-j;
}
}
步骤:
a. 编写Calculator.java。将Calculator.java编译后的class文件放入<Tomcat安装目>/webapps/axis2/WEB-INF/pojo目录下。如果没有pojo文件夹,则自己创建,注意Calculator.java不要加包。
b. 输入http://localhost:8080/axis2/services/listServices 在页面看到所有已发布的可见的webservice,本实验的webservice名为类名Calculator。
c. 下面我们编写java程序的客户端来调用我们写的webservice。
package client;
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 RPCclient {
public static void main(String[] args) {
// 使用RPC方式调用WebService
RPCServiceClient serviceClient;
try {
serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/axis2/services/Calculator");
options.setTo(targetEPR);
// 指定CalculatorSub方法的参数值
Object[] opAddEntryArgs = new Object[] {3.4,5};
// 指定CalculatorSub方法返回值的数据类型的Class对象
Class[] classes = new Class[] {Double.class};
// 指定要调用的CalculatorSub方法及WSDL文件的命名空间
QName opAddEntry = new QName("http://ws.apache.org/axis2", "CalculatorSub ");
// 调用CalculatorSub方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
d. 运行(注意web服务已经启动)
五、利用services.xml来发布webservice
步骤:
a. 编写带有包名service的Calculator.java。编译生成class文件。
b. 编写AXIS的服务发布描述文件services.xml
c. 将服务实现类和service.xml打包,按照标准格式打包为.aar。 过程举例:在d盘根目录下建立一个MyDemo文件夹,有在MyDemo文件夹下建立一个META-INF文件夹和一个名为包名service的文件夹。将service.xml放在META-INF文件夹下;将Calculator.class放在service文件夹下。进入DOS界面,输入D: / MyDemo >jar cvf MyServic.aar . (注意后面有个点)。
d. 部署服务。拷贝打包好的aar文件到<Tomcat安装目>/webapps/axis2/WEB-INF/services目录下。
e. 输入http://localhost:8080/axis2/services/listServices 在页面看到所有已发布的可见的webservice,本实验的webservice名为类名Calculator。
f. 下面我们编写java程序的客户端来调用我们写的webservice。如基于pojo方法的客户端程序一样。
services.xml内容如下:
<service name="Calculator">
<description>
Calculator Service
</description>
<parameter name="ServiceClass">
service.Calculator
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
</service>
六.改进客户端实现方法
以上这种方法编写客户端程序太麻烦,所有的调用都得我们自己写。现在我们用用axis提供的工具wsdl2java来生成客户端stub,这样我们调用远程webservice就像调用本地一样方便。
利用命令wsdl2java -uri http://localhost:8080/axis2/services/ Calculator?wsdl -p client -o d:/stub 其中-url参数指定了wsdl文件的,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。就可以得到stub。可以在环境变量里加入AXIS2_HOME=D:Program/Filesaxis2(注意这里是你的axsi2的工具解压目录);在path里加入%AXIS2_HOME%/bin。之后利用上述命令。
生成的stub文件下有一个名为src的文件夹和一个build.xml,src的文件夹里面的client文件夹包含CalculatorCallbackHandler.java和CalculatorStub.java。将client文件夹拷入Eclipsesrc的src文件夹下;将build.xml放在工程的根目录下。编写客户端程序。代码如下。
package client;
import org.apache.axis2.AxisFault;
public class CalculatorStubClient {
public static void main(String[] args) {
try {
CalculatorStub stub = new CalculatorStub();
CalculatorStub.CalculatorAdd add = new CalculatorStub.CalculatorAdd();
add.setI(3);
add.setJ(7);
System.out.println(stub.calculatorAdd(add).get_return());
} catch (Exception e) {
e.printStackTrace();
}
}
}