當前位置:首頁 » 編程語言 » javaaxis與axis2

javaaxis與axis2

發布時間: 2022-05-08 21:08:24

『壹』 java如何通過eclipse安裝axis2來調用webservice

調用這個webservice不需要安裝axis2,但是可以在你的工程里引入Axis2的包來編寫一個RPC客戶端程序。

importjavax.xml.namespace.QName;importorg.apache.axis2.AxisFault;
importorg.apache.axis2.addressing.EndpointReference;
importorg.apache.axis2.client.Options;
importorg.apache.axis2.rpc.client.RPCServiceClient;


按照RPC的方式(可以搜搜,網上很多)寫一個調用函數就ok了,比如:

publicObjectinvokeWebservice()throwsAxisFault{
RPCServiceClientserviceClient=newRPCServiceClient();
Optionsoptions=serviceClient.getOptions();
EndpointReferencetargetEPR=newEndpointReference("http://www.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL");
options.setTo(targetEPR);
options.setTimeOutInMilliSeconds(TIME_OUT);
QNameopAddEntry;
Object[]opAddEntryArgs=null;
Class<?>[]classes=newClass<?>[]{String.class};
opAddEntry=newQName("","");
returnserviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0];
}

『貳』 axis2和axis1.4包的區別

Axis2是WebService的框架。是Axis1.x的替代品。與之類似的技術是XFire和CXF.tomcat是應用伺服器。簡單的理解:axis2實現了WebService。然後你可以在tomcat或者是Jetty上部署用Axis2實現的WebService程序。這個你可以看看SOA方面的書。

『叄』 問個比較弱的問題,我剛接觸webservice ,axis和axis2 有什麼區別啊

Axis全稱Apache eXtensible Interaction System,是apache組織下的一個開源項目,用來做webservice開發的,有java版的實現,也有c++版的實現,其前身最早是IBM的SOAP4J,後來捐給Apache後改名Apache SOAP,也就是支持SOAP1.1的那個版本,到現在的AXIS已經是第三代了,AXIS對Apache SOAP的改進有很多,比如用SAX代替以前的DOM,增加對WSDL的支持,支持SOAP1.2等等

使用axis很easy,在apache網站上把axis下載了後(最新版本1.2.1),把%AXIS_HOME%\webapps\axis整個目錄到tomcat的webapps目錄下面,啟動tomcat,瀏覽器中輸入http://localhost:8080/axis就可以了

上面說的只是axis運行起來了,要想布置自己的webservice,axis支持兩種方法:一種是用JWS(Java Web Service),好處是只要有源碼比如說Hello.java,把他改成Hello.jws後放到%TOMCAT_HOME%\webapps\axis目錄下面就搞定,瀏覽器裡面輸入http://localhost:8080/axis/Hello.jws就可以了,不足的地方是能配置的地方有限(比如說Hello.java裡面的所有public非static方法都會暴露),很多東西沒辦法弄;第二種方法就是使用wsdd(web service deploy description),這個就是在TOMCAT_HOME%\webapps\axis\WEB-INF目錄下寫一個deploy.wsdd和undeploy.wsdd文件,然後通過java org.apache.axis.client.AdminClient deploy.wsdd就搞定了,卸載這個webservice就用org.apache.axis.client.AdminClient undeploy.wsdd,客戶端輸入http://localhost:8080/axis/services/Hello就可以了

介紹了部署webservice的兩種方法後,下面說說客戶端的訪問方式,也有兩種,一種是通過axis實現的java裡面的JAX-RPC進行動態調用,另外一種就是通過伺服器端產生的wsdl文件利用WSDL2Java工具生成Client Stub後訪問。通過JAX-RPC的比較簡單,需要提供的有SOAP router URL,service namespace,operation name,operation parameter types,operation return types,看看下面這個例子就明白了:

public SOAPWrapper() {
String location = "http://localhost:8080/axis/services/BookService";
try {
Service service = new Service();
call = (Call)service.createCall();
call.setTargetEndpointAddress(new url(/location));
} catch (Throwable t) {
handleError("SOAPWrapper (constructor) had an Exception.",t);
}
} public void create(Book book) {
try {
call.removeAllParameters();
call.setOperationName("create");
call.addParameter("arg1",qn,ParameterMode.IN);
call.setReturnType(XMLType.AXIS_VOID);
call.invoke(new Object[] {book});
return;
} catch (Throwable t) {
handleError("SOAPWrapper (create) had an Exception.",t);
return;
}

}

