使用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());  
        }  
    }  
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。