XFire使用详解
最近一直使用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<Hospital> 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对象
<?xml version="1.0" encoding="UTF-8"?> <mappings> <mapping> <method name="getAll"> <return-type componentType="com.gresoft.sanitation.model.dictionary.Hospital" /> </method> <property name="hibernateGenericDao" ignore="true" /> <!-- 在HospitalService中这个文件可以不用,主要是为了定义返回为对象或集合 --> <!-- <method name="savePutXml"> <parameter index="1" componentType="java.lang.String" /> </method> --> </mapping> </mappings>
4、编写xfire-servlet.xml文件
xfire是跟spring结合一起使用的,所以用到了spring相关内容。
注意:位置一定要在WEB-INF目录下
key="/echo"中的echo为你在客户端访问的地址,具体看client内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- START SNIPPET: xfire --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/echo" value-ref="echo" /> </map> </property> </bean> <!-- Declare a parent bean with all properties common to both services --> <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter"> <property name="serviceFactory" ref="xfire.serviceFactory" /> <property name="xfire" ref="xfire" /> <property name="serviceBean" ref="hospitalService" /> <property name="serviceInterface" value="com.gresoft.sanitation.service.WebServicesInterface" /> </bean> <!-- END SNIPPET: xfire --> </beans>
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需要加载的文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml,classpath:org/codehaus/xfire/spring/xfire.xml</param-value> </context-param> <!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- XFire WebServices的入口 --> <servlet> <servlet-name>xfire</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>xfire</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping> </web-app>