抛开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
朔望魔刃 阅读(542)
评论(0) 编辑 收藏