xfire1.2.6支持jdk1.4以上的版本,但是有些比如JSR181注解需要jdk的更高版本,我的例子是一个简单的读取文件程序,服务器是Apache Tomcat6.0.18。
假定你已经了解如何使用Java编写Web应用程序,并知道应该如何把它部署到Apache Tomcat服务器上。话不多说,开始webservice的开发步骤吧!
1.从xfire的官方网站http://xfire.codehaus.org/Download上下载xfire-distribution-1.2.6.zip最新版的包,压缩包的lib中有它所需的依赖包,将它放入web-info的lib路径下,包有以下这些:
2.在web.xml文件中加入
<servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class> org.codehaus.xfire.transport.http.XFireConfigurableServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value>/resource/services.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
init-param节点不是必须的,如果不配置的话,需要在src的路径中加入META-INFO文件夹,里面加入services.xml文件。配置的话可以指定services.xml文件的路径。
3. 业务代码实现就没有什么好说的啦,如下一个接口(IReadService)和一个实现类(ReadService)
package com.tjn.impl;
public interface IReadService {
public String readFiles();
}
package com.tjn.impl;
import java.io.File;
public class ReadService implements IReadService {
//Default constructor.
public ReadService(){
}
public String readFiles() {
// TODO Auto-generated method stub
String result="";
File file=new File("d:/test");
String[] files=file.list();
for (int i = 0; i < files.length; i++) {
result+=files[i]+"\n";
}
return result;
}
}
默认的构造函数类型必须是public。否则,XFire不能够初始化这个类。
4.services.xml文件中的配置
<beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>WebserviceTest</name> <namespace>mywebserviceTest</namespace> <serviceClass>com.tjn.impl.IReadService</serviceClass> <implementationClass>com.tjn.impl.ReadService</implementationClass> /service> </beans>
第一个子元素是,它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。
例如,在服务准备好以后,你将在浏览器上使用这个名字来查看WSDL。
下一个子元素是<namespace>。任何合法的XML名字都是可以的。
<namespace>用来唯一标识你的服务的各个参数。
<serviceClass>元素包含了Java类的名字,它指定了方法签名。
在本例中,它是接口IReadService。
如果Java类没有实现任何接口,你就需要把类的名字放在这里。
在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。
<implementationClass>保存了实现方法的Java类名。这是一个可选元素。
如果上一个元素<serviceClass>包含了一个接口,那么相应的实现类必须在这里指定。
这样Web Services就配置完成了。
测试服务器端的webservice是否发布成功,测试如下:
启动tomcat,在地址栏中输入http://localhost:8080/WebST/services/WebserviceTest?wsdl,如果能看到类似xml的页面文件就差不多了,
但是这个测试是不够的。可能会发生这种情况,可以看到WSDL,但是从客户端程序可能会访问不到服务。
因此为了核实服务是否可以访问了,我们必须使用一个客户端进行服务的实际调用来进行一个真正的测试。
下面是客户端的代码:
package com.tjn.clienttest;
import java.net.MalformedURLException;
import org.codehaus.xfire.XFire;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.tjn.common.Global;
import com.tjn.impl.IReadService;
public class ClientTest {
public static void main(String[] args) {
Service serviceModel = new ObjectServiceFactory().create(IReadService.class);
XFire xfire = XFireFactory.newInstance().getXFire();
XFireProxyFactory factory = new XFireProxyFactory(xfire);
String serviceUrl ="http://localhost:8080/WebST/service/WebserviceTest?wsdl";
IReadService client = null;
try {
client = (IReadService) factory.create(serviceModel, serviceUrl);
System.out.println(client.readFiles());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这个代码是如何工作的呢?
首先,我们创建一个服务模型,它包含服务的说明——换句话说,就是服务的元数据。
我们使用XFire的ObjectServiceFactory从IBReadService.class接口创建这个模型。
接着,为XFire获得一个代理工厂对象,它包含了常规的代码,也相当地简单和易懂。
这一步中没有任何特定应用的东西。从这个proxyFactory,
使用服务模型和服务端点URL(用来获得WSDL),我们可以得到一个服务的本地代理(实际的客户端)。
现在,我们可以调用它的readFiles()方法来得到我们需要的Web Service。
同时客户端只需的jar比较少,基本的就是有以下这些包就可以了
如果客户端能接收服务器端返回的信息就成功啦!
在实际项目中,有服务器端发布的接口,在客户端只需要有一个和服务器端相同的接口就可以了,不需要实现类,调用接口中的方法时会调用服务器端的实现类中的方法。