XFire开发web service
环境介绍
1.JDK6
2.myeclipse6.0.1
3.tomcat5.5
4.xfire1.2.6
开发步骤
(一)服务器端开发
1 在myeclipse下建立web service project ,命名为webservice;
2 在src文件夹下建立三个包,包名如下:
com.hust.dm.beans
com.hust.dm.services
com.hust.dm.servicesImpl
3 在beans包下新建类Book,代码如下:
package com.hust.dm.beans;
public class Book {
private String name;
private String isbn;
private String auther;
private String year;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getAuther() {
return auther;
}
public void setAuther(String auther) {
this.auther = auther;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
}
4 在services包下新建立服务接口类BookManager,代码如下:
package com.hust.dm.services;
import java.util.List;
import com.hust.dm.beans.Book;
public interface BookManager {
public Book getBook();
public void setBook(Book book);
public List<Book> getBooks();
}
5 在servicesImpl包下新建对应服务接口的实现类BookManagerImpl,代码如下:
package com.hust.dm.servicesImpl;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.hust.dm.beans.Book;
import com.hust.dm.services.BookManager;
public class BookManagerImpl implements BookManager {
private Book book = null;
public Book getBook() {
// TODO Auto-generated method stub
if(book == null) {
book = new Book();
book.setAuther("raindrop");
book.setIsbn("450001");
book.setName("《IT世界》");
book.setYear("2000");
}
return book;
}
public List<Book> getBooks() {
// TODO Auto-generated method stub
List<Book> list = new ArrayList<Book>();
Book book = new Book();
book.setAuther("raindrop");
book.setIsbn("450001");
book.setName("《IT世界》");
book.setYear("2000");
Book book1 = new Book();
book1.setAuther("ychao");
book1.setIsbn("450002");
book1.setName("《遗失的美好》");
book1.setYear("2001");
list.add(book);
list.add(book1);
return list;
}
public void setBook(Book book) {
// TODO Auto-generated method stub
System.out.println("[" + getTime() + "]: book reset !");
this.book = book;
}
public String getTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd kk:mm:ss");
Date date = new Date();
return sdf.format(date);
}
}
6 新建web service
选中webservice工程-->右击-->new-->other-->web service,弹出的第一个窗口默认即可,第二个需输入所建service的名字(BookManager)、服务接口(com.hust.dm.services.BookManager)、服务实现类(com.hust.dm.services.BookManagerImpl)、紧跟的两个选项可以采用默认的设置。
7 将工程部署至tomcat服务器中:直接将webservice依Myeclipse Server Application方式运行,选择配置的tomcat5即可。
8 打开浏览器输入http://localhost:8080/webservice/services/BookManager?wsdl检查服务是否发布成功,显示wsdl文件说明发布成功。
(二)客户端开发
a、通过服务器端的beans和接口类编写客户端调用代码
要求:客户端能够得到服务器端的beans和接口类
我们可以新建java project,将webservice project下的com.hust.dm.services和com.hust.dm.beans包拷贝到新建的工程下,简单起见,我们直接在webservic 工程下编写客户端调用代码。
1 在src文件夹下新建test.client包
2 在test.clients包下新建调用类BookManagerClient,代码如下:
package test.clients;
import java.util.List;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.hust.dm.beans.Book;
import com.hust.dm.services.BookManager;
public class BookManagerClient {
public static void main(String[] args) {
try {
String url = "http://127.0.0.1:8080/webservice/services/BookManager";
Service service = new ObjectServiceFactory().create(BookManager.class);
BookManager bookManager = (BookManager)new XFireProxyFactory().create(service, url);
System.out.println("得到的BOOK:");
Book book = bookManager.getBook();
System.out.println("BOOK:("+book.getIsbn()+" "+book.getName()+" "+book.getAuther()+" "+book.getYear()+")");
System.out.println("得到的BOOK列表:");
List<Book> list = bookManager.getBooks();
for(int i=0; i<list.size(); ++i) {
book = list.get(i);
System.out.println("BOOK:("+book.getIsbn()+" "+book.getName()+" "+book.getAuther()+" "+book.getYear()+")");
}
System.out.println("重设服务器端BOOK...");
Book resetBook = new Book();
resetBook.setAuther("doubles");
resetBook.setIsbn("450003");
resetBook.setName("《青梅煮酒》");
resetBook.setYear("2000");
bookManager.setBook(resetBook);
System.out.println("重设后的BOOK:");
book = bookManager.getBook();
System.out.println("BOOK:("+book.getIsbn()+" "+book.getName()+" "+book.getAuther()+" "+book.getYear()+")");
}catch(Exception e) {
e.printStackTrace();
}
}
}
3 运行客户端代码,检查调用是否成功,调用成功将显示如下调用结果:
得到的BOOK:
BOOK:(450001 《IT世界》 raindrop 2000)
得到的BOOK列表:
BOOK:(450001 《IT世界》 raindrop 2000)
BOOK:(450002 《遗失的美好》 ychao 2001)
重设服务器端BOOK...
重设后的BOOK:
BOOK:(450003 《青梅煮酒》 doubles 2000)
b、通过myeclipse自带的xfire插件或ant工具产生客户端代码
本文介绍使用ant工具产生客户端的调用代码。
1 新建java project命名为webservice_invoke
2 在webservice_invoke下建立如附件1所示文档结构
lib: 包含xfire发布文件目录下的xfire-all-1.2.6.jar和lib文件夹下的所以jar文件
build.xml为ant运行配置文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="XFire-WsGen" basedir="." default="wsgen">
<path id="classpathId">
<fileset file="${basedir}/lib/*.jar"/>
</path>
<target name="clean" description="Prepare for clean build">
<delete dir="${basedir}/client"/>
<mkdir dir="${basedir}/client"/>
</target>
<target name="wsgen" depends="clean">
<taskdef name="WsGenTask" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="classpathId"/>
<WsGenTask outputDirectory="${basedir}/client" wsdl="http://localhost:9090/webservice/services/BookManager?wsdl" package="com.hust.dm.clients" overwrite="true"/>
</target>
</project>
3 使用ant运行build.xml,运行结束后刷新client文件夹,将产生附件2所示的文档结构
4 将client文件夹下的所有内容拷贝到src文件夹下(文档结构如附件3所示),此时会提示出错,原因没有引入xfire所需的包,将第二步lib下的jar包引入build path即可。
5 在src下新建调用包ws.invoke.dm,并在该包下建立调用类BookManagerInvoker,代码如下:
package ws.invoke.dm;
import java.util.List;
import com.hust.dm.beans.ArrayOfBook;
import com.hust.dm.beans.Book;
import com.hust.dm.clients.BookManagerClient;
import com.hust.dm.clients.BookManagerPortType;
public class BookManagerInvoker {
private BookManagerClient bmClient = null;
private BookManagerPortType bmPT = null;
//bean对象、集合产生工厂
private com.hust.dm.beans.ObjectFactory beanOF = null;
//远程调用方法参数和返回值产生工厂
private com.hust.dm.services.ObjectFactory serviceOF = null;
public BookManagerInvoker() {
bmClient = new BookManagerClient();
bmPT = bmClient.getBookManagerHttpPort();
beanOF = new com.hust.dm.beans.ObjectFactory();
serviceOF = new com.hust.dm.services.ObjectFactory();
}
public void getBook() {
System.out.println("得到的BOOK:");
Book book = bmPT.getBook();
System.out.println("BOOK:("+book.getIsbn().getValue()+" "+book.getName().getValue()+" "+book.getAuther().getValue()+" "+book.getYear().getValue()+")");
}
public void getBooks() {
System.out.println("得到的BOOK列表:");
ArrayOfBook array = bmPT.getBooks();
List<Book> list = array.getBook();
for(Book book : list) {
System.out.println("BOOK:("+book.getIsbn().getValue()+" "+book.getName().getValue()+" "+book.getAuther().getValue()+" "+book.getYear().getValue()+")");
}
}
public void setBook(String isbn, String name, String auther, String year) {
System.out.println("重设服务器端BOOK...");
Book book = beanOF.createBook();
book.setAuther(beanOF.createBookAuther(auther));
book.setIsbn(beanOF.createBookIsbn(isbn));
book.setName(beanOF.createBookName(name));
book.setYear(beanOF.createBookYear(year));
bmPT.setBook(book);
}
public static void main(String[] args) {
BookManagerInvoker invoker = new BookManagerInvoker();
invoker.getBook();
invoker.setBook("450004", "《爱我中华》", "doubles", "2008");
invoker.getBook();
invoker.getBooks();
}
}
6 运行BookManagerInvoker,检查调用是否成功。