程序中的Call和Service是對JAX-RPC中Call和Service的具體實現:org.apache.axis.client.Call implements javax.xml.rpc.Call,org.apache.axis.client.Service implements javax.xml.rpc.Service

第二種客戶端的方法就是利用WSDL2Java產生Client stub後通過stub調用,WSDL2Java的操作對象是service所對應的wsdl文件,這個文件怎麼產生呢?一種方法前面是由axis自動產生,如前面伺服器端的配置所說,無論通過jws或是wsdd的方式,axis都會產生相應的wsdl;還有一種方式就是利用Java2WSDL對java源文件進行操作也可以產生相應的wsdl文件。

『肆』 java axis2 調用webservice 怎麼捕獲超時異常(即超時了讓它停下來,不要報錯)

在axis2.xml可以設置connection超時時間,超時後會拋出AxisFault,直接捕獲這個異常就好了。

『伍』 如何正確地在Axis,Axis2和Apache CXF之間抉擇

新一代的 Web Services 框架如 Axis2、CXF 都是由現有的項目中逐漸演化而來的,Axis2 是由大家熟悉的 Axis 1.x 系列演化過來,而 Apache CXF 則是由 Celtix 和 XFire 項目整合而生,並且剛剛發布了 2.0.2 的最新版本,不過仍是 Apache 的一個孵化項目。

Axis2 是對 Axis 進行了徹底的重寫的一個新項目了,它使用了新的模塊化架構,更方便於功能性的擴展等等。
Apache CXF 則是由 XFire 和 Celtix 兩個現有的項目進行了重組。

問題:如果現有的應用程序是基於 Axis 1.x、XFire 或者 Celtix 的話,那應該怎麼辦?都遷移到這些新的框架上去嗎?但是即使是要遷移,那應該遷移到哪個框架上去呢?
如果是編寫一個新的 Web Services 應用程序的話,就不存在遷移的問題了,但是哪個框架是你應當選擇進行使用的呢?哪個比哪個更好呢?

對於現在的應用程序的遷移,如果你的應用程序是穩定而成熟的,並且在可預知的未來的情況下,只要很少的一些需求變更要做的話,那麼保存你的體力,不要去做「勞民傷財「的遷移工作了。
如果你的現有應用程序BUG纏身,性能,功能等等都一片糟糕的話,那就要考慮遷移了,那選哪個框架呢?先比較一下它們的不同之處:

1、Apache CXF 支持 WS-Addressing、WS-Policy、WS-RM、WS-Security和WS-I BasicProfile
2、Axis2 支持 WS-Addressing、WS-RM、WS-Security和WS-I BasicProfile,WS-Policy將在新版本里得到支持
3、Apache CXF 是根據Spring哲學來進行編寫的,即可以無縫地與Spring進行整合
4、Axis2 不是
5、Axis2 支持更多的 data bindings,包括 XMLBeans、JiBX、JaxMe 和 JaxBRI,以及它原生的 data binding(ADB)。
6、Apache CXF 目前僅支持 JAXB 和 Aegis,並且默認是 JAXB 2.0,與 XFire 默認是支持 Aegis 不同,XMLBeans、JiBX 和 Castor 將在 CXF 2.1 版本中得到支持,目前版本是 2.0.2
7、Axis2 支持多種語言,它有 C/C++ 版本。
8、Apache CXF 提供方便的Spring整合方法,可以通過註解、Spring標簽式配置來暴露Web Services和消費Web Services

如何抉擇:
1、如果應用程序需要多語言的支持,Axis2 應當是首選了;
2、如果應用程序是遵循 Spring 哲學路線的話,Apache CXF 是一種更好的選擇,特別對嵌入式的 Web Services 來說;
3、如果應用程序沒有新的特性需要的話,就仍是用原來項目所用的框架,比如 Axis1,XFire,Celtrix 或 BEA 等等廠家自己的 Web Services 實現,就別勞民傷財了。

Axis和很多開源包使用的xml解析器都沖突,每次用都遇到問題,特別是再websphere下部署webservice就是惡夢. 有時間看看 CXF!
是的,axis和jfreechart就有沖突.
CXF應該是Apache的孵化項目吧。

