本章主要通过实例阐述整个webservice项目的开发过程。
登录网站:
http://www.apache.org/dyn/closer.cgi/axis/axis/java/1.4/,下载axis1.4版,目录结构如下图所示。
docs是框架说明文档(包括API)、lib是框架所依赖的jar包、sample是示例、xmls是当前工程所需的xml、webapps是当前工程的webroot目录。
1.1.2服务器
本小节说明如何在eclipse或者myeclipse中,创建第一个webservice工程。所有示例始于helloworld。下面将详细说明服务器端发布webservice项目、客户端调用的过程。
1) 打开myeclipse,创建web工程,名称为“axiswebservice”,并将2.1.1小节下载的lib文件夹下的jar包添加至工程中。最终效果如下图所示。
2) 创建服务器代码HelloWorld.java,具体内容和普通的java类编写无任何差别。具体代码如下。
package com.ll.server;
public class HelloWorld {
public String sayHello(Stringusername)
return "hello, " + username;
}
}
3) 在WEB-INF目录下创建一个名为“deploy.wsdd”,这是一个webservice部署描述文件(web service deploymentdescriptor),后续将使用此文件来发布webservice。具体内容如下。
<?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">
<!-- service标签代表一个WebService服务 -->
<service name="HelloWorld"provider="java:RPC">
<!-- 命名空间,使用wsdl2java生成客户端代码时,包路径为:com.ll.server -->
<!-- 假如发布服务地址为:http://localhost:8887/axiswebservice/services/HelloWorld-->
<!-- 如果属性wsdlTargetNamespace不设置的话,生成客户端代码的默认包路径为:localhost.axiswebservice.services -->
<parameter name="wsdlTargetNamespace" value="http://server.ll.com"/>
<parameter name="wsdlServicePort" value="HelloWorld"/>
<!-- 服务类路径 -->
<parameter name="className"value="com.ll.server.HelloWorld" />
<!-- * 代表所有的方法都暴露 -->
<parameter name="allowedMethods"value="*" />
<!-- 当前WebService的作用域,它有3个值,分别是:request每个请求、session每个用户、application所有请求 -->
<parameter name="scope"value="request" />
</service>
</deployment>
4) 修改web.xml,加入axisServlet的支持,具体代码如下。
<!-- 加入AxisServlet的支持 -->
<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>
5) 将此web工程部署至tomcat(本文使用tomcat5.5)中,如下图所示。
6) 配置tomcat端口,启动tomcat服务器;利用AdminClient客户端管理工具发布webservice项目。具体命令如下。执行以下命令之后,WEB-INF下会生成一个server-config.wsdd文件,此文件为webservice服务生成wsdl文件的依据,工程启动即加载此文件,记录了axis已发布的Web服务的描述信息。
D:\apache-tomcat-5.5.25\webapps\axiswebservice\WEB-INF>
java -Djava.ext.dirs=liborg.apache.axis.client.AdminClient-lhttp://localhost:8887/axiswebservice/services/AdminService deploy.wsdd
命令说明:
Ø D:\apache-tomcat-5.5.25\webapps\axiswebservice\WEB-INF表示webservice工程部署目录
Ø -Djava.ext.dirs=lib表示使用工程lib下的jar包
Ø org.apache.axis.client.AdminClient表示axis工具类,用来发布webservice服务
Ø -lhttp://localhost:8887/axiswebservice/services/AdminService,“-l”表示参数,后跟具体的tomcat部署的工程访问路径;“axiswebservice”表示工程名;“services/AdminService”为固定写法。
Ø deploy.wsdd表示第3)步创建的发布描述文件
7) 打开浏览器,输入:http://localhost:8887/axiswebservice/services,红色区域是我们刚才发布的webservice方法,点击“wsdl”超链接,生成服务对应的wsdl(WSDL是WebService的描述语言,是一种接口定义语言,用于描述Web Service的接口信息等)描述文件。此文件详细描述了服务器端的方法、参数、返回值等。后续将使用此文件通过axis提供的WSDL2JAVA工具自动生成客户端调用代码。这里只关注一个属性
<wsdlsoap:address location="http://localhost:8887/axiswebservice/services/HelloWorld" />
此属性表示客户端访问服务器的具体地址,即客户端通过此地址来访问服务体提供的服务方法sayHello。
本小节说明如何调用已发布的webservice服务,这里调用方式有两种,一种是直接手写整个调用服务器端方法;第二种是使用服务器端生成的wsdl文件,通过axis提供的WSDL2JAVA工具自动生成客户端调用代码,从而较少手工代码的编写。一般情况下建议使用第二种方法,因为第二种方法其实是第一种方法的一个封装,可大大减少代码出错率。下面就这两种方法做一简单介绍。
1) 打开myeclipse,创建web工程,名称为“axisclient”。
Ø 并将2.1.1小节下载的lib文件夹下的jar包添加至工程中。
Ø 访问服务器发布地址:
http://localhost:8887/axiswebservice/services/HelloWorld,将网页文件保存为HelloWorld.wsdl,并将此文件拷贝至axisclient工程下的WEB-INF目录下。
Ø 创建客户端测试类:com.ll.client.HelloWorldClient.java
最终效果如下图所示。
2) 编写客户端测试代码类:com.ll.client.HelloWorldClient.java,实现手工调用服务器,运行即可。具体代码如下。
下面介绍第二种方法,即通过WSDL2JAVA工具自动生成客户端调用代码。
1) 进入客户端工程所在WEB-INF目录,此目录下应该包括lib文件夹,axis所需jar包;HelloWorld.wsdl文件,生成客户端代码的描述。Dos命令窗口输入:
java-Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -o clientsrc Session -S trueHelloWorld.wsdl。命令输入完毕时候,无任何错误提示,表示生成成功,如下图所示。
2) 将上一步生成的clientsrc目录的代码拷贝至客户端工程中,如下图所示。
3) 编写客户端测试代码类:com.ll.client.HelloWorldClient.java,使用自动生成的客户端代码调用服务器方法。具体代码如下。
/**
* 使用通过wsdl文件生成的客户端代码,调用服务器方法
* 此方法是将直接通过服务器发布地址调用的相关方法,通过wsdl2java工具进行了封装,使得每次调用步骤精简
* */
public static void useClinetCode() {
try {
//获取服务
HelloWorldService client =new HelloWorldServiceLocator();
//获取服务类
HelloWorld hello =client.getHelloWorld();
//调用服务方法,输出返回结果
String result =hello.sayHello("beyond");
System.out.println("clientCall,result = " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
.2 使用eclipse插件开发
使用eclipse webservice插件自动生成webservice服务器和客户端代码简单方便。下面介绍具体操作步骤。
1.2.1服务器
1) 创建web工程,名称为axiswebservice。
Ø 新建一个com.ll.server.HelloWorld.java,具体代码见2.1.2部分。
Ø 点击HelloWorld.java文件,然后右键,选择“newàotheràwebservice”,如下图所示。
Ø 点击“next”,如下图选择“publish the web service”选项。
Ø 点击“next”,选择要发布的方法,点击“finish”完毕或者点击“next”启动服务器。如下图所示。
2) 生成完毕之后,具体工程目录结构如下图所示。至此,服务器代码发布结束。
1.2.2客户端
使用服务器生成的HelloWorld.wsdl文件,生成客户端代码。具体操作如下。
1) 首选新建一个web工程,名为axisclient。
Ø 创建包com.ll.client
Ø 将服务器生成的HelloWorld.wsdl文件,拷贝至WEB-INF目录下
Ø 选择“HelloWorld.wsdl”,点击右键,选择“newàotheràweb service client”。如下图所示。
2) 点击“next”,如下图所示。
3) 点击“next”,选择生成客户端代码的位置,点击“finish”完成。最终的目录结构如下图所示。
4) 下面编写测试类,com.ll.client.HelloWorldClient.java。具体代码如下。
package com.ll.client;
import java.rmi.RemoteException;
import com.ll.server.HelloWorld;
public class HelloWorldClient {
public static void main(String[] args) {
HelloWorld hello = newcom.ll.server.HelloWorldProxy();
try {
String res =hello.sayHello("beyond");
System.out.println("res = " + res);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}