随笔-95  评论-31  文章-10  trackbacks-0
抛开MyEclipse,根据servlet规范,java_web应用必须采用固定的目录结构。
即:项目名/WEB-INF/classes
      项目名/WEB-INF/lib
      项目名/WEB-INF/web.xml
xfire部署webservice需要在classes下面建立目录META-INF/xfire/services.xml
 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans xmlns="http://xfire.codehaus.org/config/1.0">
 3<service>
 4  <name>TeacherContent</name>
 5  <serviceClass>services.ITeacherManager</serviceClass>
 6  <implementationClass>services.TeacherManager</implementationClass>
 7  <scope>request</scope>
 8</service>
 9
10</beans>
里面的参数name、serviceClass、implementationClass、scope一看就明白

重点:写好服务端代码后,只要里面的方法返回值不是map,那么客户端代码就统统可以用以下代码调用获得返回值
1//假设存在一个接口为IUser
2String ulr="webservice地址";
3Service service=new ObjectServiceFactory().create(IUser.class);
4IUser user = (IUser)new XFireProxyFactory().create(service,url);
5//调用
6user.方法();

如果服务端接口代码里的某个方法返回值为map,那么需要在该类同一目录下建立名字为接口.aegis.xml 名字必须和该接口名字一致只是多了.aegis.xml后缀名文件
内容如下(里面均为自己测试成功的内容):
 1<?xml version="1.0" encoding="UTF-8"?>
 2<mappings>
 3<mapping>
 4    <method name="getGradesMap">
 5     <return-type componentType="entity.Grades"/>
 6    </method>
 7    <method name="getStudentMap">
 8    <return-type componentType="entity.Student"/>
 9    </method>
10    <method name="setMaps">
11    <parameter index="0" componentType="entity.Student"/>
12    <parameter index="1" componentType="entity.Grades"/>
13    <return-type keyType="entity.Student" componentType="entity.Grades"/>
14    </method>
15</mapping>
16</mappings>
17
18
method的name属性为该返回值为map的接口方法名字
return-type的componentType表示返回类型为复杂类型(就是个自定义对象)
如果返回值为这种Map<Integer,Student>那么就直接写一个componentType属性即可
如果返回值为这种Map<Student,Teacher>那么要写成<return-type keyType="包名.Student" componentType="包名.Teacher"/>
如果该方法有参数,那么parameter index="0"表示第一个参数 依次类推

总之:如果服务端的接口方法有返回值且是map,那么一定要写一个接口.aegis.xml文件否则客户端无法调用。
以上测试没有使用JAXB,如果根据wsdl文件生成客户端代码,那么需要使用JAXB的API进行调用服务端的webservice。
在MyEclipse中可以根据wsdl生成客户端代码,流程如下:
选中建好的客户端webservice项目-点击new web service-输入webservice地址 一步一步操作即可生成客户端代码。
这种方法与上面的方式不同点在于,自定义对象的赋值,全部变为JAXBElement(new QName("命名空间","属性名字"),基本属性.class,"属性值");
例如通过wsdl生成客户端后一个自定义对象里面包含如下属性:
1    @XmlElementRef(name = "address", namespace = "http://service.patientservice.huahai.com", type = JAXBElement.class)
2    protected JAXBElement<String> address;
JAXBElement(new QName("命名空间","属性名字"),基本属性.class,"属性值");
命名空间=http://service.patientservice.huahai.com
属性名字=address
基本属性=String
属性值=澳大利亚
即和上面一一对应

xfire简单用法就上述这么多,明天补上与spring集成的代码以及关于前处理后处理(即handler)以及异常处理的代码





posted on 2011-05-30 17:48 朔望魔刃 阅读(539) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: