协同工作之WebService
来源:互联网 发布:错题本软件 编辑:程序博客网 时间:2024/05/21 06:41
首先,先来看看两个简单的词汇:CXF、WSDL
一、CXF
Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
特点:灵活部署、支持多种编程语言、代码生成
链接:http://baike.baidu.com/view/2742297.htm
二、WSDL
Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML语言。为用户提供详细的接口说明书。
WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。
功能:怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。
链接:http://baike.baidu.com/view/160660.htm
然后,我们一起来实现一个简单的webservice吧
开发前准备
CXF下载地址:http://cxf.apache.org/download.html
此时最精简的cxf包如下:()
commons-logging-1.1.1.jar
cxf-2.6.2.jar
geronimo-jaxws_2.2_spec-1.1.jar
jaxb-api-2.2.6.jar
neethi-3.0.2.jar
org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar
org.springframework.aop-3.1.1.RELEASE.jar
org.springframework.asm-3.1.1.RELEASE.jar
org.springframework.beans-3.1.1.RELEASE.jar
org.springframework.context-3.1.1.RELEASE.jar
org.springframework.core-3.1.1.RELEASE.jar
org.springframework.expression-3.1.1.RELEASE.jar
org.springframework.web.servlet-3.1.1.RELEASE.jar
org.springframework.web-3.1.1.RELEASE.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.1.jar
这时万事具备,只差着手开发
总体包图:
step one ——
server端:
1、CaribbeanWorld.java
package demo.czd.spring.server;import javax.jws.WebService;/** * @author cai_zedong, 2013-10-15 上午10:03:26 */@WebServicepublic interface CaribbeanWorld {String sayYeahHeyJude(String text);}
2、CaribbeanWorldImpl.java
package demo.czd.spring.server;import javax.jws.WebService;/** * @author cai_zedong, 2013-10-15 上午10:07:04 */@WebService(endpointInterface = "demo.czd.spring.server.CaribbeanWorld")public class CaribbeanWorldImpl implements CaribbeanWorld {public String sayYeahHeyJude(String text) {return "Yep" + text;}}
3、beans.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"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.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-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> --><bean id="jaxWsServiceFactoryBean" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"><property name="wrapped" value="true" /><property name="dataBinding" ref="aegisBean" /></bean><bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" /><jaxws:endpoint id="CollectiveServices" implementor="demo.czd.spring.server.CaribbeanWorldImpl" address="/CaribbeanWorld"><jaxws:serviceFactory><ref bean="jaxWsServiceFactoryBean" /></jaxws:serviceFactory></jaxws:endpoint></beans>
4、web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>CXFServlet<rvlet-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
step two——
client端:
1、ClientTest.java
package demo.czd.spring.client;import static org.junit.Assert.assertEquals;import org.apache.cxf.aegis.databinding.AegisDatabinding;import org.apache.cxf.frontend.ClientProxyFactoryBean;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;import demo.czd.spring.server.CaribbeanWorld;/** * @author cai_zedong, 2013-10-15 上午10:41:39 */public final class ClientTest {private static ClassPathXmlApplicationContext context;@BeforeClasspublic static void beforeClass() {context = new ClassPathXmlApplicationContext(new String[] { "demo/spring/client/client-beans.xml" });}@AfterClasspublic static void afterClass() {context = null;}@Testpublic void testSayYepWithSpringConfig() throws Exception {CaribbeanWorld client = (CaribbeanWorld) context.getBean("client");String response = client.sayYeahHeyJude("Joe");assertEquals("Hello Joe", response);}/** * * @throws Exception */@Testpublic void testSayHiByCode() throws Exception {ClientProxyFactoryBean factory = new ClientProxyFactoryBean();factory.setServiceClass(CaribbeanWorld.class);factory.setAddress("http://localhost:8080/demo.czd.spring/server/CaribbeanWorld");factory.getServiceFactory().setDataBinding(new AegisDatabinding());CaribbeanWorld client = (CaribbeanWorld) factory.create();assertEquals("Hello Joe", client.sayYeahHeyJude("Joe"));}}
2、client-beans.xml(testSayYepWithSpringConfig()中需要使用的配置文件)
<?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.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"><bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" /><bean id="serviceFactoryBean" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"><property name="dataBinding" ref="aegisBean" /></bean><bean id="client" class="demo.spring.czd.server.CaribbeanWorld" factory-bean="clientFactory" factory-method="create" /><bean id="clientFactory" class="org.apache.cxf.frontend.ClientProxyFactoryBean"><property name="serviceFactory" ref="serviceFactoryBean" /><property name="serviceClass" value="demo.spring..czd.server.CaribbeanWorld" /><property name="address" value="http://localhost:8080/demo.czd.spring/server/CaribbeanWorld" /></bean></beans>
step three——(S_发布)
编写开发完毕,启动Tomcat,关注有无报错信息,成功加载运行之后的界面是这样的:
点击图中超链接 WSDL : http://server.spring.czd.demo/}CaribbeanWorldImplService
step four——(C_回调)
在命令行输入命令 wsimport -p [包名] -keep [发布的服务地址?wsdl] 生成客户端代码,如生成本例的客户端代码”wsimport -p demo.czd.spring.client -keephttp://localhost:8080/WSServer4czd/CaribbeanWorld?wsdl“,当然,前提是你已经配好了JAVA环境变量。控制台会显示
这个时候就可以调用客户端了,上图所示
step five——
拷贝在tomcat中webapps底下编译生成的.java文件到工程目录下
写上一段执行代码,用javaApplication跑一个,输出以下,即是成功了(代码贴在由cxf生成的包里面,文件名如:CaribbeanWorldImplService.java)
... ...
问题:主要一些包的命名规范以及jar包的准确引入,配置文件的时候注意相关版本号即可了
转:知识积累
小哥献丑,请大伙多多斧正~
- 协同工作之WebService
- WebService之工作原理 一
- 如何在delphi下和.net建立的webservice 进行协同工作
- Git协同工作之——非快进式推送
- Cocos2d-x 之使用 TexurePacker+Cocos Studio 协同工作
- 与触发器协同工作
- 协同工作模式
- 多线程协同工作代码
- git协同工作
- git gitlab协同工作
- GIT工作协同
- GitHub协同工作
- elipse与jbuilder协同工作
- 协同工作平台功能说明书
- CppCMS和Nginx协同工作
- Git与Ftp协同工作
- Oozie 与 Yarn 协同工作
- gitlab多人协同工作
- 提高sql效率的方法
- Cocos2d-x 动作之动作原理——动作类的结构
- Full Description of the compilation of Scilab
- LeetCode:Subsets
- android知识点
- 协同工作之WebService
- oracle wm_concat(column)函数
- IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍
- android利用JNI调用C++自定义类
- .net安全上传图片
- Raspberry Pi 摄像头模块应用程序文档翻译
- iOS绘图教程
- 动态库*.so制作-linux 嵌套动态库
- Cocos2d-x 动作之动作原理——动作的更新