简单记录XFire中怎么传输对象的实现,以备查阅;又不正确的地方请看官们指正!
1、先来看看我们的Interface
package com.wy; import java.util.List; /** * 服务端接口; * @author Administrator * */ public interface IPerson { public String example(String message); public abstract List<Person> getPersonList(); public abstract List<Person> setPersonList(List<Person> personList); public abstract Person getPersonObj(); }
这其中包含了简单对象的传递,对象的传递,List的传递。
2、实现接口和业务逻辑
package com.wy; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PersonImpl implements IPerson, Serializable { private static final long serialVersionUID = 1L; public String example(String message) { return "你好,"+message; } public List<Person> getPersonList() { List<Person> list = new ArrayList<Person>(); Person person = new Person(); person.setAge(22); person.setName("Wang"); person.setSex("Boy"); list.add(person); Person person2 = new Person(); person2.setAge(19); person2.setName("Sun"); person2.setSex("Girl"); list.add(person2); return list; } public List<Person> setPersonList(List<Person> personList) { return personList; } public Person getPersonObj() { Person person = new Person(); person.setAge(22); person.setName("ZengPing"); person.setSex("Girl"); Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "HuFang"); map.put(2, "DuanYouYu"); map.put(3, "TianWei"); List<String> list = new ArrayList<String>(); list.add("List1"); list.add("List2"); list.add("List3"); person.setList(list); person.setMap(map); return person; } }
用到的Person,必须实现Serializable,才能够传输.否则会找不到,对应的文件, 从服务器返回过来的数据会为null;
package com.wy; import java.io.Serializable; import java.util.List; import java.util.Map; /** * Entry * @author Administrator * */ public class Person implements Serializable{ private static final long serialVersionUID = 1L; private String name; private int age; private String sex; private List<String> list; private Map<Integer, String> map; public Person() { } public Person(String name, int age, String sex,List<String> list,Map<Integer, String> map) { super(); this.name = name; this.age = age; this.sex = sex; this.list = list; this.map = map; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public List<String> getList() { // TODO Auto-generated method stub return list; } public void setList(List<String> list) { // TODO Auto-generated method stub this.list = list; } public void setMap(Map<Integer, String> map) { // TODO Auto-generated method stub this.map = map; } public Map<Integer, String> getMap() { // TODO Auto-generated method stub return map; } }
3、在src/META-INF/xfire/services.xml,编译时会自动编译到classes的相应目录下面
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>PersonService</name> <serviceClass>com.wy.IPerson</serviceClass> <implementationClass> com.wy.PersonImpl </implementationClass> <scope>request</scope> </service> </beans>
4、因为用到了List、Map等集合类型,所以需要定义Mapping关系,文件名为:src/test/IPerson.aegis.xml
<?xml version="1.0" encoding="UTF-8"?> <mappings> <mapping> <method name="getList"> <parameter index="0" componentType="java.lang.String" /> <return-type componentType="com.wy.Person" /> </method> </mapping> <mapping> <method name="getMap"> <parameter index="0" componentType="java.lang.String" /> <return-type componentType="com.wy.Person" /> </method> </mapping> </mappings>
注意,此文件一定要放到与IHelloService.java相同的目录下面,否则会出错。
5、在Web.xml中配置XFire需要用到的Servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class> org.codehaus.xfire.transport.http.XFireConfigurableServlet </servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
此时Web Service的服务端就开发完成了。
现在来看看客户端的代码吧
package com.wy; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; public class Client { /** * 主方法; * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String url = "http://localhost:8080/WebServiceXFire/services/PersonService"; Service serviceModel = new ObjectServiceFactory().create(IPerson.class); try { IPerson person = (IPerson) new XFireProxyFactory().create( serviceModel, url); // System.out.println(person.example("WebService!")); System.out.println("-----------------1------------------"); List<Person> list = person.getPersonList(); // 输出Person list集合; for (Person per : list) { System.out.println(per.getName() + "," + per.getAge() + "," + per.getSex()); } System.out.println("-----------------2------------------"); List<Person> list2 = new ArrayList<Person>(); Person person2 = new Person(); person2.setAge(20); person2.setName("Test"); person2.setSex("Girl"); list2.add(person2); // 设置Person list集合; List<Person> personList2 = person.setPersonList(list2); // 输出从服务器端返回的集合数据; for (Person per : personList2) { System.out.println(per.getName() + "," + per.getAge() + "," + per.getSex()); } System.out.println("-----------------3------------------"); // 调用服务器端的单个对象; Person person3 = person.getPersonObj(); System.out.println(person3.getName() + "," + person3.getAge() + "," + person3.getSex()); System.out.println("-----------------4------------------"); System.out.println("\n服务器端返回的List集合"); List<String> list3 = person3.getList(); for (String str : list3) { System.out.println(str); } System.out.println("------------------5-----------------"); Map<Integer, String> map = person3.getMap(); System.out.println("\n服务器端返回的Map集合"); for (Iterator<Integer> iterator = map.keySet().iterator(); iterator .hasNext();) { int resultKey = iterator.next(); String resultValue = map.get(resultKey); System.out.println(resultKey + "," + resultValue); } System.out.println("-------------------6----------------"); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }