这篇随笔内容是CXF发布webService服务以及客户端调用的方法

CXF是什么?

开发工作之前需要下载CXF和安装

下载地址:http://cxf.apache.org

安装过程:

<1>下载解压到一个目录(不能有中文,特殊字符)

<2>配置环境变量(我使用的是2.6.15版本,针对不同的版本配置环境变量)

CXF_HOME=D:\DevIDE\Java\apache-cxf-2.6.15

path=%CXF_HOME%/bin;

<3>测试是否安装成功?

CXF安装好了,就可以进行webService的开发工作,不管用什么技术,尽量可以先参考官方文档

在cxf解压目录中有samples目录,都是参考例子

我们可以通过java工程来发布一个webService服务,也可以通过web工程发布一个webService服务,下面分别写一个Demo

通过java工程发布一个webService

1、创建一个java工程

2、导入jar包

将目录中的jar都引入到工程即可。(注意一个目录和一个which_jar不要拷贝进去)

3、写webservice接口类

 package com.esb.ws.server;

 import javax.jws.WebService;

 @WebService
public interface MobileAddress {
public String getAddressByMobile(String mobile);
}

4、写一个sei,服务接口实现类

 package com.esb.ws.server;

 public class MobileAddressImpl implements MobileAddress {

     @Override
public String getAddressByMobile(String mobile) {
return "电话号码"+mobile+"属于上海电信";
}
}

5、发布服务

 package com.esb.ws.server;

 import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

 public class CXFServer {
public static void main(String[] args) {
//三步走
//1、实例化一个jaxws服务工厂
JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean(); //设置三个属性
//2.1设置SEI接口的class
sf.setServiceClass(MobileAddress.class);
//2.2设置SEI的实现者
sf.setServiceBean(new MobileAddressImpl());
//2.3服务地址
sf.setAddress("http://127.0.0.1:8888/mobileService"); //3创建并发布
sf.create(); System.out.println("通过CXF创建服务成功!");
}
}

测试的话可以通过访问http://127.0.0.1:8888/mobileService?wsdl

客户端程序开发

<1>生成桩,本地代理接口类(在dos窗口通过wsdl2java命令,具体的命令网上找)

将生成的类复制到工程中

2、编写客户端调用webservice服务

 package com.esb.ws.client;

 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

 import com.esb.ws.server.MobileAddress;

 public class CXFClient {
public static void main(String[] args) {
//三部走
//1、本地代理工厂实例
JaxWsProxyFactoryBean pf = new JaxWsProxyFactoryBean(); //2、设置webservice服务端的地址,加上wsdl也可以
pf.setAddress("http://127.0.0.1:8888/mobileService"); //3、创建的到本地代理类(桩)
MobileAddress address = pf.create(MobileAddress.class); String result = address.getAddressByMobile("181xxxx7433"); System.out.println(result);
}
}

打印结果:

通过web发布webService

Web服务发布webService,是将webservice服务和普通的web服务一起启动,也就是说使用tomcat启动webservice服务,而不是通过main方法。这里介绍的是CXF与Spring整合,使用web容器启动,然后spring容器起来,spring容器管理者webservice服务类

官方Demo,参考sample目录下的java_first_spring_support

webService服务端开发:

<1>新建web工程

<2>导入jar包

Spring的核心包+CXF相关和依赖

在CXF安装包解压目录下的lib目录下的jar包全部导入即可,需要注意的是:如果你的项目用的新版本,那么这里的spring的包就别拷贝了

<3>接口类,并在接口类加上注解

 package com.esb.ws.server;

 import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.BindingType; @WebService(name="MobileAddress"
,serviceName="MobileAddressService"
,portName="MobileAddressPort"
,targetNamespace="http://ws.esb.com/"
)
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public interface MobileAddress { @WebMethod(operationName="getAddressbyMobileNo")
public @WebResult(name="address")String getAddressByMobile(@WebParam(name="mobileNo")String mobile);
}

<4>接口实现类

 package com.esb.ws.server;

 public class MobileAddressImpl implements MobileAddress {

     @Override
public String getAddressByMobile(String mobile) {
return "电话号码"+mobile+"属于上海电信";
} }

<5>配置web.xml文件,目的就是为了web容器启动时,初始化CXF服务,是web服务发布webService的连接点。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>WebService_CXF_Web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
</web-app>

<6>配置CXF服务端的配置文件

分析源代码可以得出默认情况下,加载/WEB-INF/cxf-servlet.xml

配置cxf-servlet.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/bindings/soap
http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
">
<!--
jaxws:server代表org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean,服务实例工厂
等价于JaxWsServiceFactoryBean jf = new JaxWsServiceFactoryBean();
address:写服务的相对路径
serviceClass:sei接口类
jaxws:serviceBean:sei的实现类
-->
<jaxws:server address="/mobile" serviceClass="com.esb.ws.server.MobileAddress">
<jaxws:serviceBean>
<ref bean="mobileAddress"/>
</jaxws:serviceBean>
</jaxws:server>
<bean id="mobileAddress" class="com.esb.ws.server.MobileAddressImpl"></bean>
</beans>

<7>发布服务,启动tomcat

测试OK?

浏览器访问 http://localhost:8080/WebService_CXF_Web/ws/mobile?wsdl(自己发布的地址)

开发客户端调用webService

<1>生成桩,获取接口代理类

拷贝生成的类到客户端工程

2、配置客户端的bean

配置文件:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/bindings/soap
http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
">
<jaxws:client id="mobileAddress" address="http://localhost:8080/WebService_CXF_Web/ws/mobile" serviceClass="com.esb.ws.stub.MobileAddress"> </jaxws:client>
</beans>

