<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services
public interface IXFireService {
public String sayHello(String name);
}
package cn.com.huixin.webservice.impl;
import cn.com.huixin.webservice.IXFireService;
public class XFireServiceImpl implements IXFireService {
public String sayHello(String name) {
return name + " say: Hello!";
}
}代码比较简单,就不再赘述了。接口和实现类准备好后,就该XFire的配置文件了,在这个文件中将上述的接口和实现类加入配置之后,才能将其作为WebService发布出去。按照XFire的约定,要在工程的classes目录中建一个名为META-INF的文件夹,在这个文件夹中建一个xfire的文件夹,在该文件夹中建一个名为services.xml的配置文件。所以在工程的srcMETA-INFxfire路径下建这样一个文件,Eclipse编译之后,就会在classesMETA-INFxfire目录中出现services.xml文件。services.xml文件的代码如下:
<?xml version="1.0" encoding="UTF-8"?>其中,name节点指明了WebService的地址,namespace指明了WebService的命名空间,命名空间可以随便取,我查了一下,网上也没说明白命名空间的具体作用。serviceClass节点指明了WebService的接口,包括这个接口的包名。implementationClass节点是WebService接口的实现类的完整路径名。这个文h件配置好之后,WebService的地址也就确定了,地址为http://主机地址:端口号/工程名/在web.xml文件中配置的XFire的Servlet的mapping的模式/在services.xml文件中配置的name节点值。以我这个例子来说,主机就是localhost,端口号是tomcat的默认端口号8080,工程名是webservice,在web.xml文件中配置的XFireConfigurableServlet的mapping模式是services,在services.xml文件中配置的name节点的值是xfireService,所以我的这个WebService的地址就是:http://localhost:8080/webservice/services/xfireService。将工程启动起来,在IE浏览器中访问http://localhost:8080/webservice/services/xfireService?wsdl这个WebService的wsdl地址,如果出现类似下边的xml文件格式的画面,就说明WebService发布成功了:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>xfireService</name>
<namespace>
http://www.huixin.com.cn/webservice/helloworld
</namespace>
<serviceClass>cn.com.huixin.webservice.IXFireService</serviceClass>
<implementationClass>
cn.com.huixin.webservice.impl.XFireServiceImpl
</implementationClass>
</service>
</beans>
WebService发布成功之后,就可以写客户端来访问这个Web服务了。下来介绍如何使用XFire来编写客户端访问这个WebService。新建一个java工程,将XFire的Jar包引入。我们使用的这种方式有一个缺点,就是在客户端必须知道WebService的接口,所以现将WebService的接口IXFireService复制过来,然后新建一个java类,名字为XFireClient,代码如下:
package cn.com.huixin.webservice;
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;
public class XFireClient {
public static void main(String[] args) {
Service serviceModel = new ObjectServiceFactory().create(IXFireService.class);
XFire xfire = XFireFactory.newInstance().getXFire();
XFireProxyFactory factory = new XFireProxyFactory(xfire);
String serviceUrl = "http://localhost:8080/webservice/services/xfireService";
IXFireService client = null;
try {
client = (IXFireService) factory.create(serviceModel, serviceUrl);
} catch (Exception e) {
System.out.println("Client call webservice has exception: "
+ e.toString());
}
String retvalue = client.sayHello("andrew Lau");
System.out.println(retvalue);
}
}其中的serviceUrl就是我们发布的WebService的地址,注意此处后边不需要“?wsdl”,IXFireService就是WebService的接口。在此后的博文中我会介绍不需要引入WebService接口来调用WebService的方法。