1、目 录一 使用 Axis 和 XFire 发布 Web Service.21.1 准备工作 .21.1.1 新建工程 21.1.2 axis 依赖文件 31.1.3 XFire 依赖文件 31.2 Axis 发布 Web Service41.2.1 传递简单数据类型的 Web Service .41.2.2 带自定义对象传递的 Web Service .81.3 XFire 发布 Web Services.101.3.1 传递简单数据类型的 Web Service .101.3.2 传递复杂数据类型的 Web Service 12附录: 1Server 的结构 .16二 调用 Web Serv
2、ices172.1 准备工作 .172.1.1 新建工程 172.1.2 启动 Tomcat 上发布的 1Server 服务 172.2 Axis 发布的 Web Service 调用方式 .182.2.1 Dynamic Invocation Interface (DII)方式 182.2.2 Dynamic Proxy 方式 192.2.3 Stubs 方式 .202.3 调用 XFire 发布的 Web Service .222.3.1 服务以 jar 包形式发布的时候 直接调用 232.3.2 使用 Axis 的 Client 包 .232.3.3 使用 Xfire 的 Client
3、包 .24附录 2:2Client 目录结构 .31一 使用 Axis 和 XFire 发布 Web Service1.1 准备工作Axis 主页: http:/ws.apache.org/Axis 下载:http:/archive.apache.org/dist/ws/XFire 主页:http:/xfire.codehaus.org/XFire 下载:http:/xfire.codehaus.org/Download去以上站点下载 axis 最新包 和 XFire 最新包,包内有 axis 和 XFire 依赖的其他 jar 包。1.1.1 新建工程1.1.2 axis 依赖文件1.1.3
4、 XFire 依赖文件1.2 Axis 发布 Web Service1.2.1 传递简单数据类型的 Web Service1. 把 Axis 依赖的 jar 包放入 lib 文件夹下.2. 在 web.xml 中加入如下:org.apache.axis.transport.http.AxisHTTPSessionListenerAxisServletorg.apache.axis.transport.http.AxisServletAdminServletorg.apache.axis.transport.http.AdminServlet100SOAPMonitorServiceorg.ap
5、ache.axis.monitor.SOAPMonitorServiceSOAPMonitorPort5001100AxisServlet/servlet/AxisServletAxisServlet*.jwsAxisServlet/services/*SOAPMonitorService/SOAPMonitorAdminServlet/servlet/AdminServlet5wsdltext/xmlxsdtext/xml3. 发布到 Tomcat5.0+ 启动 Tomcat 服务启动的时候若出现下面错误。这个是因为配置文件没有,没有关系。访问 http:/localhost:8080/1S
6、erver/servlet/AxisServlet 查看 Axis 是否配置成功。出现该图表示配置成功。4. 新建 HelloAxis.java 文件package .freshpower.services;public class HelloAxis public String sayHello(String name)System.out.println(“-axis1 被调用-“);return “Hello! “+name;5. 在工程下新建 deploy.wsdd 文件内容如下:在同目录下新建 deploy.bat 批处理文件, 内容如下:echo.echo 生成的 server-c
7、onfig.wsdd 在 Tomcat 发布的应用下 echo.set Axis_Lib=D:projects1ServerwebappWEB-INFlibset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Axis_Servlet=http:/localhost:8080/1Server/servlet/AxisServlet%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% deploy.wsddpause运行 deploy.bat 文件6. 在执行完后去%TOMCAT_H
8、OME%webapps1ServerWEB-INF 文件夹下找到server-config.wsdd 文件,把该文件复制到 1ServerwebappWEB-INF 下。我们打开该文件可以看到下面段落:这就是我们刚才发布的 web service 的描述段落。7. 刷新 http:/localhost:8080/1Server/servlet/AxisServlet 查看 Web Service 列表。点击(wsdl) 可以查看该 Web Service 对应的 wsdl 文件。1.2.2 带自定义对象传递的 Web Service1. 新建 User.java 文件package .fres
9、hpower.bean;public class User public User()public User(String name,String age)this.name = name;this.age = age;public String name;public String age;public String getName() return name;public void setName(String name) this.name = name;public String getAge() return age;public void setAge(String age) th
10、is.age = age;2. 新建 HelloAxisObj.javapackage .freshpower.services;import java.util.ArrayList;import java.util.List;import .freshpower.bean.User;public class HelloAxisObj public User getUser(User user)System.out.println(“-axis2 被调用-“);user.setName(“ujjboy“);user.setAge(“22“);return user;public List ge
11、tList()System.out.println(“-axis2 被调用-“);List list = new ArrayList();list.add(“aaaaaaa“);list.add(“bbbbbbb“);list.add(“ccccccc“);return list;3. 我们可以直接修改 server-config.wsdd 文件来发布 Web Service。直接插入下面段落来发布。4. 重启 Tomcat 服务器。5. 刷新 http:/localhost:8080/1Server/servlet/AxisServlet 查看 Web Service 列表。点击(wsdl)
12、 可以查看该 Web Service 对应的 wsdl 文件。1.3 XFire 发布 Web Services1.3.1 传递简单数据类型的 Web Service1. 把 XFire 依赖的 jar 包放入 lib 文件夹下。2. 在 web.xml 中加入如下代码:XFireServletorg.codehaus.xfire.transport.http.XFireConfigurableServlet0XFireServlet/servlet/XFireServlet/*XFireServlet/service/*3. 编写程序代码首先编写一个功能的接口类。package .fresh
13、power.services;public interface HelloXfire public String sayHello(String name);再编写一个功能的接口实现类。package .freshpower.services;public class HelloXfireImpl implements HelloXfirepublic String sayHello(String name) System.out.println(“-xfire1 被调用-“);return “Hello! “+name;4. 在 src 下或者直接在 webappWEB-INF 下创建一个文
14、件夹 META-INF,在META-INF 下边在创建一个目录 xfire,在 xfire 目录里边创建一个services.xml 文件,内容如下:HelloXfirehttp:/.freshpower.services.HelloX.freshpower.services.HelloXfireImpl5. 重启 Tomcat 服务 出现如下图加载信息代表发布正确完成。6. 访问 http:/localhost:8080/1Server/service/ 查看 Web Service 列表和 wsdl 文件。点击wsdl就可以查看它的 wsdl 描述文件。1.3.2 传递复杂数据类型的 We
15、b Service1. 了解 XFire 的绑定机制 Aegis首先说明,Aegis 为 XFire 默认的绑定方式,那么何时需要绑定?Aegis 支持的类型1).基本类型:int,double,float,long,byte,short,String,decimal2).数组(Array)3).集合类型(Collection)4).日期类型:java.util.Date, java.util.Calendar, java.sql.Timestamp, java.sql.Date, java.sql.Time5).XML:org.w3c.dom.Docmument, org.jdom.Elem
16、ent, XMLStreamReader, XML 文本6).包含以上类型的自定义类型Aegis 需要绑定的类型1).集合类型(Collection)2).包含集合类型的自定义类型当使用 JDK1.4 时,或者是使用了 JDK1.5 及以上版本但是没有使用泛型的时候、当遇到需要映射 POJO 或配置 WebService 接口方法返回类型(如集合类型)时,需要进行绑定,此时 aegis 的绑定为建立.aegis.xml 的文件。2. 编写接口类 HelloXfireObj.javapackage .freshpower.services;import java.util.List;import
17、 .freshpower.bean.User;public interface HelloXfireObj public User getUser(User user);public List getList();编写接口实现类package .freshpower.services;import java.util.ArrayList;import java.util.List;import .freshpower.bean.User;public class HelloXfireObjImpl implements HelloXfireObjpublic User getUser(User
18、 user)System.out.println(“-Xfire2 被调用-“);user.setName(“ujjboy“);user.setAge(“22“);return user;public List getList()System.out.println(“-Xfire2 被调用-“);List list = new ArrayList();list.add(“aaaaaaa“);list.add(“bbbbbbb“);list.add(“ccccccc“);return list;3. 绑定数据类型。新建与接口类同名的.aegis.xml 文件 如下图:文件内容如下:注意 Lis
19、t 里面带的是简单数据类型就不用绑定,带的是复杂类型就用绑定类型。而且 List 一定要声明所包含的对象。例如 List,List等。4. 修改 webappWEB-INFservices.xml 发布 Web Service。和上例没什么区别,在文件中增加节点:HelloXfireObjhttp:/.freshpower.services.HelloXfireO.freshpower.services.HelloXfireObjImpl5. 重启 Tomcat 6. 访问 http:/localhost:8080/1Server/service/ 查看 Web Service 列表和wsdl
20、 文件。附录 1: 1Server 工程的结构二 调用 Web Services2.1 准备工作2.1.1 新建工程新建一个 2Client 的 Web Project 把刚才 1Server 的 lib 下的 jar 包复制过来.2.1.2 启动 Tomcat 上发布的 1Server 服务 1Server 服务上应该有 axis 和 XFire 发布的 4 个 Web Service 等待调用。http:/localhost:8080/1Server/services/HelloAxis?wsdl http:/localhost:8080/1Server/services/HelloAxi
21、sObj?wsdl http:/localhost:8080/1Server/service/HelloXfire?wsdl http:/localhost:8080/1Server/service/HelloXfireObj?wsdl 2.2 Axis 发布的 Web Service 调用方式Axis 支持三种方法: Dynamic Invocation Interface (DII )方式 Dynamic Proxy 方式 Stubs 方式 2.2.1 Dynamic Invocation Interface (DII)方式该方式可以不用生成本地客户端,直接从 wsdl 文件中得到操作方法
22、,传递的参数等。然后按照下面的 1 到 6 步写代码就可以。step1: 创建一个 Service 实例,注意是必须的!step2: 创建 Call 实例,也是必须的!step3: 为 Call 设置服务的位置 操作的方法名step4: 映射要传递自定义类型 设置返回类型等( 可选)step5: 为方法增加参数, 传几个参数写几个(可选)step6: 用参数数组调用 Web Servicepackage .freshpower.client;import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import or
23、g.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.XMLType;public class TestAxis1 public static void main(String args) throws Exception /* step1: 创建一个Service实例,注意是必须的!*/Service service = new Service(); /*step2:创建Call实例,也是必须的!*/Call call = (Call) service.c
24、reateCall();/*step3: 为Call 设置服务的位置 操作方法名 */call.setTargetEndpointAddress(new .URL(“http:/localhost:8080/1Server/services/HelloAxis“);call.setOperationName(“sayHello“);/操作的方法 注意 方法名与HelloAxis.java中一样/*step4映射要传递自定义类型 设置返回类型等( 可选) 如果返回的是自定义类型也要映射*/call.setReturnType(XMLType.XSD_STRING);/*step5: 为方法增加参
25、数,传几个参数写几个*/call.addParameter( new QName(“http:/www.openuri.org/“,“name“),XMLType.XSD_STRING,ParameterMode.IN );/*step6: 用参数数组调用Web Service*/String name = “freshpower“;String result = (String) call.invoke(new Objectname);System.out.println(result);执行的结果是:2.2.2 Dynamic Proxy 方式 该方法首先是在本地虚拟一个服务端 Web S
26、ervice 的接口。该接口继承java.rmi.Remote 类。package .freshpower.client;import java.rmi.Remote;import java.rmi.RemoteException;public interface TestAxis2Iface extends Remote public String sayHello(String name) throws RemoteException;然后我们再写一个代理服务在本地调用这个接口类。package .freshpower.client;import .MalformedURLExceptio
27、n;import .URL;import java.rmi.RemoteException;import javax.xml.namespace.QName;import javax.xml.rpc.Service;import javax.xml.rpc.ServiceException;import javax.xml.rpc.ServiceFactory;public class TestAxis2Proxy public static void main(String args) throws ServiceException, MalformedURLException, Remot
28、eException String wsdlUrl = “http:/localhost:8080/1Server/services/HelloAxis?wsdl“;String nameSpaceUri = “http:/localhost:8080/1Server/services/HelloAxis“;String serviceName = “HelloAxisService“;/从wsdl文件中得到String portName = “HelloAxis“; /从wsdl文件中得到ServiceFactory serviceFactory = (ServiceFactory) Ser
29、viceFactory.newInstance();Service service = serviceFactory.createService(new URL(wsdlUrl), new QName(nameSpaceUri, serviceName);TestAxis2Iface proxyClient = (TestAxis2Iface) service.getPort(new QName(nameSpaceUri, portName), TestAxis2Iface.class);System.out.println(proxyClient.sayHello(“freshpower“)
30、;运行结果是:2.2.3 Stubs 方式 Stubs 方式是使用 axis 自带的 WSDL2JAVA 根据发布的 WSDL 文件生成本地客户端,然后直接在本地调用。首先学习下 WSDL2JAVA 工具。我们新建一个 wsdl2java.bat 内容如下:echo -echo 设置Output_Path设置为你要生成的路径echo Package设置为生成文件的包路径echo 最后是wsdl可以是文件路径 可以是URLecho -pauseset Axis_Lib=D:projects2ClientwebappWEB-INFlibset Java_Cmd=java -Djava.ext.di
31、rs=%Axis_Lib%set Output_Path=D:projects2Clientsrcset Package=.freshpower.autoClient.HelloAxisObj%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http:/localhost:8080/1Server/services/HelloAxisObj?wsdl我们以第二个传递对象的 WebService 为例。执行批处理生成客户端后,我们来看下目录结构。生成客户端后,我们就有了用户自定义的 User 对象类,和一些
32、 web service的相关类(注意:List 我们还是用 java.util.List,不用自动生成的) 。有了本地客户端,调用就十分简单。我们可以利用客户端使用前面介绍 DII 方式进行调用,也可以使用 stubs 方式调用。Stubs 的调用方式十分简单:服务名 Service service = new 服务名 ServiceLocator();服务名 Stub client = (服务名 Stub) service.get 服务名();System.out.println(client.方法(参数.);程序代码如下:package .freshpower.client;import
33、 .freshpower.autoClient.HelloAxisObj.*;public class TestAxisObj2 public static void main(String args) throws Exception HelloAxisObjService service = new HelloAxisObjServiceLocator();HelloAxisObjSoapBindingStub client = (HelloAxisObjSoapBindingStub) service.getHelloAxisObj();/测试结果User a = new User(“1
34、1“, “AAAA“);System.out.println(client.getUser(a).getName();List list = client.getList();System.out.println(list.toString();执行后 我们发现 getUser 方法是正确的,而 getList 方法是错误的呢?看了错误原来自动生成的客户端里面所有的getList相关方法都是使用的是.freshpower.autoClient.HelloAxisObj.List类,而我们需要的是java.util.List类。所以需要调整下自动生成的代码和客户端代码。首先客户端HelloAxi
35、sObj2.java 需要调整。其次要把HelloAxisObj_PortType.java和HelloAxisObjSoapBindingStub.java中的“.freshpower.autoClient.HelloAxisObj.List”全部换成“java.util.List” ,保存。重新执行 TestAxisObj2.java 后没提示错误。成功。2.3 调用 XFire 发布的 Web ServiceXfire 的调用也有很多,但是都大同小异:主要有:1. 服务以 jar 包形式发布的时候 直接调用 2. 使用 AXIS 的 Client 包 Dynamic Invocation
36、 Interface (DII ) Stubs 方式 (wsdl2java 生成客户端)3. 使用 Xfire 的 Client 包 通过 WSDL 文件直接调用程序 WsGen(Ant)生成客户端调用程序 MyEclipse 插件生成客户端调用程序 2.3.1 服务以 jar 包形式发布的时候 直接调用 当服务端以 jar 包形式发布,我们就相当于有了客户端的接口类和其自定义对象类。(无接口实现类) 。为了节省时间,我们就直接在 1Server 下新建一个 Client,相当于拥有服务端的客户端。代码如下:package .freshpower.client;import .Malforme
37、dURLException;import java.rmi.RemoteException;import org.codehaus.xfire.XFireFactory;import org.codehaus.xfire.client.XFireProxyFactory;import org.codehaus.xfire.service.Service;import org.codehaus.xfire.service.binding.ObjectServiceFactory;import .freshpower.services.HelloXfire;public class TestXfi
38、re4jar public static void main(String args) throws RemoteException,MalformedURLException Service srvcModel = new ObjectServiceFactory().create(HelloXfire.class,null,“http:/“,null);XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire();String wsURL = “http:/localhost:
39、8080/1Server/service/HelloXfire“;HelloXfire client = (HelloXfire) factory.create(srvcModel, wsURL);System.out.print(client.sayHello(“freshpower“);运行后得到结果:2.3.2 使用 Axis 的 Client 包只需要修改下 wsdl2java.bat 中的生成包地址和 wsdl 文件地址。(参见 wsdl2java.bat 生成客户端文件)刷新下工程目录,我们就能发现刚生成的客户端文件。有了客户端文件,我们就可以使用 DII 或者 Stubs 方式就
40、行调用。(参见 2.2.1 Dynamic Invocation Interface (DII)方式和 2.2.3 Stubs 方式)2.3.3 使用 Xfire 的 Client 包 2.3.3.1 通过 WSDL 文件直接调用程序该方式类似于 axis 的 DII 调用方式。只需要得到 wsdl 文件后放在 src 或者 WEB-INFclasses下即可。也可以通过 wsdl 的 URL 地址调用。package .freshpower.client;import java.io.IOException;import .URL;import org.codehaus.xfire.clie
41、nt.Client;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;public class TestXfire1 public static void main(String args) throws IOException, Exception /本地的写法/ String wsdl = “HelloXfire.wsdl“; / 对应的WSDL文件/ Resource resource = new ClassPathResource(wsdl);
42、/ Client client = new Client(resource.getInputStream(), null); /根据WSDL创建客户实例/URL的写法Client client = new Client(new URL(“http:/localhost:8080/1Server/service/HelloXfire?wsdl“);/ 调用特定的Web Service方法Object results = client.invoke(“sayHello“, new Object“freshpower“);System.out.println(results0);调用结果为2.3.2
43、.2 WsGen(Ant)生成客户端调用程序WsGen 是 Xfire 提供的一个 Ant Task。我们可以使用 Ant 轻松实现生成 Xfire 自己的客户端。在程序下新建 Ant 文件夹,内有 bulid.bat 和 bulid.xml 两个文件,如图:build.xml 内容如下:其中我们要设置 classpath,设置生成文件的路径,包路径,wsdl 文件地址。下面的binding 是设置绑定方式,该属性可以不写。echo *echo Xfrie wsdl2javaWSGENecho *echo.echo offif “%JAVA_HOME%“ = “ goto errorecho
44、on:execute“%JAVA_HOME%/bin/java“ -cp /webapp/WEB-INF/lib/ant.jar;/webapp/WEB-INF/lib/ant-nodeps.jar;“%JAVA_HOME%/lib/tools.jar“ org.apache.tools.ant.Main -f ./build.xml %1goto end:errorecho 请设置 JAVA_HONE 为 jdk1.5 后再试!:endpausebuild.bat 内容为:运行 build.bat提示成功后 我们刷新下工程目录结构:有了客户端,下面开始调用。代码还是一如既往的简单啊!pack
45、age .freshpower.client;import .freshpower.autoClient.HelloXfireAnt.*;public class TestXfire34Ant public static void main(String args) HelloXfireClient client = new HelloXfireClient();HelloXfirePortType clientPt = client.getHelloXfireHttpPort();System.out.println(clientPt.sayHello(“FreshPower“);看下运行结果:2.3.3.3 MyEclipse 插件生成客户端调用程序Xfire 这么流行的东西, MyEclipse 当然不会放过,一定会集成进去。所以装了MyEclipse 的人我们可以很方便的使用它来调用。我们在程序中新建一个 Web Services client一路 next 直到 finish 后查看工程目录结构。