<3>客户端调用webService

 package com.esb.ws.client;

 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.esb.ws.stub.MobileAddress; public class WebServiceCXFClient {
@Test
public void wsCXFTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml");
MobileAddress mobileAddress = (MobileAddress)context.getBean("mobileAddress");
String result = mobileAddress.getAddressbyMobileNo("181xxxx7433"); System.out.println(result);
} }

当然也可以使用和前面一样的方法(不使用spring获取服务接口代理类)调用webService

package com.esb.ws.client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.esb.ws.stub.MobileAddress; public class WebServiceCXFClient { @Test
public void wdCXFTest2(){
JaxWsProxyFactoryBean ps = new JaxWsProxyFactoryBean(); ps.setAddress("http://localhost:8080/WebService_CXF_Web/ws/mobile");
ps.setServiceClass(MobileAddress.class); MobileAddress mobileAddress = (MobileAddress)ps.create(); String result = mobileAddress.getAddressbyMobileNo("181xxxx7433");
System.out.println(result);
}
}

简单的Demo就是这些了。

jax-ws也可以开发webService,为什么使用CXF

jax-ws的优点,就是jdk自带的,速度较快,但是开发麻烦,比如一些日志功能,web集成功能,以及与spring集成稍微麻烦

CXF可以解决,整合日志拦截器、天生和spring是整合的、还整合了其他一些功能。

作为一个java小白,写写随笔,整理下知识点,积累下知识点。

CXF发布webService服务以及客户端调用的更多相关文章

  1. Spring集成CXF发布WebService并在客户端调用

    Spring集成CXF发布WebService 1.导入jar包 因为官方下载的包里面有其他版本的sprring包,全导入会产生版本冲突,所以去掉spring的部分,然后在项目根目录下新建了一个CXF ...

  2. 使用CXF发布WebService服务简单实例

    一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...

  3. 针对WebService服务,客户端调用时报序列化的最大项数maxItemsInObjectGraph超过65536问题

    今天在使用webservice服务时候,报异常"The InnerException message was 'Maximum number of items that can be ser ...

  4. 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 ...

  5. webservice 针对WebService服务,客户端调用时报序列化的最大项数maxItemsInObjectGraph超过65536问题

    今天在使用webservice服务时候,报异常“The InnerException message was 'Maximum number of items that can be serializ ...

  6. 使用CXF发布webservice服务及注意要点

    一.概念 1.什么是webservice Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用 ...

  7. 使用Cxf发布Webservice服务,如果待发布的接口中有重载方法,怎么处理??

    使用 @WebMethod(operationName="multiParamByName")  重新指定名字. http://bbs.csdn.net/topics/270059 ...

  8. 使用CXF框架,发布webservice服务,并使用客户端远程访问webservice

    使用CXF框架,发布webservice服务,并使用客户端远程访问webservice  1. CXF介绍 :soa的框架    * cxf 是 Celtrix (ESB框架)和 XFire(webs ...

  9. JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务

    1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...

随机推荐

  1. liunx之:解决liunx下dns配置重启失效的问题

    有时候能ping同ip地址,却ping不通域名,这就是dns没有配置的缘故. 但是DNS配置文件 /etc/resolv.conf 每次重启就会失效. 打开这个配置文件,发现有注释提示: Dynami ...

  2. Torch 网络层 参数的初始化问题

    Torch 网络层 参数的初始化问题 参考链接: https://github.com/Kaixhin/nninit 从 Torch 中自带的包,可以看到:https://github.com/tor ...

  3. JSBinding+Bridge.Net:框架代码与逻辑代码的关系

    在JSB+Bridge工程中你可以同时维护Cs版本和Js版本的游戏. 框架代码:简称framework,表示那些不进行热更的代码.注意,这包括你自己写的代码,也包括引用的Dll,比如UnityEngi ...

  4. JSBinding+Bridge.NET:Unity游戏热更新方案

    老版本链接如下:http://www.cnblogs.com/answerwinner/p/4469021.html 新用户不要再使用老版本了. 新版本 JSBinding 将抛弃 SharpKit ...

  5. [转]MySQL Connector/C++(一)

    http://www.cnblogs.com/dvwei/archive/2013/04/18/3029464.html#undefined#undefined MySQL Connector/C++ ...

  6. vector与list区别

    vector为存储的对象分配一块连续的地址空间,因此对vector中的元素随机访问效率很高.在vecotor中插入或者删除某个元素,需要将现有元素进行复制,移动.如果vector中存储的对象很大,或者 ...

  7. JQuery 1.*速成版之二

    过滤选择器简称:过滤器.它其实也是一种选择器,而这种选择器类似与 CSS3(http://t.mb5u.com/css3/)里的伪类,可以让不支持 CSS3 的低版本浏览器也能支持.和常规选择器一样, ...

  8. Python的第二天

    一.while循环语句 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句-- 执行 ...

  9. 【巩固】Bootstrap笔记三

    这段笔记介绍了bootstrp中以下几点应用点: 警告框的使用 面板功能 运用chart.js制作图表 进度条的制作 媒体对象的制作 有一个元素如果有属性alert-dismissible" ...

  10. mysql删造成表死锁研究

    现在互联网公司对于代码的管理越来越规范,一般都会有3个环境:开发环境,测试环境,正式环境.在开发环境进行开发,开发完成后将代码提交到测试环境进行测试,测试完毕后上线到正式环境. 今天在正式环境上遇到一 ...