《在Eclipse上使用XFire开发WebService15489.pdf》由会员分享,可在线阅读,更多相关《在Eclipse上使用XFire开发WebService15489.pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在 Eclipse 上使用 XFire 开发 WebService Web Service 概述 什么是 Web Service Web Service 是能够基于网络,尤其是基于万维网(World Wide Web)直接调用的能够处理离散任务或连续任务的软件模型。目前较为流行的应用是,由一家公司对其专有数据进行封装,提供 Web Service,然后其它公司就可以通过 Internet 来动态使用这些在线服务。这为未来全球的电子商务发展提供了新的标准和架构。Web Service 架构 Web Service 是独立的、模块化的应用,能够通过因特网来描述、发布、定位以及调用。在 Web Se
2、rvice 的体系架构中包括三个角色:服务提供者(Service Provider)、服务请求者(Service Requestor)、服务注册器(Service Registry)。角色间主要有三个操作:发布(Publish)、查找(Find)、绑定(Bind)。下图清楚的描述了三种角色,以及角色之间的作用关系。图示一:图示二:这个流程图显示了 Web Services 中的核心技术是如何工作的。这里,Provider 是提供服务的应用程序组件,Requester 是使用服务的客户端程序。很多其他技术也会参与到交互中,但是这个图只显示了在Web Services 环境中必需的核心技术组件。W
3、eb Service 协议标准 简单对象访问协议(SOAP)SOAP 是 Simple Object Access Protocol 的缩写,是一种基于 XML 的不依赖传输协议的表示层协议,用来在分散或分布式的应用程序之间方便地以对象的形式交换数据。在 SOAP 的下层,可以是 HTTP/HTTP,也可以是 SMTP/POP3,还可以是为一些应用而专门设计的特殊的通信协议。SOAP 包括三个主要部分:SOAP 封装结构:定义了一个整体框架,以表示消息中包含什么内容,谁来处理这些内容以及这些内容是可选的或是必需的。SOAP 编码规则:定义了用以交换应用 程序定义的数据类型的实例的一系列机制。S
4、OAP RPC 表示:定义了一个用来表示远程过程调用和应答的协定。Web Service 描述语言(WSDL)WSDL 是 Web Service Des cription Language 的缩写,该语言将网络服务定义成一个能交换消息的通信端点集,为分布式系统提供了帮助文档,同时也可作为自动实现应用间通信的解决方案。统一描述、发现和集成协议(UDDI)UDDI 是一套基于Web 的、分布式的、为 Web Service 提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的 Web Service 注册,以使别的企业能够发现的访问协议的实现标准。以上概念转自 http:/ X
5、Fire XFire 是一个免费的开源 SOAP 框架,它不仅可以极大方便地实现这样一个环境,并且可以提供许多 Web Services规 范 中 高 级 特 征,这 些 特 征 在 多 数 的 商 业 或 者 开 源 工 具 都 没 有 提 供。http:/xfire.codehaus.org/Download 是它的官方网站下载区,同时你也可以了解关于它的更多内容。创建过程示例 下面我们就来使用Java 构建一个 WebService 并且构建一个客户端来测试访问它。首先请确保你的 JDK 和 Tomcat 在 Eclipse 环境中是可用的,配置方法不做赘述。并且你了解一些java编程技
6、术和 tomcat 的发布常识。版本信息:MyEclipse6.0.0M1;Tomcat6.0;JDK1.5;Xfire1.2 1、打开 MyEclipse 新建一个 WebService Project,为你的项目命名,我选择了 Java EE5.0,项目在你的WorkSpace 目录下。下一步:看到了这个界面 在这里 Eclipse 为你创建了webService 的配置文件 services.xml(主意文件名是有“s”的),并进行了 Xfire的 Servlet 基本配置告诉项目你使用了 Xfire 改信息将体现在项目的 web.xml 文件中。继续下一步,加载Xfire 相关的 ja
7、r 包,你看到了 在这个项目里我勾选了Xfire1.2 Core Libraries;HTTP Client Libraries;XML Beans Libraries。主要是确保引入了这些包包:?activation-1.0.2.jar?commons-codec-1.3.jar?commons-httpclient-3.0.jar?commons-logging-1.0.4.jar?jaxen-1.1-beta-8.jar?jdom-1.0.jar?log4j-1.2.x.jar?mail-1.3.3_01.jar?spring-1.2.x.jar?stax-api-1.0.jar?wsd
8、l4j-1.5.2.jar?wstx-asl-2.9.jar?xbean-2.1.0.jar?xbean-spring-2.2.jar?xfire-all-1.0.jar?XmlSchema-1.0.jar 如果你好奇其他的包包是做什么用的就有待于我们在今后的学习中继续探究了点击“Finish”完成了项目创建。目录结构如下图所示:打开 web.xml 我们可以看到如下片断:xml 代码 1.2.XFireServlet 3.org.codehaus.xfire.transport.http.XFireConfigurableServlet 4.0 5.6.7.XFireServlet 8./s
9、ervices/*9.10.11.index.jsp 12.13.接下来的工作是开始编写 java 类接下来我们要写一个服务端 java 类。模拟应用是一个银行转账应用,从账户 A转账到账户B 并需要给出金额和货币种类。我们先来实现一个接口IBankingService.java 代码全文如下:java 代码 1.package com.mybank.xfire.example;2.3.public interface IBankingService 4.5.public String transferFunds(6.String fromAccount,String toAccount,do
10、uble amount,String currency);7.8.9.然后编写一个普通的 Java 类 BankingService 包含了一个叫做 transferFunds()的方法来为我们完成这项工作。它需要四个输入参数:1、String fromAccount 2、String toAccount 3、double amount 4、String currency 代码如下:java 代码 1.package com.mybank.xfire.example;2.3.import java.text.NumberFormat;4.import java.text.DecimalForm
11、at;5.6.public class BankingService implements IBankingService 7.8./Default constructor.9.public BankingService()10.11.12./*Transfers fund from one account to another.13.*/14.public String transferFunds(15.String fromAccount,String toAccount,double amount,String currency)16.17.String statusMessage=;1
12、8.19./调用业务逻辑执行操作.20./建立并返回状态信息.21.try 22.NumberFormat formatter=new DecimalFormat(#,#,#,#.00);23.statusMessage=COMPLETED:+currency+formatter.format(amount)+24.was successfully transferred from A/C#+fromAccount+to A/C#+toAccount;25.catch(Exception e)26.statusMessage=BankingService.transferFunds():EXC
13、EPTION:+e.toString();27.28.return statusMessage;29.30.31.32.你可以看到 BankingService 是一个普通的 Java 类,没有任何代码告诉我们它将会在 Web Services 中使用。只是要有默认的构造函数,类型是public。这是必须的。否则,XFire 不能够初始化这个类。好的,这里我们不需要增加任何东西。我们所有的工作都在部署描述符里完成。Web应用的部署描述符 在 Java 中,Web 应用程序通常需要至少一个部署描述符(叫做 web.xml)对其进行配置。XFire 本身是一个基于 servlet 的应用程序。因此
14、,我们需要增加必要的引用到描述符文件中。然后我们还必须配置将要创建的 Web Services。我们使用一个称为 services.xml 的新文件来完成这件事。在使用 Eclipse 工具构建工程的时候我们已经完成了这项配置(参见(上)文)。services.xml 现在我们不得不说一下我们的 Web Services 的由什么组成的了。这由一个叫做 services.xml 的文件完成,当这个项目在 tomcat 发布后,它存放在 WEB-INF/classes/META-INF/xfire目录下,它在 Web 应用程序的标准类路径中。而在 Eclipse 环境中我们可以清除的看到Ecli
15、pse 已经为我们把它清楚的列在项目路径中。这里是services.xml 中的基本配置条目:xml 代码 1.2.3.4.Banking 5.mybank .mybank.xfire.example.IBankingService .mybank.xfire.example.BankingService 8.9.10.Web Services 的定义包含在元素中,它还含有一些子元素。第一个子元素是 Banking,它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如,在服务准备好以后,你将在浏览器上使用这个名字来查看 WSDL。下一个子元素是。任何合法的XM
16、L 名字都是可以的。用来唯一标识你的服务的各个参数。(注释)注释:Namespace派什么用?namespace的作用是要避免命名冲突。如果我建立一项Web Service,其中的WSDL文件包含一个名为foo的元素,而你想要使用我的服务与另一项服务连接作为补充,这样的话另一项服务的WSDL文件就不能包含名为foo的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时,才可以取相同的名字。如果有了表示区别的namespace,我的网络服务里的foo就可以表示完全不同于另一个网络服务里foo的含义。在你的客户端里,你只要加以限制就可以引用我的foo。元素包含了 Java 类的名字,它指
17、定了方法签名。在我们的例子中,它是接口 IBankingService。如果 Java类没有实现任何接口,你就需要把类的名字放在这里。在你的Java 类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。保存了实现方法的 Java 类名。这是一个可选元素。如果上一个元素包含了一个接口,那么相应的实现类必须在这里指定。就是这样。我们的 Web Services 配置完成了。我们如何知道 Web Service 正在工作呢?为了了解 Web Service 是否正在工作,我们需要测试。首先,我们测试来看 WSDL 是否可用。我们在浏览器中输入 URL。哪个 URL?因
18、为我们的应用程序的 war 文件是aa.war,并且在services.xml 中给出的服务名是 Banking,WSDL 的 URL 应该是:http:/localhost:8080/aa/services/Banking?wsdl。请注意:URL 的第一部分,例如,http:/localhost:8080,可能会根据你的应用服务器不同而不同。无论怎样,当你输入 URL 后,将会看到一个XML 文档,这个文档叫做服务的WSDL。如果你看到了,这就是你的应用作为 Web Service 已经可用的第一个证明。正确的执行情况:在这个 WSDL 中我们可以看到的服务方法明以及他的四个参数描述等信息
19、。但是这个测试是不够的。可能会发生这种情况,可以看到WSDL,但是从客户端程序可能会访问不到服务。因此为了核实服务是否可以访问了,我们必须使用一个客户端进行服务的实际调用来进行一个真正的测试。开发一个客户端 编写 BankClient.java java 代码 1.package com.mybank.xfire.client;2.3.import .MalformedURLException;4.import org.codehaus.xfire.XFire;5.import org.codehaus.xfire.XFireFactory;6.import org.codehaus.xfir
20、e.client.XFireProxyFactory;7.import org.codehaus.xfire.service.Service;8.import org.codehaus.xfire.service.binding.ObjectServiceFactory;9.10.import com.mybank.xfire.example.IBankingService;11./*12.*author AdminiDD 13.*14.*/15.public class BankClient 16.17./*18.*param args 19.*/20.public static void
21、main(String args)21./TODO Auto-generated method stub 22.23.24./*Call the Web service 25.*26.*/27.public String callWebService(28.String fromAccount,String toAccount,double amount,String currency)29.throws MalformedURLException,Exception 30.31./Create a metadata of the service 创建一个 service 的元数据 32.Se
22、rvice serviceModel=new ObjectServiceFactory().create(IBankingService.class);33.System.out.println(callSoapServiceLocal():got service model.);34.35./Create a proxy for the deployed service 为 XFire 获得一个代理工厂对象 36.XFire xfire=XFireFactory.newInstance().getXFire();37.XFireProxyFactory factory=new XFirePr
23、oxyFactory(xfire);38./得到一个服务的本地代理 39.String serviceUrl=http:/127.0.0.1:8080/wstest/services/Banking;40.41.IBankingService client=null;42.try 43.client=(IBankingService)factory.create(serviceModel,serviceUrl);44.catch(MalformedURLException e)45.System.out.println(WsClient.callWebService():EXCEPTION:+
24、e.toString();46.47.48./Invoke the service 调用服务 返回状态结果信息 49.String serviceResponse=;50.try 51.serviceResponse=client.transferFunds(fromAccount,toAccount,amount,currency);52.catch(Exception e)53.System.out.println(WsClient.callWebService():EXCEPTION:+e.toString();54.serviceResponse=e.toString();55.56.
25、System.out.println(WsClient.callWebService():status=+serviceResponse);57.58./Return the response 59.return serviceResponse;60.61.62.63.编写两个 JSP 页来模拟请求和响应 index.jsp;发送请求&13;&10;&13;&10;java 代码 1.2.3.4.-/W3C/DTD HTML 4.01 Transitional/EN 5.6.7.8.9.10.pragma content=no-cache 11.cache-control content=no
26、-cache 12.expires content=0 13.keywords content=keyword1,keyword2,keyword3 14.description content=This is my page 15.16.17.18.19.Welcomle to WebService!20.21.Bank test:give my money to you!22.form1 action=say.jsp method=POST 23.your account ID:toAcc type=text/24.How much do you want:amount type=text
27、/25.centersubmit value=提交 26.27.28.29.say.jsp,接收请求并返回响应结果 java 代码 1.2.3.4.5.-/W3C/DTD HTML 4.01 Transitional/EN 6.7.8.9.10.11.12.pragma content=no-cache 13.cache-control content=no-cache 14.expires content=0 15.keywords content=keyword1,keyword2,keyword3 16.description content=This is my page 17.18.
28、19.20.21.22.Welcomle to WebService!23.24.Message from WebService:25.26.27.项 目aa编 译 完 毕 并 发 布 到Tomcat上,启 动Tomcat测 试 开 始!访 问http:/127.0.0.1:8080/aa/index.jsp 执行效果:添上你的账户,想要多少钱就写多少钱,嘿嘿 提交!请求转发到 say.jsp 如果你看到下面的情况:恭喜你!成功啦 可以看到有 RMB$1,000.00 从 affman(a fit foolish man)的账户转到了liudan 的账户上!总结:基本的 Web Service
29、s 开发步骤清单 这个清单总结了将一个Java 方法发布为 Web Service 所必须的步骤:o 1、检查 Java 类的方法和默认构造函数确保为 public o 2、增加 XFire servlet相关条目到web.xml 中 o 3、创建 services.xml,把它放到 WEB-INF/classes/META-INF/xfire 目录下 o 4、增加 XFire 和第三方包到你的 Web 应用的 WEB-INF/lib 文件夹中 嗯确实不复杂!以上步骤均经过亲自测试执行,如有勘误请至 mail to: 欢迎指教和共同探讨 以下相关讨论(转自原文http:/ 的其他高级特性 XF
30、ire 的使用可能比较简单,但是在特性和功能性上,它却占据着领导者的位置。下面是它的高级特性:o -本地数据绑定支持 POJOs(plain-old Java objects)、XMLBeans、JAXB(Java Architecture for XML Binding)、Castor 等等。数据绑定说明了 Web Services 的 XML 请求和映射到 Java 对象的 XML 响应。o -使用 StAX(Streaming API for XML)处理 XML 文档。同 DOM 的基于树和 SAX的事件驱动的处理方式相比,StAX使用了拉(pull)机制,它使处理更快速,内存效率更高
31、。o -支持多种传输协议,如 HTTP、JMS(Java Message Service)和 JVM内部传输。o -嵌入式,这是 XFire 的核心功能之一。你可以把这个 SOAP 引擎嵌入到你的应用中,完全隐藏所有 XFire 特定引用,同样所有配置都是程序驱动。o -丰富的 API,它使 XFire 可高度自定义,允许开发者在不同的阶段截获请求,并且对他们进行处理。o -兼容最新的标准例如 SOAP1.1(没有加密远程工程调用,或者 RPC)和 1.2、WSDL1.1、the Web Services Interoperability Organizations Basic Profile
32、 1.0、Web Services Addressing 和 WS-Security。最重要的是,XFire 属于新一代 Web Services 引擎。不仅仅是营销用语,“新一代”有一些重要的意义。Apache Axis 是第一代 Java 语言的 Web Services 引擎,已经成为了所有后来工具的参考标准。在过去的几年里,Axis 以及这些其它的工具已经在很多生产环境中进行了实地测试。从中得出的一个关键的问题就是 Web Services 并不最适合 RPC 类型的通信。对于性能和效率,面向文档的消息形式是最好的方式。但是Apache Axis 和很多其他的 Web Services
33、 引擎都被设计成了面向 RPC 的(尽管它们支持文档形式)。现在,整个行业正在开发新一代的 SOAP 引擎,设计为面向文档的。Apache 已经宣布结束旧版本的 Axis 引擎开发,现在专注于 Axis2,现在它的预发布版本是 0.95。XFire 在今年的 2 月份发布了它的第一个产品版本(1.0)。它的下一个版本(1.1)仅仅在几个星期之后就进行了发布。局限性 XFire 有些重要的局限性你应该清楚:o -开发Web Services 的好的实践是从WSDL 开始。大部分的 SOAP 引擎提供了从WSDL 生成服务 stub 的工具。XFire 也提供了这样一个工具。但是它是基于注释(an
34、notations-based)的,因此需要 J2SE5.0。对于仍坚持使用 J2SE1.4.x 的人来说,它不是一个令人拍手叫好的工具,因为我们有很多其他方式来编写客户端,一个就是文章中演示的方式。o -附件支持,它将会包含在未来发行的版本中。o -易于学习的用户向导。XFire 团队在这个方面还有很多工作需要做。结论 Java 当前的趋势是简化技术的使用。因此,我们正看到一波基于 POJO 的开发成就。同时,面向服务架构(SOA,Services-oriented architecture)和 Web Services 已经变成了当前行业的热点话题。XFire 正是在这种情况下产生的。它能
35、够使 POJO 发布为最少的 Web Services,而只需要付出最小化的努力。从而,它使希望使用这项技术的初级开发者的学习曲线变得平缓。同时,由于它兼容最新标准和提供了丰富的 API,XFire 为高级用户提供了更多的大好机会。终于,使用 Java完成了一个 WebService的例子,其中的一个非常小的问题,折腾了我将近一天的时间。下面给出步骤,说明在Java平台上如何开发 WebService。采用的工具:Eclipse3.1.2+Tomcat5.5+XFire1.1。使用 XFire开发 WebService应该说非常的容易,只需要按照下面例子的步骤来做:(1)在Eclipse中新建
36、一个dynamic Web Project,假设名为XFireZhuweiTest。(2)导入XFire用户库。该库中应包含 xfire-1.1目录下的xfire-all-1.1.jar文件,以及xfire-1.1lib目录下的所有文件。(3)将上述的XFire用户库中的所有文件拷贝到 XFireZhuweiTest项目的 WebContentWEB-INFlib目录下。(4)修改WebContentWEB-INFweb.xml配置文件的内容,下面是修改后 web.xml:XFireZhuweiTest index.html index.htm index.jsp default.html d
37、efault.htm default.jsp XFireServlet org.codehaus.xfire.transport.http.XFireConfigurableServlet XFireServlet /servlet/XFireServlet/*XFireServlet /services/*web.xml中添 加的 servlet 映射 表明,所有 匹配“/services/*”的 url 请 求全 部交给org.codehaus.xfire.transport.http.XFireConfigurableServlet来处理。(5)编写需要发布为WebService的 Ja
38、va类,这个例子中是一个非常简单的MathService.java。package com.zhuweisky.xfireDemo;public class MathService public int Add(int a,int b)return a+b;(6)在 WebContentMETA-INF目录下新建 xfire 文件夹,然后在 xfire 目录下添加一个 XFire 使用的配置文件 services.xml,该配置文件中的内容反映了要将哪些 java 类发布为 web 服务。本例中的services.xml内容如下:MathService http:/com.zhuweisky.
39、xfireDemo/MathService com.zhuweisky.xfireDemo.MathService XFire 会借助 Spring 来解析 services.xml,从中提取需要发布为 WebService 的配置信息。很多 文章介 绍到 这里就 完了,然而当 我按照 他们所 说的 启动 WebService ,然 后通过http:/localhost:8080/XFireZhuweiTest/services/MathService?wsdl 来访问服务描述时,却抛出了异常,说 services.xml 文件不存在 “org.springframework.beans.fa
40、ctory.BeanDefinitionStoreException:IOException parsing XML document from class path resource META-INF/xfire/services.xml;nested exception is java.io.FileNotFoundException:class path resource META-INF/xfire/services.xml cannot be opened because it does not exist”。(7)非常关键的一点,就是这个小难题花费了我将近一天的时间。在 WebCo
41、ntentWEB-INF目录下新建 classes文件夹,然后需要将 WebContent下的整个 META-INF文件夹剪切到新建的 classes文件夹下。到这里,项目的完整目录结构如下:(8)在 Package Explorer中选中 XFireZhuweiTest项目,右键-Run As-Run On Server,关联到你机器上的 TomCat,然后会启动 Tomcat,以启动 web服务。(注意,在进行此步骤之前,请先停止 TomCat)(9)在 IE 中输入 http:/localhost:8080/XFireZhuweiTest/services/MathService?wsdl 会得到正确的 web服务描述文档。(10)测试刚发布的 webService。我使用 C#动态调用 Web服务:/C#string url =http:/localhost:8080/XFireZhuweiTest/services/MathService;object args=1,2;object result=ESFramework.WebService.WebServiceHelper.InvokeWebService(url,Add,args);MessageBox.Show(result.ToString();执行后,弹出对话框,显示结果是 3。