您的位置:首页 > 其它

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

2014-08-25 13:30 351 查看
代码已亲测,全部通过

创建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

配置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());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: