使用CXF发布WebService
这里普及一下WebService和cxf的知识、关于webservice和cxf:
SOA (面向服务架构): IBM提倡面向服务的架构, 希望以-组装电脑-的形式开发软件
SOA:、各种提供服务的组件
、企业总线、通讯总线(ESB)
CXF:是一个SOA框架,Axis和XFire是原生态的WebService框架,由此可见,CXF是优秀与后两者的
SOAP(简单对象访问协议):包含了两个标签,header和body,header是由程序员添加的,可以没有,
但是body标签是必须的。
body标签分为两种情况:.当WebService调用成功的时候,由WSDL控制。
.当WebService调用失败的时候,会生成fault元素,而fault元素又
包含两个部分:.错误码;.错误信息
html+xml脚本片段
-------------------------------------------------------------------------------
CXF环境变量配置
将CXF的bin目录放到path环境变量
wsdl2java --检测cxf环境配置是否成功
cxf对jdk的要求是..或以上
-------------------------------------------------------------------------------
WebService之间至少需要两个部分:接口和实现类
CXF自动携带了一个Jetty web Server,但是实际中并不使用它,多数使用Tomcat或WebLogic
-------------------------------------------------------------------------------
使用XCF开发WebService的服务端
.开发一个WebService的业务接口,并且该接口使用@WebService修饰
.开发接口的实现类,该实现类也需要采用@WebService修饰
.发布WebService并且对外暴露WSDL,采用EndPoint类的静态方法publish发布,该类由java提供
-------------------------------------------------------------------------------
客户端调用WebService服务
.使用CXF提供的wsdl2java命令生成远端代理
.找到生成的代理类中的一个继承了service的类可以作为工厂使用,调用service子类中的一个叫getXXXport的方法
得到远端接口服务代理对象
.远端代理调用
使用wsdl2java http://127.0.0.1/firstcxf?wsdl执行远端代码,生成java文件,生成的java文件会有错误,
原因是:javax.xml.ws.Service类中没有Service(wsdlLocation,SERVICE,features); 构造器。
解决方法是:导入一个geronimo-javax_2.2_spec-..jar提供最新版本的Service类,但是这个方法不建议(移植性差)
可以使用:wsdl2java -frontend http://127.0.0.1/firstcxf?wsdl
- package com.ws;
- import javax.jws.WebMethod;
- import javax.jws.WebParam;
- import javax.jws.WebService;
- /**
- * interface
- *
- * @author Administrator
- *
- */
- @WebService
- public interface HelloWorld {
- @WebMethod(operationName="sayHi")
- public String sayHi(@WebParam(name="name")String name);
- }
- 2.然后,设计一个类实现该接口,注意头部要添加@WebService注解,其中,endpointInterface的值为接口的完整名称,serviceName为暴露给外界访问的服务名称。
- package com.ws.impl;
- import javax.jws.WebService;
- import com.ws.HelloWorld;
- /**
- * endpointInterface:实现接口的完全路径
- * serviceName:server名称
- *
- * @author Administrator
- *
- * WebService 的目的是便于其他的编程语言调用
- *
- */
- @WebService(endpointInterface="com.ws.HelloWorld",serviceName="Hello")
- public class HelloWorldImpl implements HelloWorld {
- @Override
- public String sayHi(String name) {
- System.out.println("client called webservice...");
- if(name == null){
- return "Who are you?";
- }
- return "Hello , "+name;
- }
- }
- 3.使用Endpoint.publish方法发布WebService到互联网
- package com.srv;
- import javax.xml.ws.Endpoint;
- import com.ws.HelloWorld;
- import com.ws.impl.HelloWorldImpl;
- public class ServerMain {
- /**
- * 发布webservice
- *
- * @param args
- */
- public static void main(String[] args) {
- //第一种方式:非CXF方法
- HelloWorld hw = new HelloWorldImpl();
- Endpoint.publish("http://127.0.0.1:8888/firstcxf", hw);
- System.out.println("webservice publish successed!");
- //System.exit(0);
- //第二种方法(CXF发布),需要导入cxf 的jar包
- HelloWorldImpl impl = new HelloWorldImpl();
- JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
- factoryBean.setAddress("http://127.0.0.1:8888/firstcxf");//发布地址
- factoryBean.setServiceClass(HelloWorld.class);//接口类
- factoryBean.setServiceBean(impl);//发布接口的实现类的实例
- factoryBean.create();
- System.out.println("WS发布成功!");
- }
- }
- package com.client;
- import java.net.MalformedURLException;
- import java.net.URL;
- import javax.xml.namespace.QName;
- import javax.xml.ws.Service;
- import javax.xml.ws.soap.SOAPBinding;
- import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
- import com.ws.HelloWorld;
- import com.ws.impl.Hello;
- public class ClientMain {
- /**
- * 远端调用WebService
- *
- * @param args
- */
- public static void main(String[] args) {
- // 第一种方式,不需要导入cxf包
- // // 注意。此处http://impl.ws.com/ 来源于wsdl文件中targetNamespace
- // QName qName = new QName("http://impl.ws.com/", "Hello");
- // Hello hello;
- // try {
- // hello = new Hello(new URL("http://127.0.0.1:8888/firstcxf?wsdl"),
- // qName);
- // HelloWorld service = hello.getPort(HelloWorld.class);
- // System.out.println(service.sayHi("niha"));
- // } catch (MalformedURLException e) {
- // e.printStackTrace();
- // }
- // 第二种方法 (无需导入cxf包)
- // Hello service = new Hello();
- // //service.getXXXPort返回的是远端接口代理对象
- // HelloWorld hw = service.getHelloWorldImplPort();
- // //远端调用
- // System.out.println(hw.sayHi("Handle"));
- // //第三种方法:采用CXF方法 (需要导入cxf包)
- // JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
- // //1.设置WebService接口
- // factory.setServiceClass(HelloWorld.class);
- // //2.设置wsdl的暴露地址
- // factory.setAddress("http://127.0.0.1:8888/firstcxf");
- //
- // HelloWorld hw = (HelloWorld) factory.create();
- // System.out.println(hw.sayHi(null));
- //
- // (不可用)
- // String endpointAddress = "http://127.0.0.1:8888/firstcxf";
- // Service service = Service.create(Hello.SERVICE);
- // service.addPort(Hello.HelloWorldImplPort,
- // SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
- // HelloWorld helloS = service.getPort(HelloWorld.class);
- // helloS.sayHi("nihao");
- }
- }
- package com.test;
- import javax.xml.namespace.QName;
- import org.apache.cxf.endpoint.Client;
- import org.apache.cxf.endpoint.Endpoint;
- import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
- import org.apache.cxf.service.model.BindingInfo;
- import org.apache.cxf.service.model.BindingOperationInfo;
- public class Test3 {
- public static void main(String[] args) {
- //第一种,知道方法名一定存在直接调用
- JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
- Client client = dcf.createClient("http://127.0.0.1:8888/firstcxf?wsdl");
- try {
- QName opName = new QName("http://ws.com/", "sayHi");//设置限定名
- Object[] result = client.invoke(opName, "lisi");
- System.out.println(result[0].toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- //第二种方法,较为动态的查找需要调用的方法
- // String wsdl = "http://127.0.0.1:8888/firstcxf?wsdl";
- // String operation = "sayHi";
- //
- // JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
- // Client client = factory.createClient(wsdl);
- //
- // // 下面一段处理 WebService接口和实现类namespace不同的情况
- // // CXF动态客户端在处理此问题时,会报No operation was found with the name的异常
- // Endpoint endpoint = client.getEndpoint();
- // QName opName = new QName(endpoint.getService().getName().getNamespaceURI(), operation);
- // BindingInfo bindingInfo = endpoint.getEndpointInfo().getBinding();
- // if (bindingInfo.getOperation(opName) == null) {
- // for (BindingOperationInfo operationInfo : bindingInfo.getOperations()) {
- // if (operation.equals(operationInfo.getName().getLocalPart())) {
- // opName = operationInfo.getName();
- // break;
- // }
- // }
- // }
- //
- // String realParams = "Li si";
- // try {
- // Object[] res = client.invoke(opName, realParams);
- // System.out.println(res[0].toString());
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- }
- }
使用CXF发布WebService的更多相关文章
- CXF发布webService服务以及客户端调用
这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...
- SpringBoot整合cxf发布webService
1. 看看项目结构图 2. cxf的pom依赖 1 <dependency>2 <groupId>org.apache.cxf</groupId>3 <art ...
- SpringMVC4整合CXF发布WebService
SpringMVC4整合CXF发布WebService版本:SpringMVC 4.1.6,CXF 3.1.0项目管理:apache-maven-3.3.3 pom.xml <project x ...
- Spring集成CXF发布WebService并在客户端调用
Spring集成CXF发布WebService 1.导入jar包 因为官方下载的包里面有其他版本的sprring包,全导入会产生版本冲突,所以去掉spring的部分,然后在项目根目录下新建了一个CXF ...
- 使用CXF发布WebService服务简单实例
一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...
- CXF发布webservice入门
1.设置CXF的bin目录进环境变量 2.CXF导入相关的jar包. 3.建立接口 @WebService public interface HelloWorld { public void say( ...
- [置顶] 利用CXF发布webService的小demo
其实webService的发布不仅仅只有xfire,今天,给大家介绍一下用CXF发布一个webService的小demo,CXF也是我做webService用的第一个框架... 先将相关的jar引进来 ...
- cxf发布 webservice服务
导包 antlr-2.7.7.jar aopalliance-1.0.jar asm-3.3.jar commons-collections-3.2.1.jar commons-lang-2.6.ja ...
- 使用CXF发布webservice服务及注意要点
一.概念 1.什么是webservice Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用 ...
随机推荐
- 点击区域外隐藏该区域,event.stopPropagation()
event.stopPropagation() Description: Prevents the event from bubbling up the DOM tree, preventing an ...
- 【小梅哥FPGA进阶学习之旅】基于Altera FPGA 的DDR2+千兆以太网电路设计
DDR2电路设计 在高速大数据的应用中,高速大容量缓存是必不可少的硬件.当前在FPGA系统中使用较为广泛的高速大容量存储器有经典速度较低的单数据速率的SDRAM存储器,以及速度较高的双速率DDR.DD ...
- wireshark常用过滤条件
抓取指定IP地址的数据流: 如果你的抓包环境下有很多主机正在通讯,可以考虑使用所观察主机的IP地址来进行过滤.以下为IP地址抓包过滤示例: host 10.3.1.1:抓取发到/来自10.3.1.1的 ...
- 【转】Android选项卡置底的方法
转载地址:http://www.oschina.net/code/snippet_163910_6092 发现很多Android应用的选项卡 都是显示在页面底部的,网上有资料:通过反射获取TabWid ...
- 不写完不回家的TreeSet
TreeSet详解 继承架构图: |——SortedSet接口——TreeSet实现类 Set接口——|——HashSet实现类 |——LinkedHashSet实现 ...
- windows下的c语言和linux 下的c语言以及C标准库和系统API
1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作 ...
- 解决小米、红米及其他 Android 手机无法在 Mac 下进行真机调试的问题(转)
转自:http://ju.outofmemory.cn/entry/103522 Begin iOS 2014-08-19 271 阅读 手机 Android 小米 mac 调试 在 Mac OSX ...
- GOLANG 声明
GO语言声明关键字 var 声明变量 const 声明常量 type 声明新类型 func 声明函数(方法) package 声明包 interface 声明接口
- UVA 10795 新汉诺塔问题
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- ubuntu host备份 ubuntu无法解析主机
/etc/hosts # Copyright (c) 2014-2016, racaljk.# https://github.com/racaljk/hosts# Last updated: 2016 ...