webservice xfire框架实例笔记

来源:互联网 发布:sql外键 编辑:程序博客网 时间:2024/05/02 01:51

Myeclipse部署webservice文档—xfire

1        环境

Jdk1.5

Tamcat5.5

Myeclipse

以上工具的配置文档省略。

2        Tamcat部署方式

建议使用tamcatmyeclipse不做集成。

2.1     创建工程

myeclipse中创建webservice工程,file->new->other->web service project

 

 

为我们的第一个web service projuect起个名字webservicetest

 

其实所谓的webservice也不可能单独通讯,soap协议是一个更上层的通讯协议,他是凌驾在http协议上的,所以我们web开发熟悉的servlet必不可少,默认就可以啦。

 

选择以下工具jar包,

 

呵呵,工程创建完毕,看看效果。包结构基本上遵守web的工程模式,仔细看多了一个目录WebServices,下边的services.xml作用就是我们的应用下提供了几个webservices服务,另外就是web.xml会发生变化,自己看看吧。

 

下一步工作我们分三种情况举例,分别是通讯传输基本数据类型,xml数据类型,对象类型。这三种情况应该可以涵盖了平时所有的应用。

 

2.2     基本数据类型通讯

创建一个service服务程序。File->new->other->myeclipse->web service

 

 

 

仍然需要起一个服务类的名字,FirstServicemyeclipse会为我们生成两个类服务接口类(IFirstService)和服务实现类(FirstServiceImpl)

看看你的service.xml发生了什么变化。

 

 

看一下我们的实现类,很简单,就是返回一个基本数据类型字符串

 

任务完成一半了,我们先部署一下,看看效果。

部署完成后我们生成wsdl,如下

 

 

Myeclipse有个访问wsdl的工具,如下:

 

点击到wsdl方式,并录入wsdlurl路径。

 

测试一下功能,结果如下

 

相当于客户端发一个字符串给服务端,服务端处理后返回一个字符串响应,功能叙述完毕

下来我们开发一个正式的客户端。

File->new->other->web service client填写wsdl访问路径。生成的类以及关键测试代码如下:

 

 

 

2.3     对象类型通讯

简单基础类型通讯不能满足我们日常的系统开发工作,我们还需要支持远程对象传输,保证大数据量的传输,不过这就需要考虑效率问题。压力测试时要注意webservice的效率测试

在生成service端和client端时最好使用两个工程,把service部署后建立另外一个xfire工程,并生成client,在传输对象的过程中client端也需要一个User对象,这个对象的作用就是映射服务器端的自定义对象。

 

首先我们需要创建服务类,返回参数是自定义对象User

 

 

创建User对象,注意这个是服务器端的。

 

为了在WSDL中映射参数的类型,我们需要创建一个配置文件,并和服务类放在一个包下。IFirstService.aegis.xml

 

服务器端都准备好了,部署!看看我们wsdl

 

注意其中对参数的定义。

下来就是client端的开发了,顺便介绍一下xfire客户端的三种模式:

1.     Client开发者拥有Web服务端的class

即:能拿到服务端的接口ClassEntity类及aegis配置文件

//传统POJO模式

Service srvcModel = new ObjectServiceFactory().create(Hello.class);

               

XFireProxyFactory factory = new XFireProxyFactory(

 XFireFactory.newInstance().getXFire());

String helloWorldURL = "http://localhost:8080/webservice/services/Hello";

  

Hello srvc = ( Hello) factory.create(srvcModel,

                                  helloWorldURL);

   System.out.println(srvc.sayHello("Robin"));

// JSR181模式,注意这里Server端开发组需要向Client提供实现类,而不止于//接口,有点危险

Service  srvcModel = new AnnotationServiceFactory()

.create(HelloImpl.class);

XFireProxyFactory factory = new XFireProxyFactory(XFireFactory

                       .newInstance().getXFire());

      

String helloWorldURL = "http://localhost:8080/webservice/services/Hello";

          

 Hello hello = (Hello) factory.create(srvcModel,helloWorldURL);

System.out.println(hello.sayHello("caohuili:"));

2动态模式

   动态模式不需要服务端的class,不过性能和复杂对象映射等估计做得不会太好。

Client client = new Client(new URL(

             "http://localhost:8080/webservice/services/Hello?wsdl"));

      Object[] results = client

             .invoke("sayHello", new Object[] { "Cao," });

      System.out.println((String) results[0]);

3根据WSDL生成Client Stub

 //简单参数的

HelloClient client=new HelloClient();

      HelloPortType port =client.getHelloHttpPort();

      System.out.println(port.sayHello("hi!"));

//参数复杂的

            MemberServiceClient client = new MemberServiceClient();

      MemberService memberService = client.getMemberServiceHttpPort();

     

     

      User user = new User();

      /*JAXBElement<String> name = new JAXBElement<String>(new QName(

             "http://memberService", "username"), String.class, "smallnest");

      JAXBElement<String> password = new JAXBElement<String>(new QName(

             "http://memberService", "password"), String.class, "123456");*/

     

       ObjectFactory bjFac=new ObjectFactory();

      JAXBElement<String> name = objFac.createUserUsername("smallnest");

      JAXBElement<String> password = objFac.createUserPassword("123456");

      user.setUsername(name);

      user.setPassword(password);

     

      Member neMember = new Member();

      JAXBElement<String> memeberName = new JAXBElement<String>(new QName(

             "http://memberService", "name"), String.class, "迈克");

      JAXBElement<String> email = new JAXBElement<String>(new QName(

             "http://memberService", "email"), String.class,

             "micro@micro.com");

      oneMember.setName(memeberName);

      oneMember.setEmail(email);

      oneMember.setRank(6);

      //调用方法

      memberService.addMember(oneMember, user);

那我们就完成自己的客户端,很简单,还是用eclipse新建立一个工程,并根据wsdl生成一个client

 

 

 

执行结果 

 

 

2.4     数组类型通讯

对于基本类型的数组,不用在aegis.xml文件中映射配置,生成客户端时,会生成ArrayOfString的映射类型接收数据。如果是自己定义的复杂对象,就需要在aegis.xml文件中配置对象映射,这时client会根据wsdl生成对应的ArroyOfxxx对象

首先生成服务类

 

 

 

生成的wsdl文件。

 

 

客户端程序

 

 

执行结果

 

 3        Weblogic部署方式