当前位置:首页 » 编程语言 » 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);

热点内容
bilibili不能缓存 发布:2024-05-21 03:31:14 浏览:617
解压剃发 发布:2024-05-21 03:16:27 浏览:641
服务器怎么连接到电脑显示屏上 发布:2024-05-21 02:38:21 浏览:286
织梦安装数据库连接失败 发布:2024-05-21 02:37:45 浏览:259
python编程入门经典pdf 发布:2024-05-21 02:31:45 浏览:7
arm编译添加驱动 发布:2024-05-21 02:02:28 浏览:476
安卓设置页面是怎么 发布:2024-05-21 01:32:51 浏览:521
学生成绩管理系统数据库设计 发布:2024-05-21 01:14:41 浏览:43
我的世界什么指令直接出现服务器 发布:2024-05-21 01:10:00 浏览:397
星等算法 发布:2024-05-21 00:53:06 浏览:509