1.创建工程
在 myeclipse 中创建 webservice 工程, file->new->other->web service project,起名字 webservicetest。
其实所谓的 webservice 也不可能单独通讯, soap协议是一个更上层的通讯协议,他是凌驾在http协议上的,所以我们web开发熟悉的servlet必不可少,默认就可以啦。
选择以下工具 jar 包,
工程创建完毕,看看效果。包结构基本上遵守 web 的工程模式,仔细看多了一个目录WebServices ,下边的 services.xml 作用就是我们的应用下提供了几个webservices服务,另外就是 web.xml 会发生变化。
下一步工作我们分三种情况举例,分别是通讯传输[b]基本数据类型,xml数据类型,对象类型[/b]。 这三种情况应该可以涵盖了平时所有的应用。
[b]1.1 基本数据类型通讯[/b]
创建一个 service 服务程序。 File->new->other->myeclipse->web service 。
仍然需要起一个服务类的名字, FirstService , myeclipse 会为我们生成两个类服务接口类 (IFirstService) 和服务实现类 (FirstServiceImpl) 。
看看你的 service.xml 发生了什么变化。
看一下我们的实现类,很简单,就是返回一个基本数据类型 — 字符串
任务完成一半了,我们先部署一下,看看效果。
部署完成后我们生成 wsdl ,如下
Myeclipse 有个访问 wsdl 的工具,如下:
点击到 wsdl 方式,并录入 wsdl 的 url 路径。
测试 一下功能,结果如下 :
相当于客户端发一个字符串给服务端,服务端处理后返回一个字符串响应,功能叙述完毕 。
下来我们开发一个正式的客户端。
File->new->other->web service client 填写 wsdl 访问路径。生成的类以及关键测试代码 如下:
[b]1.2 对象类型通讯[/b]
简单基础类型通讯不能满足我们日常的系统开发工作 , 我们还需要支持远程对象传输 , 保证大数据量的传输 , 不过这就需要考虑效率问题 。压力测试时要注意 webservice 的效率测试 。
在生成 service 端和 client 端时最好使用两个工程,把 service 部署后建立另外一个xfire 工程 ,并生成 client ,在传输对象的过程中 client 端也需要一个 User 对象,这个对象的作用就是映射服务器端的自定义对象。
首先我们需要创建服务类,返回参数是自定义对象 User 。
创建 User 对象 ,注意这个是服务器端的。
为了在 WSDL 中映射参数的类型,我们需要创建一个配置文件,并和服务类放在一个包下。 IFirstService.aegis.xml
服务器端都准备好了,部署!看看我们 wsdl 。
注意其中对参数的定义。
下来就是 client 端的开发了,顺便介绍一下 xfire 客户端的[b]三种模式[/b]:
【 1. Client 开发者拥有Web服务端的 class】
即:能拿到服务端的接口 Class 和 Entity 类及 aegis 配置文件
【2. 动态模式】
动态模式不需要服务端的 class ,不过性能和复杂对象映射等估计做得不会太好。
【3.根据 WSDL 生成 Client Stub】
那我们就完成自己的客户端 ,很简单,还是用 eclipse 新建立一个工程,并根据 wsdl 生成一个 client 。
执行结果 :
[b]1.3 数组类型通讯[/b]
对于基本类型的数组,不用在 aegis.xml 文件中映射配置,生成客户端时,会生成 ArrayOfString 的映射类型接收数据。如果是自己定义的复杂对象,就需要在 aegis.xml 文件中配置对象映射,这时 client 会根据 wsdl 生成对应的 ArroyOfxxx 对象 。
首先生成服务类 。
from:http://blog.youkuaiyun.com/yaba213/archive/2010/11/19/6021695.aspx
在 myeclipse 中创建 webservice 工程, file->new->other->web service project,起名字 webservicetest。
其实所谓的 webservice 也不可能单独通讯, soap协议是一个更上层的通讯协议,他是凌驾在http协议上的,所以我们web开发熟悉的servlet必不可少,默认就可以啦。
选择以下工具 jar 包,
工程创建完毕,看看效果。包结构基本上遵守 web 的工程模式,仔细看多了一个目录WebServices ,下边的 services.xml 作用就是我们的应用下提供了几个webservices服务,另外就是 web.xml 会发生变化。
下一步工作我们分三种情况举例,分别是通讯传输[b]基本数据类型,xml数据类型,对象类型[/b]。 这三种情况应该可以涵盖了平时所有的应用。
[b]1.1 基本数据类型通讯[/b]
创建一个 service 服务程序。 File->new->other->myeclipse->web service 。
仍然需要起一个服务类的名字, FirstService , myeclipse 会为我们生成两个类服务接口类 (IFirstService) 和服务实现类 (FirstServiceImpl) 。
看看你的 service.xml 发生了什么变化。
看一下我们的实现类,很简单,就是返回一个基本数据类型 — 字符串
任务完成一半了,我们先部署一下,看看效果。
部署完成后我们生成 wsdl ,如下
Myeclipse 有个访问 wsdl 的工具,如下:
点击到 wsdl 方式,并录入 wsdl 的 url 路径。
测试 一下功能,结果如下 :
相当于客户端发一个字符串给服务端,服务端处理后返回一个字符串响应,功能叙述完毕 。
下来我们开发一个正式的客户端。
File->new->other->web service client 填写 wsdl 访问路径。生成的类以及关键测试代码 如下:
[b]1.2 对象类型通讯[/b]
简单基础类型通讯不能满足我们日常的系统开发工作 , 我们还需要支持远程对象传输 , 保证大数据量的传输 , 不过这就需要考虑效率问题 。压力测试时要注意 webservice 的效率测试 。
在生成 service 端和 client 端时最好使用两个工程,把 service 部署后建立另外一个xfire 工程 ,并生成 client ,在传输对象的过程中 client 端也需要一个 User 对象,这个对象的作用就是映射服务器端的自定义对象。
首先我们需要创建服务类,返回参数是自定义对象 User 。
创建 User 对象 ,注意这个是服务器端的。
为了在 WSDL 中映射参数的类型,我们需要创建一个配置文件,并和服务类放在一个包下。 IFirstService.aegis.xml
服务器端都准备好了,部署!看看我们 wsdl 。
注意其中对参数的定义。
下来就是 client 端的开发了,顺便介绍一下 xfire 客户端的[b]三种模式[/b]:
【 1. Client 开发者拥有Web服务端的 class】
即:能拿到服务端的接口 Class 和 Entity 类及 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 。
执行结果 :
[b]1.3 数组类型通讯[/b]
对于基本类型的数组,不用在 aegis.xml 文件中映射配置,生成客户端时,会生成 ArrayOfString 的映射类型接收数据。如果是自己定义的复杂对象,就需要在 aegis.xml 文件中配置对象映射,这时 client 会根据 wsdl 生成对应的 ArroyOfxxx 对象 。
首先生成服务类 。
from:http://blog.youkuaiyun.com/yaba213/archive/2010/11/19/6021695.aspx