- 浏览: 1841305 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (665)
- 闲话 (17)
- ruby (1)
- javascript (40)
- linux (7)
- android (22)
- 开发过程 (11)
- 哥也读读源代码 (13)
- JVM (1)
- ant (2)
- Hibernate (3)
- jboss (3)
- web service (17)
- https (4)
- java基础 (17)
- spring (7)
- servlet (3)
- 杂记 (39)
- struts2 (10)
- logback (4)
- 多线程 (2)
- 系统诊断 (9)
- UI (4)
- json (2)
- Java EE (7)
- eclipse相关 (4)
- JMS (1)
- maven (19)
- 版本管理 (7)
- sso (1)
- ci (1)
- 设计 (18)
- 戒烟 (4)
- http (9)
- 计划 (4)
- HTML5 (3)
- chrome extensions (5)
- tomcat源码阅读 (4)
- httpd (5)
- MongoDB (3)
- node (2)
最新评论
-
levin_china:
勾选了,还是找不到
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
我用的maven-3.5.0,还没有遇到这种情况,使用jar ...
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
受益匪浅,从组织项目结构,到技术细节,讲的很到位,只是博主不再 ...
一个多maven项目聚合的实例 -
Aaron-Joe-William:
<?xml version="1.0" ...
hibernate逆向工程 -
li272355201:
http://archive.apache.org/dist/ ...
tomcat源码阅读(一)——环境搭建
最近我们的系统需要和一个第三方系统对接,对接的方式是通过web service,所以就学习了一下这方面的东西
用CXF来做web service是比较简单的,本文就简单介绍一下如何一步步发布web service,以及调用现有的web service。另外如果系统已经使用了Spring MVC,那么引入CXF需要额外的步骤,见本人另外一篇博客http://kyfxbl.iteye.com/blog/1432920。如果展现层没有用spring mvc,而是用struts2之类的,可以省去这一步
首先介绍怎么发布web service:
第1步是创建一个普通的java接口,然后用@WebService注解声明这是一个web service
可以看到,这个接口非常普通,不需要继承什么额外的接口,只需要注解一个@WebService就可以
第2步当然是需要给这个接口提供一个实现类
这个类更加简单,连注解都省了,但是如果这个类实现了不止一个接口,那么就需要加上@WebService注解,不过一般不会这样
第3步就到了cxf出场的时候了,需要在spring配置文件中加上cxf的配置
这里只写了CXF所需的配置,spring配置文件的其他内容已省略。用到的元素是<jaxws:endpoint>,implementorClass属性就是我们提供的实现类,然后address属性是这个web service对外暴露的路径
最后第4步是在web.xml中加载cxf
这里写的比较复杂,是为了兼容spring mvc。这里把/webservice/*作为对外暴露的路径,和上面的web service address要结合起来,比如说http://ip:port/app_name/webservice/HelloWorld,就会指向这个例子里声明的web service接口
通过以上4步,就发布了一个web service,在浏览器里输入http://ip:port/app_name/webservice,就会看到这个sayHi的web service了,并且cxf已经自动生成了wsdl文件
然后介绍一下怎么通过cxf调用已有的web service
第1步是需要“获得”web service的对应接口类,这里的“获得”有多种情况。在条件允许的情况下,比如2个子系统都是自己项目组开发的,或者对方愿意提供,那么直接拷贝过来就可以了。但一般是没有这么方便的。。那么这种情况下,就是wsdl发挥作用的时候了。只要对方发布了web service,就一定会有一个wsdl文件,那么可以根据这个wsdl文件来手写还原java接口类和所需的实体类(比如本例中的User模型类),还有一个办法就是用wsdl2java工具,生成所需的类
在这个例子中,我直接把HelloWorld.java拷贝过来就行了,注意拷贝过来的时候,@WebService注解还是需要的
第2步是配置cxf,这里用到的是<jaxws:client>元素,和上面的<jaxws:endpoint>是对应的
其中serviceClass属性,就是指向HelloWorld所在的位置,address是目标web service的地址,也就是http://ip:port/app_name/webservice/HelloWorld
这里有一个额外的东西,就是把所有的address,放在单独的webservice_address.properties文件里管理,这样如果用到的web service比较多时,可以集中维护,不需要修改spring配置文件
第3步就是执行,十分简单
上面可以看到,首先是启动Spring容器,然后像获取普通的bean一样,用getBean()方法实例化HelloWorld接口,然后直接在其上调用sayHi()方法即可
在这个过程中,CXF对底层的复杂操作进行了封装,包括将实体数据封装成soap格式的消息,然后塞到http的request post里,发送到目标web service。然后从返回的http response中取出soap格式的消息,再反向解析,生成实体对象
用CXF来做web service是比较简单的,本文就简单介绍一下如何一步步发布web service,以及调用现有的web service。另外如果系统已经使用了Spring MVC,那么引入CXF需要额外的步骤,见本人另外一篇博客http://kyfxbl.iteye.com/blog/1432920。如果展现层没有用spring mvc,而是用struts2之类的,可以省去这一步
首先介绍怎么发布web service:
第1步是创建一个普通的java接口,然后用@WebService注解声明这是一个web service
package com.huawei.framework.webservice; import javax.jws.WebService; import com.huawei.framework.model.User; @WebService public interface HelloWorld { String sayHi(User user); }
可以看到,这个接口非常普通,不需要继承什么额外的接口,只需要注解一个@WebService就可以
第2步当然是需要给这个接口提供一个实现类
package com.huawei.framework.webservice; import com.huawei.framework.model.User; public class HelloWorldImpl implements HelloWorld { public String sayHi(User theUser) { return "Hello " + theUser.getName() + " ,your age is " + theUser.getAge(); } }
这个类更加简单,连注解都省了,但是如果这个类实现了不止一个接口,那么就需要加上@WebService注解,不过一般不会这样
第3步就到了cxf出场的时候了,需要在spring配置文件中加上cxf的配置
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="helloWorld" implementorClass="com.huawei.framework.webservice.HelloWorldImpl" address="/HelloWorld" /> </beans>
这里只写了CXF所需的配置,spring配置文件的其他内容已省略。用到的元素是<jaxws:endpoint>,implementorClass属性就是我们提供的实现类,然后address属性是这个web service对外暴露的路径
最后第4步是在web.xml中加载cxf
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="MyFramework" version="3.0"> <display-name>MyFramework</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> WEB-INF/beans.xml, WEB-INF/cxf.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>framework</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>framework</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping> </web-app>
这里写的比较复杂,是为了兼容spring mvc。这里把/webservice/*作为对外暴露的路径,和上面的web service address要结合起来,比如说http://ip:port/app_name/webservice/HelloWorld,就会指向这个例子里声明的web service接口
通过以上4步,就发布了一个web service,在浏览器里输入http://ip:port/app_name/webservice,就会看到这个sayHi的web service了,并且cxf已经自动生成了wsdl文件
然后介绍一下怎么通过cxf调用已有的web service
第1步是需要“获得”web service的对应接口类,这里的“获得”有多种情况。在条件允许的情况下,比如2个子系统都是自己项目组开发的,或者对方愿意提供,那么直接拷贝过来就可以了。但一般是没有这么方便的。。那么这种情况下,就是wsdl发挥作用的时候了。只要对方发布了web service,就一定会有一个wsdl文件,那么可以根据这个wsdl文件来手写还原java接口类和所需的实体类(比如本例中的User模型类),还有一个办法就是用wsdl2java工具,生成所需的类
在这个例子中,我直接把HelloWorld.java拷贝过来就行了,注意拷贝过来的时候,@WebService注解还是需要的
第2步是配置cxf,这里用到的是<jaxws:client>元素,和上面的<jaxws:endpoint>是对应的
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:webservice_address.properties</value> </list> </property> </bean> <jaxws:client id="helloClient" serviceClass="com.huawei.webservice.client.HelloWorld" address="${helloworld}" /> </beans>
其中serviceClass属性,就是指向HelloWorld所在的位置,address是目标web service的地址,也就是http://ip:port/app_name/webservice/HelloWorld
这里有一个额外的东西,就是把所有的address,放在单独的webservice_address.properties文件里管理,这样如果用到的web service比较多时,可以集中维护,不需要修改spring配置文件
第3步就是执行,十分简单
public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "cxf.xml"); HelloWorld client = (HelloWorld) context.getBean("helloClient"); User user = new User(); user.setName("zhengshengdong"); String message = client.sayHi(user); System.out.println(message); } }
上面可以看到,首先是启动Spring容器,然后像获取普通的bean一样,用getBean()方法实例化HelloWorld接口,然后直接在其上调用sayHi()方法即可
在这个过程中,CXF对底层的复杂操作进行了封装,包括将实体数据封装成soap格式的消息,然后塞到http的request post里,发送到目标web service。然后从返回的http response中取出soap格式的消息,再反向解析,生成实体对象
评论
4 楼
kyfxbl
2012-07-31
因为路径不一样,所以这实际上是2个文件
第1个是用户自定义的,WEB-INF/cxf.xml,这个是可以自行命名的
第2个是打在cxf.jar里面的META-INF/cxf/cxf.xml
2个文件都引入了,虽然文件名一样,但是对于spring来说,这是2个文件没有问题
第1个是用户自定义的,WEB-INF/cxf.xml,这个是可以自行命名的
第2个是打在cxf.jar里面的META-INF/cxf/cxf.xml
2个文件都引入了,虽然文件名一样,但是对于spring来说,这是2个文件没有问题
3 楼
lmh_java
2012-07-31
问一下楼主: web.xml文件里的 WEB-INF/cxf.xml 是这个路径, spring配置文件下的引用却是<import resource="classpath:META-INF/cxf/cxf.xml" />
到底是哪个呢?
到底是哪个呢?
2 楼
kyfxbl
2012-04-11
。。。我只能说你帖子都没看完
这就是一个实例,怎么是复制粘贴?你根据这个帖子一步步来,就是完整的服务端和客户端
这就是一个实例,怎么是复制粘贴?你根据这个帖子一步步来,就是完整的服务端和客户端
1 楼
zhenglongfei
2012-04-11
lz 这篇文章网上到出都是,能不能不要复制粘贴,根据自己的理解写一个服务端,然后在写一个客户端来获取服务端的数据,这样的例子很少。
发表评论
-
XML-RPC与web service
2013-06-05 12:44 2135前段时间公司的办公环 ... -
cxf集成spring,精简版
2012-08-15 17:40 2973上次总结了spring集成cxf的方法,不过有些地方说得不清楚 ... -
替换证书,造成bad_certificate
2012-05-14 21:47 5354系统调用外部的web service,走https方式,今天测 ... -
cxf配置http:conduit
2012-05-08 20:16 10866本次项目要通过https方式,调用外部的web service ... -
cxf生成endpoint,使用soap1.1和soap1.2
2012-04-25 23:31 3105开发了一个web service服务,客户居然不认,查看客户发 ... -
cxf配置方式实现日志和https请求
2012-04-21 01:21 7860这篇博客介绍一下怎么通过配置方式配置https和cxf的日志功 ... -
一次艰难的web service对接开发
2012-04-19 23:10 3730这次的需求是将我们的系统与一个客户系统对接,对接的方式是通过w ... -
根据已有的wsdl,开发web service的服务端和客户端
2012-04-11 23:13 18173折腾了好长时间,今天终于把这次web service对接的需求 ... -
用cxf生成的方式,开发web service应用
2012-04-09 23:08 9837这次开发web service对接,用的是cxf2.0.13 ... -
cxf和spring集成的一些事
2012-03-30 20:31 6419环境: cxf-2.1.3,jdk6,jboss7.0.2,s ... -
解决cxf的jar包冲突
2012-03-28 20:23 15927本次做web service开发,遇到了一些问题,最终解决了, ... -
用soapUI调试web service
2012-03-27 21:00 3020用soapUI调试web service是很方便的,可以省掉自 ... -
对web service和cxf的个人理解
2012-02-29 23:59 1843个人理解很粗浅,只是谈谈感受,希望能抛砖引玉。就从本次项目的实 ... -
cxf和spring mvc的集成
2012-02-29 22:27 17800Spring MVC是通过DispatcherServlet来 ... -
我个人理解的什么是web service
2012-01-05 20:26 1816有一些乱七八糟的想法,还不成章法,先记录下来,以后再回头看看 ... -
关于B/S和C/S的想法,兼谈web service
2011-08-24 20:31 3185最近做的这个项目,是 ...
相关推荐
本教程将详细介绍如何利用Spring Boot与CXF进行集成,以发布Web服务并实现用户和密码验证的客户端调用。 首先,我们需要在Spring Boot项目中引入CXF的依赖。这通常通过在`pom.xml`文件中添加对应的Maven依赖来完成...
解压后,你可以通过构建工具(如Maven或Gradle)构建并运行项目,体验CXF发布和调用Web服务的过程。 总结,Apache CXF是一个强大的工具,可以帮助我们轻松地开发和使用Web服务。在这个星座运势接口的例子中,我们...
通过这个项目,开发者不仅可以了解SpringBoot和CXF的基本概念,还能掌握两者如何协同工作,发布和调用Web服务。同时,对于SpringBoot应用的打包、部署和测试也有了一定的认识。这个例子是一个理想的实践项目,对于...
本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个全面的服务开发框架,它支持多种Web服务标准,如SOAP、WS-*协议栈、RESTful服务等。CXF提供了丰富的...
在Java开发中,CXF和Axis是两种广泛使用的Web服务框架。CXF主要用来创建和消费SOAP和RESTful Web服务,而Axis则是Apache组织早期推出的一款Web服务框架,主要用于SOAP服务。本文将深入探讨如何使用CXF客户端调用Axis...
在本实战教程中,我们将深入探讨如何在服务器端使用CXF来发布和调用Web服务接口。 ### 1. CXF框架基础 CXF的核心在于其强大的服务引擎,它允许开发者以Java编程模型来定义服务接口,并自动生成相应的服务实现和...
这通常包括了创建服务接口、实现服务逻辑、配置服务端点、以及发布和调用服务等步骤。源码部分可能包含了示例项目或者完整的框架源代码,用于帮助开发者深入理解其工作原理和内部机制。 【描述】中的"源码"提示我们...
### 使用CXF发布和调用WebService之HelloWorld入门详解 #### 一、概述 本文将详细介绍如何使用Apache CXF框架来实现一个简单的WebService——HelloWorld示例。此示例不仅适用于初学者理解WebService的基本概念,...
2. **动态客户端**:如果WSDL在运行时可用,你可以使用CXF的DynamicClientFactory创建一个动态客户端,它可以在运行时动态地调用Web Service操作。 3. **SOAP UI测试**:在开发过程中,SOAP UI工具是一个很好的测试...
综上所述,Spring、CXF和Mybatis的结合使用,使得我们可以方便地发布和管理Web服务,同时利用Mybatis的强大数据库操作能力,实现了高效的数据访问。这种组合在实际项目中被广泛应用,具有很高的灵活性和可扩展性。...
- **客户端调用**:Spring可以帮助创建CXF的客户端代理,通过`JaxWsProxyFactoryBean`创建服务代理,方便调用Web服务。 4. **使用CXF的Spring支持**: - `cxf-servlet.xml`配置:在Spring配置文件中,设置CXF的...
通过深入研究这个压缩包内的文件,你可以了解到如何在Spring MVC环境中配置和使用CXF来创建和调用Web Service,以及如何处理相关的请求和响应。这将是一个宝贵的学习资源,有助于提升你在企业级Java开发中的技能。
2. 创建服务代理实例:通过代理类,客户端可以创建服务的实例,就像调用本地对象一样调用Web服务方法。 3. 参数传递与调用:设置方法参数并执行服务调用,CXF会处理底层的SOAP消息交换。 4. 处理响应:获取服务返回...
总的来说,Java调用Web Service涉及到多个环节,从理解协议和标准,到选择合适的工具和框架,再到实际的编码和测试,每个步骤都需要开发者具备扎实的理论基础和实践经验。通过以上知识点的学习和实践,你将能够熟练...
Ⅲ)使用EndPoint类的静态方法publish()来发布web service。 2、客户端 Ⅰ)调用CXF提供的wsdl2java工具,根据WSDL文档生成相应的Java代码(任何语言实现web service都要暴露WSDL文档); Ⅱ)找到wsdl2java所...
在Java世界中,Apache CXF是一个广泛使用的开源框架,用于构建和部署Web服务。它提供了丰富的功能,包括SOAP、RESTful API的支持,以及与Spring框架的深度集成。本篇文章将深入探讨CXF与Spring的结合,以及如何创建...
6. 最后,编写客户端代码,使用生成的代理类调用Web服务。 总的来说,Apache CXF为Web服务开发提供了强大的支持,结合Maven和Eclipse,可以极大地提高开发效率。通过学习和实践,你可以深入了解Web服务的原理,并...