這里補充兩句
CXF通過了JAXWS2.0的TCK,目前正在進行JAXWS2.1的開發工作。
CXF的編程模型比AIXS2簡單,而且在Stand alone的方式下執行效率比AXIS2要高很多。

如果你要用JAVA開發Web Services,那用JAXWS API開發可以保證你的代碼在大多數Web Services Framework上正常運行。還有就是如果你還是在使用RPC/Encoding的方式,AXIS 1.x 是你唯一的選擇了。 因為XFire , CXF 以及AXIS2 都不支持RPC/Encoding的編碼方式,要說原因嗎?那主要是在JAXWS 規范中已經把RPC/Encoding的方式拋棄掉了,因為這種編碼方式的互操作性太差了。

『陸』 java axis2調用webservice問題

你在程序中寫個測試方法,看看是不是資料庫連接會有中斷的情況。

『柒』 Java使用axis2調用一個.net 的webservice,報錯java.lang.NoSuchMethodError: doWriteMTOM

這個問題很簡單,有幾個地方可能會導致這個問題。

1、命名空間,在設置調用action的時候指定action的命名空間,具體可以看wsdl文件中的聲明。setOperationName(new QName("http://tempuri.org/HelloWorld","HelloWorld"))

2、http協議版本不同造成的,axis2在做http傳輸時採用的chunked模式,而.net的webserver不支持axis中使用的是HTTP/1.0協議,而.NET和axis2使用的是HTTP/1.1協議,後兩者的區別在於NET未使用ns1的命名空間前綴打包SOAP請求,且axis2使用了Content- Encoding: chunked頭。所以必須在axis2中設置一下。
UserServiceStub stub = new UserServiceStub();
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED,Boolean.FALSE);

具體的還要你試一下,如果方便的話把wsdl文件和java代碼發給我,我看看是哪的問題。

『捌』 java適用axis2調用.net的webservice時有時報錯

說明網路通訊不正常。有可能當時網路狀況不好,讀取超時。可以嘗試加長超時的時間。

網路通訊的程序,有個異常是很正常的。

『玖』 Axis2的具體使用

為了搞個Web Services,讓我真是煞費苦心.還好最後用到了axis,在axis上發布Web Services是一件很輕松的事情.甚至不做配置的情況下都可以採用即時發布.就象JSP的發布

安裝axis需要Servlet容器,我用的是Tomcat-5.0.28,下載Tomcat和axis我就不說了,下載後將axis解壓後,將axis文件夾考到Tomcat的webapps下.

設置環境變數是非常重要的,設置環境變數:AXISCLASSPATH為:

%AXIS_LIB%axis.jar;%AXIS_LIB%commons-discovery-0.2.jar;%AXIS_LIB%commons-logging-1.0.4.jar;%AXIS_LIB%jaxrpc.jar;%AXIS_LIB%saaj.jar;%AXIS_LIB%log4j-1.2.8.jar;%AXIS_LIB%wsdl4j-1.5.1.jar;%AXIS_LIB%xml-apis.jar;%AXIS_LIB%xercesImpl.jar

設置AXIS_LIB為隨便一個文件夾,將上面的一堆jar包搞進去.再將activation.jar, mail.jar, wsdl4j-1.5.1.jar搞到 %CATALINA_HOME%commonlib下.

若啟動Tomcat後在瀏覽器輸入:http://localhost:8080/axis/happyaxis.jsp,若Needed Components都載入了就說明正常啟動了axis.

axis支持兩種發布方式:(先啟動Tomcat)

1.即時發布:直接使用java語言編輯.jws文件,將它放到axis目錄下.

實例:用文本編輯器編寫HelloWorld.jws

public class HelloWorld
{
public String helloWorld(){
System.out.println("Hello World!");
return "Hello World!";
}
}

拷貝到axis下,在瀏覽器中輸入:http://localhost:8080/axis/HelloWorld.jws?wsdl,若顯示出相應的描述,說明發布成功,一般不會失敗的,除非axis本身有問題.

2.定製發布:將編譯完的.class文件放到axisWEB-INF,要包含包的文件夾.然後編寫.wsdd文件,用org.apache.axis.client.AdminClient來發布

實例:編寫並編譯文件Capacity.java.

package samples.capacity;

