其实开发服务端, 大体分为2种方式:
一: 采用jdk给我们提供的jas-ws中的服务类来发布服务
二: 采用第三方框架来开发webservice.
那么为什么我们要选择第三方框架来发布一个webservice服务呢?
首先, 我们开发的项目大部分都是javase项目, jdk不能用于javaee项目的开发. 
并且jdk目前仅仅支持soap1.1协议. 不支持soap1.2协议 而为了客户端调用时能使用1.1协议, 也能使用1.2协议.
通常我们发布的服务都是1.2协议的.
下面, 就说下cxf开发服务端, 以及开发客户端的最佳实践.
一: 利用cxf开发web服务端的最佳实践
在web.xml中配置cxfservlet共有3种方式:
1: 使用默认的配置文件
如果在配置cxfservlet的时候, 没有指定cxf配置文件的位置. cxf默认会到WEB-INF目录下去找一个叫cxf-servlet.xml的文件.
不过这种方式很少很少使用...(我至今没有发现有人采用这种方式的)
2: 配置cxfServlet的初始化参数指定配置文件(这种方式偶尔会用)
它存在2个问题: 一个是,servlet默认是在第一次访问的时候才会进行初始化, 这个时候才会去读取配置文件, 加载spring容器. 这就导致了第一次访问的时候速度太慢.
不过这个问题呢, 可以通过配置load-on-startup让cxfservlet在web容器启动的时候就去初始化, 从而避免了第一次访问速度太慢的问题.
第二个问题是, 我们开发常用ssh框架中, 已经在web.xml中配置了spring容器的监听器, 又在cxfservlet中配置, 会导致加载2次.
当然, 你也可以去掉spring的加载监听器.. 不过不建议使用.
3: 依赖spring的初始化监听器
这个方式是最常用的. 上代码

 1 <!-- 配置spring的文件位置 --> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value>classpath:applicationContext.xml</param-value> 5 </context-param> 6 7 <!-- 配置spring的容器监听器 --> 8 <listener> 9 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
10 </listener>
11
12 <!-- 配置cxf核心servlet -->
13 <servlet>
14 <servlet-name>CXFServlet</servlet-name>
15 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
16 <load-on-startup></load-on-startup>
17 </servlet>
18
19 <servlet-mapping>
20 <servlet-name>CXFServlet</servlet-name>
21 <url-pattern>/cxf/*</url-pattern>
22 </servlet-mapping> 

那么spring的配置文件到底该如何写呢?
在这之前, 先说下服务分类, 服务分为带接口的服务和不带接口的服务.
通常我们发布的服务都是带接口的服务, 如下:

 1 @WebService // 这个注解必须写, 否则服务中没有操作 2 @BindingType(SOAPBinding.SOAP12HTTP_BINDING)// 发布1.2soap协议 3 public interface IHiService { 4 5 String sayHi(String name); 6 }7 8 [java] view plaincopyprint?在CODE上查看代码片派生到我的代码片9 public class HiServiceImpl implements IHiService {
10
11 public String sayHi(String name) { 12 13 System.out.println("HiServiceImpl.sayHi()"); 14 return "hi " + name; 15 } 16 17 } 

在spring配置文件中发服务,如下:

<!-- 导入cxf需要的xml文件 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- 发布带接口的服务 -->
<jaxws:server id="hi" serviceClass="com.cxf.service.IHiService" serviceName="hiWS" address="/hi">
<jaxws:serviceBean>
<bean class="com.cxf.service.impl.HiServiceImpl"></bean>
</jaxws:serviceBean>
</jaxws:server>

至此服务端开发完毕.
二:利用cxf开发web客户端
注意这里是web客户端, 不是javase项目;
如果是javase项目,就 采用httpUrlConnection ,或者wsimport,或者手动构造soap请求协 等来进行开发.
如果是web项目, 最常用的发放有以下2种:
1: 利用spring的factory工厂来注入服务
2:利用cxf的标签来注入服务
不过这2种方法之前, 都需要使用wsimport, 或者wsdl2java命令, 获得web服务的接口.
获得接口如下:

 1 /** 2 * This class was generated by Apache CXF 2.4.0 3 * 2014-11-06T16:36:06.034+08:00 4 * Generated source version: 2.4.0 5 * 6 */ 7 8 @WebService(targetNamespace = "http://service.cxf.com/", name = "IHiService") 9 @XmlSeeAlso({})
10 public interface IHiService {
11
12 @WebResult(name = "return", targetNamespace = "")
13 @RequestWrapper(localName = "sayHi", targetNamespace = "http://service.cxf.com/", className = "com.cxf.service.SayHi")
14 @WebMethod 15 @ResponseWrapper(localName = "sayHiResponse", targetNamespace = "http://service.cxf.com/", className = "com.cxf.service.SayHiResponse") 16 public java.lang.String sayHi( 17 @WebParam(name = "arg0", targetNamespace = "") 18 java.lang.String arg0 19 ); 20 } 

然后, 再在spring的配置文件中配置:

 1 <!-- 方式一:使用jaxws:client来获得webservice服务 --> 2 <jaxws:client id="hiService" address="http://localhost:8080/cxf_javaee_0100_server/cxf/hi" serviceClass="com.cxf.service.IHiService"> 3 </jaxws:client> 4 5 6 <!-- 方式二: 使用spring的bean factory来获得webservice服务 --> 7 <bean id="hiService2" class="com.cxf.service.IHiService" factory-bean="webServiceFactory" factory-method="create"></bean> 8 9 <bean id="webServiceFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
