问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于CXF webservice 的一个入门的问题

发布网友 发布时间:2022-05-04 17:46

我来回答

2个回答

懂视网 时间:2022-05-04 22:07

上一节中已经成功的发布了一个服务端webservice,这一部分将默认客户端调用webservice 这里我们重新建立了一个新的工程CXF-Client,把上一节中列举的jar包都搞过来即可,调用方式采用了和RMI类的机制,即客户端直接服务器端提供的服务接口(interface),CXF通过

上一节中已经成功的发布了一个服务端webservice,这一部分将默认客户端调用webservice

这里我们重新建立了一个新的工程CXF-Client,把上一节中列举的jar包都搞过来即可,调用方式采用了和RMI类似的机制,即客户端直接服务器端提供的服务接口(interface),CXF通过运行时代理生成远程服务的代理对象,在客户端完成对webservice的访问

几个必填的字段:setAddress-这个就是我们发布webservice时候的地址,保持一致

HelloWorldService:需要服务器端提供单独的Jar文件过来

package com.crazycoder2010.webservice.cxf.client;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.crazycoder2010.webservice.cxf.server.HelloWorldService;

public class Client {
	public static void main(String[] args) {
		JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();
		bean.getInInterceptors().add(new LoggingInInterceptor());
		bean.getInFaultInterceptors().add(new LoggingOutInterceptor());
		bean.setServiceClass(HelloWorldService.class);
		bean.setAddress("http://localhost:9090/helloWorldService");
		HelloWorldService helloWorldService = (HelloWorldService)bean.create();
		String result = helloWorldService.sayHello("Kevin");
		System.out.println(result);
	}
}

运行输出:

2011-8-9 21:32:20 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://server.cxf.webservice.crazycoder2010.com/}HelloWorldServiceService from class com.crazycoder2010.webservice.cxf.server.HelloWorldService
2011-8-9 21:32:41 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset="utf-8"
Headers: {Content-type=[text/xml;charset="utf-8"], Transfer-encoding=[chunked]}
Payload: Hello Kevin
--------------------------------------
Hello Kevin
小结:这种调用service的好处在于调用过程非常简单,就几行代码就完成一个webservice的调用,但是客户端也必须依赖服务器端的接口,这种调用方式限制是很大的,要求服务器端的webservice必须是java实现--这样也就失去了使用webservice的意义

热心网友 时间:2022-05-04 19:15