public class Capacity
{
public double convertGallon2Litre(double gallon,String user){
if("Andy".equals(user))
return gallon * 4.546;
else
return 0.0d;
}
}

將Capacity.class文件拷貝到axisWEB-INFclasses下(帶著文件夾拷),編寫deploy.wsdd文件

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Capacity" provider="java:RPC">
<parameter name="className" value="samples.capacity.Capacity"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>

拷到Capacity.class所在的目錄,在控制台切換到該目錄執行:

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd

顯示如下信息說明發布完畢:

Processing file deploy.wsdd
<Admin>Doneprocessing</Admin>

在瀏覽器輸入http://localhost:8080/axis/services/Capacity?wsdl,若顯示描述,則說明發布成功.(好象要等一段時間才)

調用Web Services:編寫AXISTest.java文件:

package axisexercise;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;

public class AXISTest
{
public static void main(String[] args) throws Exception{
Service service = new Service();
Call call = ( Call ) service.createCall();

//////////訪問即時發布的Distance服務
//設置訪問點
call.setTargetEndpointAddress("http://localhost:8080/axis/Distance.jws");
//設置操作名
call.setOperationName("convertMile2Kilometre");
//設置入口參數
call.addParameter("op1",XMLType.XSD_DOUBLE,ParameterMode.IN);
call.setReturnType( XMLType.XSD_DOUBLE );
Double d1 = new Double( 190 );

//調用服務
System.out.println(d1 + " 英里相當於 " + call.invoke(new Object[] {d1}) + " 公里!");
//////////訪問定製發布的Capacity服務
call = ( Call ) service.createCall();
//設置訪問點
call.setTargetEndpointAddress("http://localhost:8080/axis/services/Capacity");
//設置操作名
call.setOperationName("convertGallon2Litre");
//設置入口參數
call.addParameter("op1",XMLType.XSD_DOUBLE,ParameterMode.IN);
call.addParameter("op2",XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnType( XMLType.XSD_DOUBLE );
d1 = new Double( 10.00 );
String str1 = "ss";

//調用服務
System.out.println(d1 + " 加侖相當於 " + call.invoke( new Object[] {d1,str1} ) + " 升!");
}
}

編譯:javac -classpath .;%AXISCLASSPATH% AXISTest.java

執行:java -classpath .;%CATALINA_HOME%commonlibwsdl4j-1.5.1.jar;%AXISCLASSPATH% axisexercise.AXISTest

顯示如下結果:

log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
190.0 英里相當於 305.71 公里!
10.0 加侖相當於 0.0 升!

若將AXISTest.java中的str1改為Andy,則接過就是45.46升

『拾』 java 中怎樣用axis2調用webservice服務

ServiceClientsender=newServiceClient();
Optionsoption=newOptions();
option.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
option.setAction("http://WebXml.com.cn/getWeatherbyCityName");
EndpointReferenceepfs=newEndpointReference(address);
option.setTransportInProtocol(Constants.TRANSPORT_HTTP);
option.setTo(epfs);
sender.setOptions(option);

OMFactoryfac=OMAbstractFactory.getOMFactory();
OMNamespaceomNs=fac.createOMNamespace("http://WebXml.com.cn/","");
OMElementdata=fac.createOMElement("getWeatherbyCityName",omNs);
OMElementinner=fac.createOMElement("theCityName",omNs);
inner.setText("長沙");
data.addChild(inner);
OMElementresult=sender.sendReceive(data);
System.out.println(result);

熱點內容
phpcgi啟動 發布:2024-05-20 22:38:57 瀏覽:578
嵌入式存儲伺服器 發布:2024-05-20 22:14:55 瀏覽:395
sql分組條件 發布:2024-05-20 22:08:49 瀏覽:16
配網web伺服器一個IP地址 發布:2024-05-20 22:07:16 瀏覽:725
電腦板伺服器地址175 發布:2024-05-20 22:03:30 瀏覽:959
編譯靜態函數時 發布:2024-05-20 21:51:20 瀏覽:351
如何在別人的伺服器加模組 發布:2024-05-20 21:28:29 瀏覽:62
伺服器的bios晶元電腦店有嗎 發布:2024-05-20 21:28:26 瀏覽:225
剪輯電影什麼配置 發布:2024-05-20 21:25:17 瀏覽:819
解壓神器中的詭異事件 發布:2024-05-20 21:17:59 瀏覽:8