10 <property name="address" value="http://localhost:8080/cxf_javaee_0100_server/cxf/hi"></property>
11 <property name="serviceClass" value="com.cxf.service.IHiService"></property>
12 </bean> 

方式一和方式二相比, 明显是方式一更加方便啊..
最后, 再启动spring容器来获得web服务, 然后调用服务了

1 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
2 IHiService hiService = (IHiService) context.getBean("hiService");
3 System.out.println(hiService.sayHi("aa"));
4
5 IHiService hiService2 = (IHiService) context.getBean("hiService2");
6 System.out.println(hiService2.sayHi("bb"));

控制台就会输出:
hi aa
hi bb

原文地址:http://blog.csdn.net/wangfeiing/article/details/40864301

转载于:https://www.cnblogs.com/maiyu-d/p/4194044.html

cxf开发基于web的webservice项目(转载)相关推荐

  1. 一个强大的开源的基于Spring Boot开发的Web支付系统项目,支持聚合码支付

    一个强大的开源的基于Spring Boot开发的Web支付系统项目,支持聚合码支付.

  2. cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务

    cxf 服务端soap报文 在上一篇文章中,我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤. 在本文中,我将讨论使用CXF开发SOAP Web服务. 在继续前进之前,让我们先 ...

  3. 使用Apache CXF开发SOAP Web服务

    在上一篇文章中,我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤. 在本文中,我将讨论使用CXF开发SOAP Web服务. 在继续前进之前,让我们了解构成SOAP Web服务的 ...

  4. 使用Apache CXF开发REST风格的WebService

    使用Apache CXF开发REST风格的WebService REST的概述: REST(表现层状态转化),是一种新的软件架构风格,它以资源为核心,使用http,url,xml以及html等流行协议 ...

  5. LabVIEW开发基于Web数字图像处理

    LabVIEW开发基于Web数字图像处理 数字图像处理已在各个领域找到了应用,并已成为一个高度活跃的研究领域.实际实施和实验在教育和研究活动中起着不可或缺的作用.为了方便快捷地实施数字图像处理操作,设 ...

  6. Android 项目开发 基于Web Service 服务的中英翻译软件(三) Web Service服务 Ksoap2 项目...

    关于Web Service Android 应用通常是运行手机平台上,手机系统的硬件资源远远比不上PC平台,不管是存储能力还是计算能力,在Android平台上运行一些小的应用时可能的,但对于需要进行大 ...

  7. 用cxf编写基于spring的webservice之上篇

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010741376/article/details/48517561 用CXF编写基于spring的 ...

  8. 用cxf开发restful风格的WebService

    我们都知道cxf还可以开发restful风格的webService,下面是利用maven+spring4+cxf搭建webService服务端和客户端Demo 1.pom.xml <projec ...

  9. spring整合cxf开发rest风格的webservice接口(客户端服务端)

    前面文章记录了在spring中如何整合cxf开发webservice客户端和服务端,其实,相较于原生开发方式,已经有了不少优化.rest风格的开发,作为一种极为流行的开发规范,可以帮助我们更加简洁高效 ...

最新文章

  1. zigzag算法_面经| 各大厂秋招算法工程师面经!你想了解的都在这里!
  2. 安装Eclipse ADT插件时遇到的问题
  3. java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException 异常解决方案
  4. php 安全上传图片,php 图片上传安全探讨
  5. 【Flutter】Flutter 混合开发 ( 简介 | Flutter 混合开发集成步骤 | 创建 Flutter Module )
  6. 基于FPGA的智能PID控制器的设计与实现
  7. IAR之函数和变量的绝对地址定位
  8. linux中xjvf指令,linux解压缩命令小结
  9. floyd判环算法(龟兔赛跑算法)
  10. 作者:王雨华(1970-),男,中国科学院昆明植物研究所研究员、副所长
  11. gulp压缩css文件夹,使用 gulp 压缩 CSS
  12. java五层架构_Web五层架构
  13. VC++ (MFC)调用 C#生成DLL的两种方法
  14. linux添加引导菜单,为CentOS 7添加win7的引导菜单(king测)
  15. java 文件存在 却找不到文件_当文件确实存在时,ProcessBuilder给出“找不到文件”异常...
  16. 软件备份(拷贝构造函数)
  17. 彩色数字图像处理基础
  18. win10安装(U盘启动)
  19. 2019杭电多校Problem 5 Snowy Smile题解
  20. 计算机硬件系统的主要性能指标

热门文章

  1. 求整数的位数及各位数字之和 (15 分)
  2. 7-2 数组元素循环右移问题 (40 分)
  3. php报错怎么改,php 怎么设置报错级别 和 控制报错[转]
  4. 状态管理技术~~Session
  5. 列车时刻管理c语言程序设计,列车时刻表信息管理系统实践报告C语言源代码
  6. springmvc的过程及源码初涉
  7. Web中树形数据(层级关系数据)的实现—以行政区树为例
  8. 浅析MySQL二进制日志
  9. Visual Studio 跨平台開發實戰(5) - Xamarin Android 多頁面應用程式開發 (转帖)
  10. jQuery 时间获取扩展