(原)
Axis2
的
RPC
和
AXIOM
兩種方式
?
因為項目需要在瀏覽器上調(diào)用
webservice
,在瀏覽器上返回自定義的
xml
格式結(jié)果,不需要返回
soap
封裝后的結(jié)果,故使用如下方式實現(xiàn)
項目結(jié)構(gòu)
?
src
--com.lucky.ws
----AdminService.java
--META-INF
----services.xml
?
package
com.lucky.ws;
?
import
org.apache.axiom.om.OMAbstractFactory;
import
org.apache.axiom.om.OMElement;
import
org.apache.axiom.om.OMFactory;
import
org.apache.axiom.om.OMNamespace;
?
public
class
AdminService {
???
/*
???
?* RPC
方式
???
?* public String
validate(String format, String component){
?????? System.out.println("afdasfasfdad");
??????
?????? return "<?xml version=\"1.0\"
encoding=\"UTF-8\"?>"
?????? +"admin>"
?????? +"status>"
?????? +"name>Server</name>"
?????? +"value>[ok|fail]</value>"
?????? +"/status>";
??? }*/
???
???
/*
???
?*
使用
AXIOM
方式
???
?*/
???
public
OMElement validate(OMElement e){
?????? OMFactory fac = OMAbstractFactory.getOMFactory();
?????? OMNamespace omNs =
??????????? fac.createOMNamespace(
""
,
"tns"
);
???????
??????? OMElement admin = fac.createOMElement(
"admin"
, omNs);
?
??????? OMElement status = fac.createOMElement(
"status"
, omNs);
??????? admin.addChild(status);
?
??????? OMElement name = fac.createOMElement(
"name"
, omNs);
??????? name.addChild(fac.createOMText(name,
"Service"
));
??????? status.addChild(name);
??????
??????? OMElement value = fac.createOMElement(
"value"
, omNs);
??????? value.addChild(fac.createOMText(value,
"[ok|fail]"
));
??????? status.addChild(value);
???????
??????? OMElement status2 =
fac.createOMElement(
"status"
, omNs);
??????? admin.addChild(status2);
?
??????? OMElement name2 = fac.createOMElement(
"name"
, omNs);
??????? name2.addChild(fac.createOMText(name2,
"Error"
));
??????? status2.addChild(name2);
??????
??????? OMElement value2 = fac.createOMElement(
"value"
, omNs);
???????
value2.addChild(fac.createOMText(value2,
"msg"
));
??????? status2.addChild(value2);
??????
?
return
admin;
??? }
}
?
?
<!--
???
使用
RPC
方式,這種方式如果在瀏覽器上直接使用
url
調(diào)用的話,返回結(jié)果是
soap
封裝格式,這種方式在
WS
的方法參數(shù)和返回值上可以用戶自定義(原始數(shù)據(jù)類型)
<service
name="admin" scope="application">???
??? <messageReceivers>???
??????? <messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>???
??????? <messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>???
??? </messageReceivers>???
??? <parameter
name="ServiceClass">com.lucky.ws.AdminService</parameter>???
</service>
-->
?
<!--
使用
AXIOM
方式,這種方式可以用戶自己在代碼中定義對象結(jié)構(gòu),在瀏覽器上可以返回用戶自定義的
xml
格式,但是對應(yīng)的
WS
方法的參數(shù)和返回值必須為
final OMElement
類型
-->
<service name=
"admin"
scope=
"application"
>
???
<operation
name=
"validate"
>
???????
<messageReceiver class=
"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"
/>
???
</operation>
???
<parameter
name=
"ServiceClass"
>
com.lucky.ws.AdminService
</parameter>
</service>
?
?
部署:
啟動
tomcat
在
Eclipse
中在項目
src
目錄上右鍵,導(dǎo)出為
aar
包,將該包放入
tomcat_home\webapps\axis2\WEB-INF\services
下,
tomcat
會自動部署,
?
?
訪問:
在瀏覽器上訪問:
http://localhost:8080/axis2/services
/admin/validate?format=xml&component=aa
?
說明:
http://localhost:8080/axis2/services
??
所有
webservice
都一樣
/admin ??????????????????????????????????????????????????????????
在
services.xml
中定義的
webservice
/validate?????????????????????????????????????????????????????????
在
services.xml
中定義暴漏的
WS
方法
?format=xml&component=aa???????????????????????????
參數(shù)隨便(
AXIOM
會將他封裝到
OMElement
的
Child
中,調(diào)用需要遍歷
)
?