拋開MyEclipse,根據(jù)servlet規(guī)范,java_web應(yīng)用必須采用固定的目錄結(jié)構(gòu)。
即:項(xiàng)目名/WEB-INF/classes
項(xiàng)目名/WEB-INF/lib
項(xiàng)目名/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> 里面的參數(shù)name、serviceClass、implementationClass、scope一看就明白
重點(diǎn):寫好服務(wù)端代碼后,只要里面的方法返回值不是map,那么客戶端代碼就統(tǒng)統(tǒng)可以用以下代碼調(diào)用獲得返回值
1
//假設(shè)存在一個(gè)接口為IUser
2
String ulr="webservice地址";
3
Service service=new ObjectServiceFactory().create(IUser.class);
4
IUser user = (IUser)new XFireProxyFactory().create(service,url);
5
//調(diào)用
6
user.方法(); 如果服務(wù)端接口代碼里的某個(gè)方法返回值為map,那么需要在該類同一目錄下建立名字為接口.aegis.xml 名字必須和該接口名字一致只是多了.aegis.xml后綴名文件
內(nèi)容如下(里面均為自己測(cè)試成功的內(nèi)容):
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表示返回類型為復(fù)雜類型(就是個(gè)自定義對(duì)象)
如果返回值為這種Map<Integer,Student>那么就直接寫一個(gè)componentType屬性即可
如果返回值為這種Map<Student,Teacher>那么要寫成<return-type keyType="包名.Student" componentType="包名.Teacher"/>
如果該方法有參數(shù),那么parameter index="0"表示第一個(gè)參數(shù) 依次類推
總之:如果服務(wù)端的接口方法有返回值且是map,那么一定要寫一個(gè)接口.aegis.xml文件否則客戶端無法調(diào)用。
以上測(cè)試沒有使用JAXB,如果根據(jù)wsdl文件生成客戶端代碼,那么需要使用JAXB的API進(jìn)行調(diào)用服務(wù)端的webservice。
在MyEclipse中可以根據(jù)wsdl生成客戶端代碼,流程如下:
選中建好的客戶端webservice項(xiàng)目-點(diǎn)擊new web service-輸入webservice地址 一步一步操作即可生成客戶端代碼。
這種方法與上面的方式不同點(diǎn)在于,自定義對(duì)象的賦值,全部變?yōu)镴AXBElement(new QName("命名空間","屬性名字"),基本屬性.class,"屬性值");
例如通過wsdl生成客戶端后一個(gè)自定義對(duì)象里面包含如下屬性:
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
屬性值=澳大利亞
即和上面一一對(duì)應(yīng)
xfire簡(jiǎn)單用法就上述這么多,明天補(bǔ)上與spring集成的代碼以及關(guān)于前處理后處理(即handler)以及異常處理的代碼
posted on 2011-05-30 17:48
朔望魔刃 閱讀(554)
評(píng)論(0) 編輯 收藏