初探WSDL2JAVA工具的使用
WSDL(Web Service Define Language)可以把它看成一种接口描述语言,告诉Web Service的调用者如下信息:
Web Service 提供了哪些调用?
这些调用需要什么参数?
返回参数是怎么的(数据格式)
调用的具体位置等等
由于WSDL使用XML语言描述,能够容易的被程序处理。
下面以WSDL2Java为例,介绍一下WSDL的自动处理。
通常WSDL文件包含:
1、类型:定义复合数据类型
2、消息:由类型组合成消息(可以作为下面操作的参数)(疑问?:分为类型和消息,直接放在一个组
为啥不行)
3、操作:其中定义可以调用的操作,每个操作的参数。操作的集合对外呈现一个接口
4、绑定:定义每个操作具体的调用方式,数据的编码方式()
5、服务:对外呈现服务,可以包含多个绑定
6、端口:远程地址
其中,1,2,3被称为逻辑的描述; 4,5,6用来描述具体的服务地址和参数编码方式
介绍完了WSDL,我们看一下WSDL2JAVA的具体如何实现
总体来说,WSDL有两部分功能,客户端Stub(存根)和服务器端Skeleton()的生成。
其中客户端Stub负责,根据用户参数打包成SOAP消息;服务器端Skeleton的生成是可选的,负责具体的类
调用的外包。
先说第一部分,WSDL2JAVA处理WSDL生成前端Stub的过程:
具体而言,又分为如下几个部分:
1、类型定义的转换
把WSDL中类型的定义部分,转化成对应JAVA类。现有WSDL中类型定义如下:(选自Axis帮助)
WSDL2JAVA将会生成如下代码:
public class Phone implements java.io.Serializable {
public Phone() {...}
public int getAreaCode() {...}
public void setAreaCode(int areaCode) {...}
public java.lang.String getExchange() {...}
public void setExchange(java.lang.String exchange) {...}
public java.lang.String getNumber() {...}
public void setNumber(java.lang.String number) {...}
public boolean equals(Object obj) {...}
public int hashCode() {...}
}
我们可以看到,WSDL2JAVA生成了一个新的类和WSDL中定义的类型对应,并且为每个成员定义get和set函
数,还把每个字段的首字母大写。
2、接口
WSDL2JAVA将会生成如下代码:
生成一个接口,对外呈现描述的各个接口。message
代表输入输出参数,生成的代码将把message的各个部分罗列在参数表中。
public interface AddressBook extends java.rmi.Remote {
public void addEntry(String name, Address address) throws java.rmi.RemoteException;
}
具体由
3、绑定
...
WSDL2JAVA将会生成如下代码:
从其父类可以看出,他继承自org.apache.axis.client.Stub和具体实现类。将会把生成相应的
Stub,stub中将把调用转化为SOAP调用,另一面它也继承了具体类的所有接口。
public class AddressBookSOAPBindingStub extends org.apache.axis.client.Stub
implements AddressBook {
public AddressBookSOAPBindingStub() throws org.apache.axis.AxisFault
{...}
public AddressBookSOAPBindingStub(URL endpointURL,
javax.xml.rpc.Service service)
throws org.apache.axis.AxisFault
{...}
public AddressBookSOAPBindingStub(javax.xml.rpc.Service service)
throws org.apache.axis.AxisFault
{...}
public void addEntry(String name, Address address) throws RemoteException
{...}
}
4、服务
将形成一个接口:
public interface AddressBookService extends javax.xml.rpc.Service {
public String getAddressBookAddress();
public AddressBook getAddressBook() throws javax.xml.rpc.ServiceException;
public AddressBook getAddressBook(URL portAddress) throws
javax.xml.rpc.ServiceException;
}
还会产生一个Locator实现上面的接口:
public class AddressBookServiceLocator extends org.apache.axis.client.Service
implements AddressBookService {
...
}
下面是一个具体的调用过程:
public static void main(String [] args) throws Exception {
// 生成一个locator
AddressBookService service = new AddressBookServiceLocator();
// 生成一个具体的生成Service的类
AddressBook port = service.getAddressBook();
// 现在可以调用了
Address address = new Address(...);
port.addEntry("Russell Butek", address);
}
这其中有几个问题:
1、 对应成为一个接口,绑定对应成具体的类实现接口,负责把用户调用转化成SOAP调用,使用户感觉像本地调用。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 南昌和长沙哪个好 长沙和南昌哪个更宜居 农村信用社星期六上班吗?是双休还是? 南昌好还是长沙好啊 江西南昌和湖南长沙哪个比较好!? 南昌房价为什么高,长沙为什么相对较低 为什么南昌的房价比长沙高? 长沙房价比南昌低,为什么总有人拿长沙和南昌做比较? 海尔洗衣机离合器在哪 长沙 南昌 房价对比 南昌房价为什么高,长沙为什么相对较低? 南昌和长沙相比哪个好? 江西省法院招聘书记员速录打字需要每分钟多少字? 急求江苏省**员听打训练录音资料.以及笔试考试内容大概..yiyiji 衬衣的折痕怎去掉? *员听打录音 求**员听打音频,谢谢 报了*员,马上考试了求音频试试 356573963@qq.com 法院书记员听打练习材料有哪些? 两院书记员考试看打跟听打分别怎么考? 求法院书记员的听打录音材料,语速在一分钟90字至120字之间! 急需书记员听打录音 长沙的房价比南昌的低,为什么有人拿长沙和南昌比? 长沙,南昌,合肥哪一个更适合定居 在南昌定居和长沙定居哪个好 为什么南昌的房价这么贵,比湖南长沙还贵! 请问南昌跟长沙比较,哪个城市比较好? 工作地点隆平高科技园,靠近汽车东站和星沙,在长沙哪里买房最好?应该考虑哪些方面? 这个是紫沙壶底款陈呜德何许人也 百家姓中有姓“紫”的吗? 百家姓里有姓紫的吗 一把王炸打成烂牌的4位明星,明明可以大红大紫,如今混成这样,分别是谁? 一*红大紫, 一人早已无人知晓,《欢乐喜剧人》四位冠军现状如何? 目前中国有人姓紫吗??有人姓橙吗?? 杭州黑紫贸易有限公司怎么样? Linux下如何通过编程得到DNS ip地址和默认网关ip地址。(C 语言) 里面有一个男的喜欢紫敬吗 他叫啥 现代紫砂壶大师都有哪些? 语文六年级28课我的舞台的主要内容 我的舞台=课文内容 《我的舞台》感悟和收获 读《我的舞台》有感