首页 > 代码库 > 使用XFire开发WebServices服务端和客户端

使用XFire开发WebServices服务端和客户端

代码已亲测,全部通过

创建web service的时候一直报java.lang.ClassNotFoundException: org.jdom.Element这个错误,原因是导入jdom jar包的版本不正确。

所用的jar包包括:

activation-1.0.2.jar

commons-codec-1.4.jar

commons-httpClient-3.1.jar

commons-logging-1.1.2.jar

jaxen-1.1.6.jar

jdom-1.0.jar

log4j.jar

spring-2.5.6

spring -context-3.2.1.RELEASE.jar

stax-api-1.0-2.jar

stax-utils-20070216.jar

wsdl4j-1.6.3.jar

wss4j-1.5.12.jar

wstx-asl-3.2.0.jar

xbean-spring-3.16.jar

xfire-all-1.2.6.jar

xfire-jsr181-api-1.0-M1.jar

xml-apis-1.0.b2.jar

XmlSchema-1.4.5.jar

xmlsec-1.5.5.jar

 

 

使用xfire开发web service

  1. 配置XFire运行环境;

在Tomcat下新建一个Web Applications,命名为stove,然后在其WEB_INF目录下新建一个web.xml文件,文件中输入:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><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>/servlet/XFireServlet/*</url-pattern></servlet-mapping><servlet-mapping>   <servlet-name>XFireServlet</servlet-name>   <url-pattern>/services/*</url-pattern></servlet-mapping></web-app>

其中主要就是引入了XFireServlet,用以处理Web service请求,并且负责提供Web Service的WSDL,如果你发布了一个名为BookService的Web Service,则可以通过网址:

http://<服务器>[端口]/<webapp名>/services/BookService来访问这个Web service,并且通过http://<服务器>[端口]/<webapp名>/services/BookService?WSDL来得到这个Web Service的WSDL信息。

2. 开发最简单的Web Service

在src目录下创建一个package:

cn.com.pansky.webservice.xfire.study,在这个包下面新建一个接口:

package cn.com.pansky.webservice.xfire.study; public interface SayHiService {   public String sayHi(String name);
public Person getPerson(User u); //对象的传递  
   public List<Person> getPersonList(Integer age, String name); //List的传递  }

 

这个接口是告诉服务器你的Web service哪些方法可以被用户调用的。下面再来写一个SayHiService的实现类,以完成业务逻辑:

package cn.com.pansky.webservice.xfire.study; public class SayHiserviceImpl implements SayHiService{    @Override   public String sayHi(String name) {     if(name == null){        return "连名字都不肯告诉我么?";     }     return name+",你吃了么,没吃回家吃饭去吧!";   }
@Override
    public Person getPerson(User u) {
        Person p = new Person();
        p.setAge(24);
        p.setName(u.getName());
        return p;
    }

    @Override
    public List<Person> getPersonList(Integer age, String name) {
        Person p = new Person();
        p.setAge(age);
        p.setName(name);
        List<Person> list = new ArrayList<Person>();
        list.add(p);
        return list;
    }}

 这是它要用到的接口和两个POJO类

package cn.com.pansky.webservice.xfire.model;public class User {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    }
package cn.com.pansky.webservice.xfire.model;public class Person {    private Integer age;    private String name;    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

3. 把JAVA类发布为Web Service:

在WEB_INF目录下新建文件夹:META-INF/xfire,然后在该文件夹下新建一个XML文件:service.xml,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://xfire.codehaus.org/config/1.0">  <service>    <name>SayHiService</name>    <namespace> http://localhost:8080/SayHiService</namespace> 
<serviceClass>cn.com.pansky.webservice.xfire.study.SayHiService</serviceClass> <implementationClass> cn.com.pansky.webservice.xfire.study.SayHiserviceImpl </implementationClass> <use>literal</use> <scope>application</scope> </service></beans>

 

这个文件定义一个Web Service:SayHiService,并同时定义了接口和实现类。

创建客户端调用:

方法一:通过WSDL地址来创建动态客户端

package cn.com.pansky.webservice.xfire.study;import java.net.MalformedURLException;import java.net.URL;import org.codehaus.xfire.client.Client;public class SayHiClient {   public static void main(String args[]) throws MalformedURLException, Exception{     Client client = new Client(new URL("http://127.0.0.1:8080/stove/services/SayHiService?wsdl"));       Object[] results11 = client.invoke("sayHi", new Object[] { "Jadyer22" });     System.out.println(results11[0]);   }}

 方法二:通过服务端提供的端口来创建客户端

package cn.com.pansky.webservice.xfire.study;import java.net.MalformedURLException;import java.util.List;import org.codehaus.xfire.client.XFireProxyFactory;import org.codehaus.xfire.service.Service;import org.codehaus.xfire.service.binding.ObjectServiceFactory;import cn.com.pansky.webservice.xfire.model.Person;import cn.com.pansky.webservice.xfire.model.User;public class ClientFromInterface {    public static void main(String[] args)throws MalformedURLException{          //首先使用XFire的ObjectServiceFactory从HelloService接口创建一个服务模型serviceModel          //serviceModel包含服务的说明,换句话说,就是服务的元数据          //Create a metadata of the service          Service serviceModel = new ObjectServiceFactory().create(SayHiService.class);                    //访问的地址          String serviceURL = "http://127.0.0.1:8080/stove/services/SayHiService";                    //通过查看org.codehaus.xfire.client.XFireProxyFactory源码发现          //下面两行代码与这里直接new XFireProxyFactory()的作用是等效的          //XFire xfire = XFireFactory.newInstance().getXFire();          //XFireProxyFactory factory = new XFireProxyFactory(xfire);          //为XFire获得一个代理工厂对象          //Create a proxy for the deployed service          XFireProxyFactory factory = new XFireProxyFactory();                    //通过proxyFactory,使用服务模型serviceModel和服务端点URL(用来获得WSDL)          //得到一个服务的本地代理,这个代理就是实际的客户端          SayHiService client = (SayHiService)factory.create(serviceModel, serviceURL);                    /**          * Invoke the service          * @see 调用服务的本地代理(即实际的客户端)中的方法,便得到我们需要的WebServcie          */                    /*--处理简单对象--*/          String serviceResponse = client.sayHi("Jadyer11");          System.out.println(serviceResponse);                    /*--处理对象--*/          User u = new User();          u.setName("Jadyer99");          Person pp = client.getPerson(u);          System.out.println(pp.getName());                    /*--处理List--*/          List<Person> personList = client.getPersonList(24, "Jadyer88");          for(Person p : personList){              System.out.println(p.getName());          }      }  }

 

使用XFire开发WebServices服务端和客户端