XFire
XFire是一个免费的开源SOAP框架,它不仅可以极大方便地实现这样一个环境,并且可以提供许多Web Services规范中高级特征,这些特征在多数的商业或者开源工具都没有提供。http://xfire.codehaus.org/Download是它的官方网站下载区,同时你也可以了解关于它的更多内容。
创建过程示例
下面我们就来使用Java构建一个WebService并且构建一个客户端来测试访问它。
首先请确保你的JDK和Tomcat在Eclipse环境中是可用的,配置方法不做赘述。并且你了解一些java编程技术和tomcat的发布常识。
版本信息:MyEclipse6.0.0M1;Tomcat6.0;JDK1.5;Xfire1.2,注意这里的tomcat为6.0,在5.0下有冲突。
1、打开MyEclipse新建一个WebService Project,为你的项目命名,我选择了Java EE5.0,项目在你的WorkSpace目录下。下一步:看到了这个界面
在这里Eclipse为你创建了webService的配置文件services.xml(主意文件名是有“s”的),并进行了Xfire的Servlet基本配置告诉项目你使用了Xfire改信息将体现在项目的web.xml文件中。继续下一步,加载Xfire相关的jar包,你看到了
在这个项目里我勾选了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
- • wsdl4j-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 代码接下来的工作是开始编写java类
-
模拟应用是一个银行转账应用,从账户A转账到账户B并需要给出金额和货币种类。我们先来实现一个接口IBankingService.java代码全文如下:
java 代码然后编写一个普通的Java类BankingService包含了一个叫做transferFunds()的方法来为我们完成这项工作。它需要四个输入参数:
1、 String fromAccount
2、 String toAccount
3、 double amount
4、 String currency
代码如下:
java 代码你可以看到BankingService是一个普通的Java类,没有任何代码告诉我们它将会在Web Services中使用。只是要有默认的构造函数,类型是public。这是必须的。否则,XFire不能够初始化这个类。好的,这里我们不需要增加任何东西。我们所有的工作都在部署描述符里完成。
Web应用的部署描述符
在Java中,Web应用程序通常需要至少一个部署描述符(叫做web.xml)对其进行配置。XFire本身是一个基于servlet的应用程序。因此,我们需要增加必要的引用到描述符文件中。然后我们还必须配置将要创建的Web Services。我们使用一个称为services.xml的新文件来完成这件事。在使用Eclipse工具构建工程的时候我们已经完成了这项配置(参见(上)文)。
services.xml
现在我们不得不说一下我们的Web Services的由什么组成的了。这由一个叫做services.xml的文件完成,当这个项目在tomcat发布后,它存放在WEB-INF/classes/META-INF/xfire目录下,它在Web应用程序的标准类路径中。而在Eclipse环境中我们可以清除的看到Eclipse已经为我们把它清楚的列在项目路径中。这里是services.xml中的基本配置条目:
xml 代码Web Services的定义包含在元素中,它还含有一些子元素。
第一个子元素是<name></name>Banking,它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如,在服务准备好以后,你将在浏览器上使用这个名字来查看WSDL。
下一个子元素是<namespace></namespace>。任何合法的XML名字都是可以的。<namespace></namespace>用来唯一标识你的服务的各个参数。(注释@)
注释@:Namespace派什么用?namespace的作用是要避免命名冲突。如果我建立一项Web
Service,其中的WSDL文件包含一个名为"foo"的元素,而你想要使用我的服务与另一项服务连接作为补充,这样的话另一项服务的WSDL文件就不能包含名为"foo"的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时,才可以取相同的名字。如果有了表示区别的namespace,我的网络服务里的"foo"就可以表示完全不同于另一个网络服务里"foo"的含义。在你的客户端里,你只要加以限制就可以引用我的"foo"。
<serviceclass></serviceclass>元素包含了Java类的名字,它指定了方法签名。在我们的例子中,它是接口IBankingService。如果Java类没有实现任何接口,你就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。<implementationclass></implementationclass>保存了实现方法的Java类名。这是一个可选元素。如果上一个元素<serviceclass></serviceclass>包含了一个接口,那么相应的实现类必须在这里指定。
就是这样。我们的Web Services配置完成了。
我们如何知道Web Service正在工作呢?
为了了解Web Service是否正在工作,我们需要测试。首先,我们测试来看WSDL是否可用。我们在浏览器中输入URL。哪个URL?因为我们的应用程序的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中我们可以看到<xsd:element name="transferFunds">的服务方法明以及他的四个参数描述等信息。但是这个测试是不够的。可能会发生这种情况,可以看到WSDL,但是从客户端程序可能会访问不到服务。因此为了核实服务是否可以访问了,我们必须使用一个客户端进行服务的实际调用来进行一个真正的测试。
开发一个客户端
编写BankClient.java
-
public static void main(String[] args) {
// 方法一
Service serviceModel=new ObjectServiceFactory().create(IBankingService.class);
try {
IBankingService client=(IBankingService)new XFireProxyFactory()
.create(serviceModel, "http://localhost:8080/aa/services/Banking");
String serviceResponse=client.transferFunds("Minsheng", "Nongye", 10000, "RMB");
System.out.println(serviceResponse);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//方法二
try {
Client client=new Client(new URL("http://localhost:8080/aa/services/Banking?WSDL"));
Object[] result=client.invoke("transferFunds", new Object[]{"minsheng","nongye",10000,"rmb"});
System.out.println(result[0]);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} -
总结:
基本的Web Services开发步骤清单
-
-
1、 检查Java类的方法和默认构造函数确保为public
-
-
3、 创建services.xml,把它放到WEB-INF/classes/META-INF/xfire目录下
-
4、 增加XFire和第三方包到你的Web应用的WEB-INF/lib文件夹中