最近一直使用XFire做WebServices方式使用,总结一些相关经验,本文以具体例子进行XFire开发过程分析
1、首先定义一个Interface,具体包含简单类型传值、返回自定义对象、返回集合三个接口方法
import java.util.List;
import com.gresoft.commons.core.exception.BusinessException;
import com.gresoft.sanitation.model.dictionary.Hospital;
public interface WebServicesInterface {
public String savePutXml(int i,String typecode) throws BusinessException;
public Hospital getList(int p);
public List getAll();
}
2、实现上述接口,实现业务逻辑
public class HospitalService extends HibernateEntityDao implements
WebServicesInterface {
private HospitalManager hospitalManager;
public void setHospitalManager(HospitalManager hospitalManager) {
this.hospitalManager = hospitalManager;
}
public String savePutXml(int o, String typecode) throws BusinessException {
// TODO Auto-generated method stub
Hospital h = new Hospital(o, typecode);
super.save(h);
System.out.println("ccccc");
return "gggg";
}
public Hospital getList(int p) {
// TODO Auto-generated method stub
Hospital h = hospitalManager.get(p);
System.out.println("name:" + h.getHospitalName());
return hospitalManager.get(p);
}
@SuppressWarnings("unchecked")
public List getAll() {
List list = hospitalManager.getAll();
System.out.println("size:" + list.size());
return hospitalManager.getAll();
}
}
定义自定义对象Hospital
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
/**
* @author wuxj:
* @version 创建时间:2007-10-15 上午11:31:39
*/
@Entity
@Table(name = "HOSPITAL", schema = "DB2ADMIN")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Hospital implements java.io.Serializable {
private int hospitalId;
private String hospitalName;
public Hospital() {
}
public Hospital(int hospitalId) {
this.hospitalId = hospitalId;
}
public Hospital(int hospitalId, String hospitalName) {
this.hospitalId = hospitalId;
this.hospitalName = hospitalName;
}
@Id
@Column(name = "HOSPITAL_ID", unique = true, nullable = false)
public int getHospitalId() {
return hospitalId;
}
public void setHospitalId(int hospitalId) {
this.hospitalId = hospitalId;
}
@Column(name = "HOSPITAL_NAME", nullable = false, length = 20)
public String getHospitalName() {
return hospitalName;
}
public void setHospitalName(String hospitalName) {
this.hospitalName = hospitalName;
}
}
3、编写XFire的描述文件
描述文件为WebServicesInterface.aegis.xml,一定要与Interface接口类在同一个目录,否则会出错误
只需要描述返回是集合的描述,getAll方法返回是List集合,需要对集合中的元素进行定义,在这里是Hospital对象
componentType="com.gresoft.sanitation.model.dictionary.Hospital" />
4、编写xfire-servlet.xml文件
xfire是跟spring结合一起使用的,所以用到了spring相关内容。
注意:位置一定要在WEB-INF目录下
key="/echo"中的echo为你在客户端访问的地址,具体看client内容
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
class="org.codehaus.xfire.spring.remoting.XFireExporter">
value="com.gresoft.sanitation.service.WebServicesInterface" />
5、编写客户端测试
import java.net.MalformedURLException;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
public class HospitalServiceClient {
public static void main(String args[]) {
Service srvcModel = new ObjectServiceFactory()
.create(WebServicesInterface.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
.newInstance().getXFire());
// XFireProxyFactory factory = new XFireProxyFactory(getXFire());
String helloWorldURL = "http://localhost:8080/sanitation/service/echo";
// String helloWorldURL ="xfire.local://echo";
try {
WebServicesInterface srvc = (WebServicesInterface) factory.create(
srvcModel, helloWorldURL);
Hospital h = new Hospital();
h.setHospitalId(11);
h.setHospitalName("测试");
// System.out.print(srvc.sayHello("wuxj")+"\n");
// RegisterApply apply = new RegisterApply();
// apply.setOperateDate("20071221");
// apply.setRegisterId("1000");
// srvc.savePutXml(apply);
System.out.println(srvc.savePutXml(11, "测试"));
srvc.getList(1);
srvc.getAll();
// System.out.print(((MsdpUser)srvc.getUser().get(0)).getUid());
} catch (MalformedURLException e) {
System.out.println("wrong");
e.printStackTrace();
}
}
}
6、定义web.xml的xfire
红色字体一定要加上,而且是固定格式,这是xfire需要加载的文件
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
contextConfigLocation
classpath*:spring/*.xml,classpath:org/codehaus/xfire/spring/xfire.xml
org.springframework.web.context.ContextLoaderListener
xfire
org.springframework.web.servlet.DispatcherServlet
xfire
/service/*