WebService—CXF—实现接口发布和客户端调用
(一)接口发布的几种方式
定义接口:
@WebService(targetNamespace="http://www.itfad.net/queryUser")
public interface IQueryUser
{
String query(@WebParam(name = "user") UserInfo user);
}
实现类:
@WebService(endpointInterface="net.itfad.services.IQueryUser")
public class QueryUserImpl implements IQueryUser
{
public String query(UserInfo user)
{
if (user == null)
throw new IllegalArgumentException("参数user不能为null");
return "your name is " + user.getUserName();
}
}
一、使用jax-ws方式(Java EE原生代码方式)
package server;
import hb.QueryUserImpl;
import hb.SessionSendMsg;
import javax.xml.ws.Endpoint;
public class DeployHelloWorldService { public static void main(String[] args) {
//发布第1个接口
QueryUserImpl service = new QueryUserImpl();
String address = "http://localhost:9000/helloWorld";
Endpoint.publish(address, service);
//发布第2个接口
SessionSendMsg sessionSendMsg = new SessionSendMsg();
String address1 = "http://localhost:9000/session";
Endpoint.publish(address1, sessionSendMsg);
}
}
二、使用CXF方式
String url="http://localhost:8080/queryUser";
JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
factoryBean.setAddress(url);
factoryBean.setServiceClass(IQueryUser.class);
factoryBean.setServiceBean(new QueryUserImpl());
factoryBean.create()
三、CXF Simple FrontEnd方式
该方式无需在类中指定相关协议,也就是说不需要在类中指定相关webservice注解,一个普通类就行。
ServerFactoryBean svrFactory = new ServerFactoryBean();
//设置服务接口类
svrFactory.setServiceClass(IQueryUser.class);
svrFactory.setAddress("http://localhost:8080/queryUser");
//设置服务实现接口类
svrFactory.setServiceBean(QueryUserImpl);
svrFactory.create();
(二)客户端调用的几种方式
一、WSDL2Java WSDL2Java generated Client
根据wsdl文件生成客户端代码,本地化调用。cxf框架有基于maven的生成客户端代码的插件,使用如下:
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/OrderProcess.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
二、JaxWsProxyFactoryBean
客户端直接调用服务器端提供的服务接口,不需要生成客户端代码,类似RMI的机制。CXF通过运行时代理生成远程服务的代理对象,在客户端完成对webservice的访问。所以客户端也必须依赖服务器端的接口,限制是很大的,要求服务器端的webservice必须是java实现。似乎失去了webservice跨平台数据调用的意义。
package demo.order.client;
import demo.order.Order;
import demo.order.OrderProcess;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class ClientProxyClient { public static void main(String args[]) throws Exception {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(OrderProcess.class);
factory.setAddress("http://localhost:8080/OrderProcess");
OrderProcess service = (OrderProcess)factory.create(); Order order = new Order();
order.setCustomerID("C001");
order.setItemID("I001");
order.setPrice(100.00);
order.setQty(20);
String result = service.processOrder(order);
System.out.println("The order ID is " + result);
}
}
三、Dynamic Client 动态代理
CXF提供动态类的两个工厂类。如果你的服务是在JAX-WS的规范来定义,你应该使用jaxwsdynamicclientfactory。如果你不想要或不需要JAX-WS语义,使用dynamicclientfactory。
下文使用jaxws语义。只要指定服务器端wsdl文件的位置,然后指定要调用的方法和方法的参数即可,不关心服务端的实现方式,动态生成客户端代码。让我们假设您有一个WSDL,它定义了一个"echo"操作(方法),它接受一个字符串的输入并输出一个字符串。你可以使用jaxwsdynamicclientfactory它这样:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("echo.wsdl");
Object[] res = client.invoke("echo", "test echo");
System.out.println("Echo response: " + res[0]);
由于有许多的WSDL将有更复杂的类型。在这种情况下,jaxwsdynamicclientfactory更关心的是生成这些类型的java类。例如,我们可能有一个跟踪组织中人员的人员服务。在样品下面我们创建一个Person对象,动态地发送到服务器的addperson操作(方法):
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("people.wsdl", classLoader);
Object person = Thread.currentThread().getContextClassLoader().loadClass("com.acme.Person").newInstance();
Method m = person.getClass().getMethod("setName", String.class);
m.invoke(person, "Joe Schmoe");
client.invoke("addPerson", person);
You may be asking yourself the following question: "Where did the class name 'com.acme.Person' come from?"
One way to get the class names is to run wsdl2java and examine the results. The dynamic client factory uses the same code generator as that tool.
四、JaxWsServerFactoryBean
用JaxWsServerFactoryBean发布,需要独立的jetty包。SUN针对Java的Web Service实现先后提出两套API,一个是JaxRPC,另一个JaxWs。 JaxWsServiceFactoryBean继承了ReflectionServiceFactoryBean, 并提供JaxWsAPI的支持。在该类中这里主要是支持JSR181,重载了很多父类的方法,有关createServiceFromWSDL的部分则可重用父类ReflectionServiceFactoryBean.
在CXF中有几个很相似名词 JaxWsServiceFactoryBean, JaxWsServerFactoryBean,很相似。Service创建客户端的代理,生成factory对象,用于调用服务端的方法。Server创建服务端的对象 用于发布服务。Server 是对服务器端来说,Service是针对服务信息来说的。也就是一个Server必然要包含一个Servie信息。如果使用CXF内部API来创建服务的话,只需要通过设置JaxWsServerFactoryBean 就可以发布服务了。在JaxWsServerFactorBean的构造函数中会创建一个缺省JaxWsServiceFactoryBean. 当然在构建自己的Server的同时也可以设置自己的ServiceFactoryBean,(API目的在于CXF对Spring的支持?)你可以在Spring中定义装配符合自己要求的服务,自然需要有读取和设置的这或者那样Bean的方法了。
五、Ajax(js+xml的方式调用)
Ajax请求的URL即webservice服务地址,请求方式必须是POST。需要手动设置请求头,构造请求体。必须要对SOAP文件非常的了解。一般使用ajax调用,应该是在已经获知了以下信息以后才去调用:
a:获知请求(request)的soap文本。
b:获知响应(response)的soap文本。
请求文件和响应文本格式,一般会随web服务的发布一同发布。我们可以通过WSExplorer获取上面两段文本。具体调用方法如下:
1:前端页面请求:
<body>
<input type="text" id="msg" />
<input type="button" onclick="sendAjaxWS();" value="通过ajax调用webservice服务"/>
</body>
2:js里面封装请求信息:
<script>
var xhr;
function sendAjaxWS(){
xhr = new ActiveXObject("Microsoft.XMLHTTP");
//指定ws的请求地址
var wsUrl = "http://192.168.1.108:5678/hello";
//手动构造请求体
var requestBody = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '
+ 'xmlns:q0="http://service.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema "'
+ ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
+ '<soapenv:Body><q0:sayHello><arg0>'
+ document.getElementById("msg").value+'</arg0> <arg1>10</arg1> </q0:sayHello></soapenv:Body></soapenv:Envelope>';
//打开连接
xhr.open("POST",wsUrl,true);
//重新设置请求头
xhr.setRequestHeader("content-type","text/xml;charset=utf8");
//设置回调函数
xhr.onreadystatechange = _back;
//发送请求
xhr.send(requestBody);
} //定义回调函数
function _back(){
if(xhr.readyState == 4){
if(xhr.status == 200){
var ret = xhr.responseXML;
//解析xml
var eles = ret.getElementsByTagName("return")[0];
alert(eles.text);
}
}
}
</script>
WebService—CXF—实现接口发布和客户端调用的更多相关文章
- webservice代码编写主要包括服务器端发布和客户端调用。
一.java工程发布,java工程调用 (一).服务器端的编写 1.在eclipse里新建java project工程,创建功能类,通过关键字@webservice(name="newI ...
- WebService使用入门(包括发布服务,调用服务)
WebService是基于SOAP协议的,全称是Simple Object Access Protocol(简单对象访问协议). SOAP不是什么神奇的东西,等于HTTP+XML,即在HTTP协议的基 ...
- webservice发布服务:CXF及客户端调用
2.CXF:(与spring整合) CXF相对来说操作没有AXIS繁琐 1.导入spring的jar包和cxf的jar包 2.在spring的核心配置文件中配置发布的接口类 <?xml vers ...
- tomcat+webservice实现简单的web服务远程调用接口
1,准备工作: ①需要使用到jaxws的一系列架包,网址:http://jax-ws.java.net,我下的是比较新的一个版本(下载好以后吧架包发在lib下),②webservice的一个工具 ...
- webservice(CXF)基于3.1.1版本实例
引言 有没有一种办法可以实现跨应用程序进行通信和跨平台进行通信呢? 换句话说,就是有什么办法可以实现我的应用程序 A 可以和应用程序 B 进行通信呢? 或者说是,我用 Java 写的应用程序和用 . ...
- CXF发布webService服务以及客户端调用
这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...
- WebService—CXF整合Spring实现接口发布和调用过程
一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId> ...
- Spring集成CXF发布WebService并在客户端调用
Spring集成CXF发布WebService 1.导入jar包 因为官方下载的包里面有其他版本的sprring包,全导入会产生版本冲突,所以去掉spring的部分,然后在项目根目录下新建了一个CXF ...
- WebService的发布及客户端的调用
一.目录 1.JAX-WS发布WebService 1.1 创建一个简单的WS 1.2 打包部署和发布 2.CXF+Spring发布WebService 3.客户端的调用方式 二.正文 1. JAX- ...
随机推荐
- 九度 1500:出操队形(LIS变形)
题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较高的就要排在队尾.突然,有一天出操负责人想了一个 ...
- 使用Git Hooks实现开发部署任务自动化
前言 版本控制,这是现代软件开发的核心需求之一.有了它,软件项目可以安全的跟踪代码变更并执行回溯.完整性检查.协同开发等多种操作.在各种版本控制软件中,git是近年来最流行的软件之一,它的去中心化架构 ...
- linux添加自启服务(程序)
修改 /etc/rc.d/rc.local 文件,加入启动程序的脚本命令就可以了 例如: /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongo ...
- Dubbo(四) -- telnet命令
一.telnet的作用 当dubbo服务(即生产者)发布之后,我们可以通过telnet命令来来进行调试和管理,以及跟踪服务调用的次数. 注意:2.0.5以上版本服务提供端口支持telnet命令,协议一 ...
- MySQL性能优化(三)-- 索引
一.什么是索引及索引的特点 索引是一种数据结构 索引的特点:查找速度快,排好序,数据结构 索引的数据结构类型有:BTREE索引和HASH索引,下面展示的是BTREE索引. BTREE:balance ...
- Linux 虚拟终端:screen
screen 是一个虚拟终端,我们可以把执行时间很长的命令放在虚拟终端中执行,即使终端断开,这个虚拟终端也会在后台执行 [root@localhost ~]$ yum install -y scree ...
- Python 循环退出
常用语句: break :退出整个循环,循环外的语句继续执行continue :退出本次循环,继续下一次循环pass :什么也不做,相当于在这里占个位置,以便以后修改代码sys.exit() :直接退 ...
- Nginx遇上Access Denied提示怎么解决
这几天在摆弄linux下面的各种服务器,对nginx非常有兴趣. 于是把phpmyadmin传上去了,先是phpmyadmin配了半天,结果配好之后发现phpmyadmin一些logo.css.js文 ...
- 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个三角形(1)
前言 在本系列教程中,我会以当下最流行的2D引擎Cocos2d-x为基础,介绍OpenGL ES 2.0的一些基本用法.本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2d-x过程中,知其然 ...
- php学习二:表达式
1. 可变变量$$ 在php中,可变变量可以用$$来表示, 代码如下: $name = "zhangSan"; $$name = "liSi"; //相当于$ ...