拋開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
2
String ulr="webservice地址";
3
Service service=new ObjectServiceFactory().create(IUser.class);
4
IUser user = (IUser)new XFireProxyFactory().create(service,url);
5
//調用
6
user.方法(); 如果服務端接口代碼里的某個方法返回值為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
朔望魔刃 閱讀(558)
評論(0) 編輯 收藏