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- ...
随机推荐
- mac 安装oracle
http://www.oracle.com/technetwork/cn/database/10204macsoft-x86-64-087400-zhs.html
- linux系统socket通信编程实践
简单介绍并实现了基于UDP(TCP)的windows(UNIX下流程基本一致)下的服务端和客户端的程序,本文继续探讨关于UDP编程的一些细节. 下图是一个简单的UDP客户/服务器模型: 我在这里也实现 ...
- iOS 数据类型转换
1.NSString转化为UNICODE String:(NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname c ...
- poj_1442 Treap
Treap是一种动态平衡二叉树结构,具有期望的O(log2n)的复杂度.适用于动态区间数据的查询.更改.维护等操作. 题目大意 一组数从前向后插入队列中,插入的过程中会有查询,查询当前队列中的第k小的 ...
- 原创Java多线程详解(一)
只看书不实践是不行的.来实践一下~~~~~~(引用请指明来源) 先看看百科对多线程的介绍 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的 ...
- DNS、链接网页、资源预加载处理
从网页性能的角度来看,DNS的解析时间是比较耗时的.因此如果能预先下载网页中用到的其它域的资源.可提前进行DNS解析: <link rel="dns-prefetch" hr ...
- sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序
这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境 ...
- 配置linux DNS
DNS服务器地址配置 在Linux下面,有一个默认的DNS服务器地址配置文件的设置,存放在 /etc/resolv.conf 设置方法很简单,通过编辑 vi /etc/resolv.conf 设置首选 ...
- Mac/Xcode - 开发技巧快捷键
Xcode是iPhone和iPad开发者用来编码或者开发iOS app的IDE.Xcode有很多小巧但很有用的功能,很多时候我们可能没有注意到它们,也或者我们没有在合适的水平使用这些功能简化我们的iO ...
- Python大数据:外部数据获取(网页抓取)
import urllib2 as url import cookielib,StringIO,gzip,json import pandas as pd import numpy as np #定义 ...