首页 > 代码库 > 使用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
- 配置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服务端和客户端