以上就是给各位分享webservice应用一:Axis2,其中也会对webserviceaxis调用进行解释,同时本文还将给你拓展Axis2webservice之使用java调用webservice、
以上就是给各位分享webservice应用一:Axis2,其中也会对webservice axis调用进行解释,同时本文还将给你拓展Axis2 webservice 之使用java调用webservice、Axis2 WebService 客户端 Axis2 调用、Axis2 webservice入门--写个简单的webservice、axis2 发布 webservice 和 java调用webservice等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- webservice应用一:Axis2(webservice axis调用)
- Axis2 webservice 之使用java调用webservice
- Axis2 WebService 客户端 Axis2 调用
- Axis2 webservice入门--写个简单的webservice
- axis2 发布 webservice 和 java调用webservice
webservice应用一:Axis2(webservice axis调用)
一、简介:
Axis2 基于新的体系结构进行了全新编写,具有更强的灵活性并可扩展到新的体系结构,灵活的应用Web 服务标准和协议(如 WS-Security等)
是新一代的SOAP引擎
二、准备
axis2所需包下载:http://axis.apache.org/axis2/ ,可用最新版本1.6.2
使用eclipse开发,版本 eclipse-jee-indigo-win32
Tomcat版本:5.0 以上,本人用的6.0
三、配置axis2
1、Eclipse-->点击菜单windows-->Preferences-->WebServices--> Axis2 Preferences -->设置 Axis2 runtime location为Axis2下载后并解压的核心包的位置:
后Eclipse会自动检测包是否正确。如果successfully提示表示设置正确。
四、搭建eclipe的服务器service环境
1、创建server项目
2、选择Tomcat6.0
3、完成,这个时候我们就可以在eclipse中创建web项目了
五、创建dynamic web project
eclipse本身的dynamic web project类似MyEclipse的web project,如果在MyEclipse里创建dynamic web project的话,需要在创建新项目时,选中Show All Wizards:
和创建其他项目类似,还是从file->new->other->web->dynamic web project,
在Eclipse创建一个 WebProject时,点击这个WebProject名字-->右键Properties-->Project Facets中可以设置Web Module。
六、服务器端webservice开发
1、eclipse发布WebService
OK,我们现在已经创建了一个WEB工程websercom,现在我们创建一个包com.test.webservice和一个用于测试的java类TestWebSer.java,代码如下
发布webservice
a、 选中WsPerformenceTest.java文件,点击右键,新建一个Web Service,然后Next。
b、上下分别有个滑块,把上面的滑块滑至最上端(为Test service)。把下方滑块滑至第二格(Develop client)表示生成当前服务的客户端代码(完成后会在Eclipse中会自动生成一个名字为:[当前工程名+Client]的工程)。点击下一步直至完成。步骤如图:
这里的Web Service runtime需要选择Apache Axis2。
C、 启动Server,然后下一步。
D、.这些选项一直保持默认值到完成。我们发现Eclipse已经自动生成了一个新的客户端Web工程,还可以看到Web Service Explorer中显示我们刚刚对外公开的test服务,如下图:
当前列出了当前公开服务的方法及参数。当前的唯一方法test有一个InputBean类型的input参数。点击 Add,转到下图:
点击Go按钮。此时下面的 Status(状态窗口)中会显示调用该方法后的结果。点击Source可以浏览到已经被SOAP分装好该服务的XML文件。
显示生成webserviceClient
部署启动Tomcat后客户端显示
产生wsdl 地址 http://localhost:8080/websercon/services/TestWebSer?wsdl
七、webservice客户端开发
在六模块中已经介绍,在生成服务端webservice时直接用eclipse生成webservice客户端。
但是,我们一把在开发的时候,不会用到这种方式,很多时候,我们能够拿到的只是wsdl地址,我们应该怎样做,OK,下面说一下,怎么webservice的客户端的开发,用一个接单的DEMO说明
1、新建一个web工程
建立web工程做法如上:webClientTest工程
2、使用wsdl地址生成客户端代理等。
我们使用刚才建立的wsdl地址的服务器端
3、编辑客户端代码
package com.test.main;
import java.rmi.remoteexception;
import org.junit.Test;
import com.test.webservice.TestWebSerProxy;
public class TestService {
@Test
public void testAddService(){
TestWebSerProxy proxy = new TestWebSerProxy();
String str = null;
try {
str = proxy.add("1","2");
} catch (remoteexception e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
System.out.println("test axis webservice method add:" + str);
}
}
3、部署测试就OK了。
Axis2 webservice 之使用java调用webservice
在上一篇中写了一个简单了webservice,实现了一个sayHello功能。那么webservice写好之后我们如何使用Java程序来调用webservice呢?
一、java调用的webservice的第一种方式:RPC调用AXIS2 webservice
下面这个方法是我抽象出来的一个方法,
import javax.xml.namespace.QName; org.apache.axis2.AxisFault; org.apache.axis2.addressing.EndpointReference; org.apache.axis2.client.Options; org.apache.axis2.rpc.client.RPCServiceClient; public class Client { /** * @param args * @throws Exception */ static void main(String[] args) throws Exception { // 调用PublishWebService String wsdlUrl = "http://localhost:8080/DigitalProduct/services/PublishWebService?wsdl";//webservice地址 String method = "updatePublishSysParam"; //调用的那个方法 Object[] param = new Object[] { "AASSDDFF" };//传递的参数值 String namespaceUrl1 = "http://service.digitalproduct.tkbs.com";//命名空间 Class[] opReturnType1 = new Class[] { String[]. };//返回值类型 String result = axis2RPCInvoke(wsdlUrl,method,param,namespaceUrl1,opReturnType1); System.out.println(result); } * RPC调用AXIS2 webservice * * wsdlUrl * 服务地址 如:http://192.168.0.1:2597/aixs2/services/jqservice?wsdl * methodName * 方法名 如<xs:element name="Receive"> * parameter * 方法参数 如Object[] opArgs = new Object[] { param }; * namespaceURI * 命名空间 如 :targetNamespace="http://server.test.com.cn"> * returnType * 返回类型 如字符串:Class[] opReturnType = new Class[] { String[].class * }; static String axis2RPCInvoke(String wsdlUrl,String methodName,Object[] parameter,String namespaceURI,Class[] returnType) { Object[] ret = null; RPCServiceClient serviceClient = ; try { /* * 此处RPCServiceClient 对象实例建议定义成类中的static变量 ,否则多次调用会出现连接超时的错误。 */ serviceClient = new RPCServiceClient(); Options options = serviceClient.getoptions(); EndpointReference targetEPR = EndpointReference(wsdlUrl); options.setTo(targetEPR); QName opQName = QName(namespaceURI,methodName); ret = serviceClient.invokeBlocking(opQName,parameter,returnType); System.out.println(((String[]) ret[0])[0]); } catch (AxisFault e) { e.printstacktrace(); } return ((String[]) ret[0])[0]; } }
二、使用java调用webservice的第二种方式:使用myeclipse中的axis2插件生成客户端代码
new -->others到如下界面:
点next 到如下界面:
现在我们想生成调用webservice的客户端代码,首先我们需要生成一个service.wsdl文件,选择第2个,点next,
在界面里边点击add folder 选择项目--》webroot--》webinf-->classes,输入好webservice那个类的全名后点击Test Class Loading ,这时候如果你选择的路径是对的,类全名是对的,就可以点next,否则next按钮式灰色的。如图:
然后点击next,这个界面中的内容基本不用修改,有一个service name,你可以改成你自己取。
继续点next 在界面中选择wsdl文件的输出路径,选择第一个,就是输出到当前的workspace,的某个项目下,选择第二个,就是输出到系统文件夹中,例如你可以选择桌面。
这里我选择第二个,然后点browse选择桌面,点finish,会看到桌面上有一个service.wsdl文件。
下面我们就可以根据这个wsdl文件生成客户端代码了。
首先建一个java项目,例如取名myclient
new -->others-->
选择第1个,点next.
在界面中点 browse找到你刚才生成service.wsdl文件。
点next,这个界面不用管,继续点next
这个时候需要选择代码生成的地方,选择当前工作的workspace,然后选择刚才新建的myclient如图:
点finsh,刷新myclient项目会看到src下多了两个java文件:TestServiceCallbackHandler 和 TestServiceStub
接下来就可以写java代码调用了,如下:
myservice.service.TestServiceStub; Test { Exception Todo Auto-generated method stub 初始化Sub类 TestServiceStub stub = TestServiceStub(); 传递AxisServiceStub.ShowName对象,相关参数在这边赋值。 TestServiceStub.SayHello command = TestServiceStub.SayHello(); command.setName("zhangsan"); 取得返回值 String name = stub.sayHello(command).get_return(); System.out.println(name); } }
如此,第二种方式就写完了。
公司几个同事都喜欢第二种。但是,我个人喜欢用第一种。第二种方式如果插件使用熟练的话,很快就可以生产客户端代码,然后测试代码也可以很快写出来。
注:可能会出现错误,根据我的经历的错误经验,有以下情况:
1.tomcat端口问题,你打开刚才插架自动生成的TestServiceStub 类 ctrl+f查找 http://localhost,查到后看他后面的端口是多少,是不是8080,?好像生成的就是8080,但是我们的tomcat可能被自己修改过,端口可能不是8080,所以这里你要改这个端口。
2.spring的注入问题,如果你写的webservice是在spring整合的环境下,可能会报错误,一般是由 spring注入失败,导致xxxService类注入失败。关于这个我下一篇会详细解释。
3.一切都正常,打断点调试看到方法执行成功了、执行完毕了,但是并没有成功的返回我们要的结果,而是报超时了,这时候,我们需要在TestServiceStub 中加入一行代码
这行代码的作用是 规定超时时间 是多长,例如你可以设为10分钟。_operationClient.getoptions().setTimeOutInMilliSeconds(600000L); //600*1000毫秒(10分钟
我感觉这样设置不合理,但是可以解决这个错误,让你的程序运行成功,看到运行成功返回的结果。才有继续学习的劲头啊。
Axis2 WebService 客户端 Axis2 调用
第一 RPC 方式,不生成客户端代码
第二,document 方式,不生成客户端代码
第三,用 wsdl2java 工具,生成客户端方式调用
package samples.quickstart.client;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.rpc.client.RPCServiceClient;
import samples.quickstart.StockQuoteServiceStub;
import samples.quickstart.xsd.GetPrice;
import samples.quickstart.xsd.GetPriceResponse;
public class StockQuoteClient {
/**
* 方法一:
* 应用rpc的方式调用 这种方式就等于远程调用,
* 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
* 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
*
【注】:
如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
第一个参数的类型是QName对象,表示要调用的方法名;
第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。
如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法
该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
也就是 <wsdl:definitions>元素的targetNamespace属性值。
*
*/
public static void testRPCClient() {
try {
// axis1 服务端
// String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
// axis2 服务端
String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService?wsdl";
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
Options options = serviceClient.getOptions();
//确定目标服务地址
options.setTo(targetEPR);
//确定调用方法
options.setAction("urn:getPrice");
/**
* 指定要调用的getPrice方法及WSDL文件的命名空间
* 如果 webservice 服务端由axis2编写
* 命名空间 不一致导致的问题
* org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0
*/
QName qname = new QName("http://quickstart.samples/xsd", "getPrice");
// 指定getPrice方法的参数值
Object[] parameters = new Object[] { "13" };
// 指定getPrice方法返回值的数据类型的Class对象
Class[] returnTypes = new Class[] { double.class };
// 调用方法一 传递参数,调用服务,获取服务返回结果集
OMElement element = serviceClient.invokeBlocking(qname, parameters);
//值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
//我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
String result = element.getFirstElement().getText();
System.out.println(result);
// 调用方法二 getPrice方法并输出该方法的返回值
Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
// String r = (String) response[0];
Double r = (Double) response[0];
System.out.println(r);
} catch (AxisFault e) {
e.printStackTrace();
}
}
/**
* 方法二: 应用document方式调用
* 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合
*/
public static void testDocument() {
try {
// String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
Options options = new Options();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
options.setTo(targetEPR);
// options.setAction("urn:getPrice");
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMFactory fac = OMAbstractFactory.getOMFactory();
String tns = "http://quickstart.samples/";
// 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的
OMNamespace omNs = fac.createOMNamespace(tns, "");
OMElement method = fac.createOMElement("getPrice", omNs);
OMElement symbol = fac.createOMElement("symbol", omNs);
// symbol.setText("1");
symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));
method.addChild(symbol);
method.build();
OMElement result = sender.sendReceive(method);
System.out.println(result);
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
}
}
/**
* 为SOAP Header构造验证信息,
* 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息
*
* @param serviceClient
* @param tns 命名空间
* @param user
* @param passwrod
*/
public void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(tns, "nsl");
OMElement header = fac.createOMElement("AuthenticationToken", omNs);
OMElement ome_user = fac.createOMElement("Username", omNs);
OMElement ome_pass = fac.createOMElement("Password", omNs);
ome_user.setText(user);
ome_pass.setText(passwrod);
header.addChild(ome_user);
header.addChild(ome_pass);
serviceClient.addHeader(header);
}
/**
* 方法三:利用axis2插件生成客户端方式调用
*
*/
public static void testCodeClient() {
try {
String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
StockQuoteServiceStub stub = new StockQuoteServiceStub(url);
GetPrice request = new GetPrice();
request.setSymbol("ABCD");
GetPriceResponse response = stub.getPrice(request);
System.out.println(response.get_return());
} catch (org.apache.axis2.AxisFault e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
StockQuoteClient.testRPCClient();
// StockQuoteClient.testDocument();
// StockQuoteClient.testCodeClient();
}
}
wsdl2java 用于根据 WSDL 生成相应的服务端和客户端代码的生成工具。
命令行格式为:WSDL2Java [options] -uri <url or path> : A url or path to a WSDL
例如:
wsdl2java -uri http://localhost:8080/cxfService_0617/services/Hellows?wsdl -s -o build\client
其中常用的 options 具体如下:
-o <path> : 指定生成代码的输出路径
-a : 生成异步模式的代码
-s : 生成同步模式的代码
-p <pkg> : 指定代码的 package 名称
-l <languange> : 使用的语言 (Java/C) 默认是 java
-t : 为代码生成测试用例
-ss : 生成服务端代码 默认不生成
-sd : 生成服务描述文件 services.xml, 仅与 - ss 一同使用
-d <databinding> : 指定 databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri
-g : 生成服务端和客户端的代码
-pn <port_name> : 当 WSDL 中有多个 port 时,指定其中一个 port
-sn <serv_name> : 选择 WSDL 中的一个 service
-u : 展开 data-binding 的类
-r <path> : 为代码生成指定一个 repository
-ssi : 为服务端实现代码生成接口类
-S : 为生成的源码指定存储路径
-R : 为生成的 resources 指定存储路径
–noBuildXML : 输出中不生成 build.xml 文件
–noWSDL : 在 resources 目录中不生成 WSDL 文件
–noMessageReceiver : 不生成 MessageReceiver 类
Axis2 webservice入门--写个简单的webservice
上一篇介绍了webservice开发前的准备。下面开始写webservice。如果不了解axis2请看上一篇,如果是新手:建议一边看一边写代码,自己动手完成这个过程。
一、新建一个web项目
二、新建一个类,类名随便取,并写一个最简单的方法。如下
package com.webservice.myservice
public class TestService{
//问好 public String sayHello(String name){ return "Hello,"+name; }
}
三、打包,这个时候需要用到上次安装好的插件。这里我就不上图了,
new--》others--》Axis2 Service Archiver-->next-->
在class filelocation中选择你项目webroot下的classes如(E:\Workspace\myservice\Webroot\WEB-INF\classes)
---》点击next,勾选 Skip WSDL--》next-->继续next--》勾选Generate the service xml au..lly-->点next
界面中service name 你可以随便写(如MyService),具体这个名字代表什么,继续下去,发布之后你就知道了,
界面中Class Name 写你刚才那个webservice类的全名,一我这个为例,这里我需要写com.webservice.myservice.TestService
---》点击load按钮,会加载我们service类,下面的框框下面会显示我们写的webservice方法,这里需要勾选Search declared methods only
-->next --》选择输出的路径,如桌面,输入一个Output File Name 这个名字就是将要输出的aar文件的名字。--》next,桌面上就会出现一个xxx.aar文件。
四,发布webservice到tomcat。
1.将上一步骤中生存的xxx.aar文件复制到Tomcat6.0.20\webapps\axis2\WEB-INF\services下
注:这个路径上一篇文章有提到,如果你的tomcat下没有这个路径,就把你下载的axis2.war文件放到Tomcat6.0.20\webapps下,然后重启tomcat,就可以看到这个文件夹了。
2.在一完成之后,启动tomcat,在浏览器中输入 http://localhost:8080/axis2/ 点击Services 可以看到如下:
解释:此处的MyService便是我们发布的webservice名称,下面的sayHello便是我们写的webservice方法。
这是,我们在浏览器输入: http://localhost:8080/axis2/services/MyService/sayHello?name=zhangsan 如图所示
webservice写好了,我们在程序中如何调用呢?下一篇介绍如何使用java程序调用axis2 webservice。
axis2 发布 webservice 和 java调用webservice
apache-tomcat-6.0.35.zip axis2-1.6.1-war.zip解压,然后将axis2.war复制到tomcat的webapp目录中,安装完毕!
启动tomcat测试axis2是否安装成功:
http://localhost:8080/axis2
2.首先简单介绍一下webapp/axis2/的目录结构如下:
axis2 |-- axis2-web | |-- xxx.jsp... |-- meta-inf |-- WEB-INF | |-- classes | |-- conf | |-- lib | |-- modules | |-- services | | |-- version-1.6.1.aar | |-- web.xml其中,services目录就是用来发布webservice的目录,这里有一个自带的service:version-1.6.1.aar
3.开发service端:HelloService .java
package com.service; public class HelloService { public String getName(String name) { return "hello: " + name; } }
4.配置文件:service.xml
<service name="HelloService"> <description>HelloWorld webservice</description> <parameter name="ServiceClass"> com.service.HelloService </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver"/> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service>
5.建立如下的目录结构:
test |-- meta-inf | |--services.xml | |-- com | |-- service | |-- HelloService.java | |-- HelloService.class这里test可以随便命名,然后要把test目录里面的所有文件打包成zip格式的,后缀必须是*.aar。
打包方法1,使用7-Zip压缩工具打包,格式选择zip,压缩之后,把文件的后缀改为aar,test.aar。
打包方法2,其实“con/...”这个部分是class文件,可以放入/webapps/WEB-INF/class目录下。也就是说打包的时候可以之打包“meta-inf/...”部分。而“con/...”部分可能会经常更改,在Eclipse开发过程中可以放入src目录中。
打包完成之后,然后将文件test.aar复制到services目录下面。重启tomcat,进行测试:
http://localhost:8080/axis2/services/listServices
6.开发客户端:RPcclient.java
package com.client; import javax.xml.namespace.QName; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; public class RPcclient { public static void main(String[] args) throws Exception { RPCServiceClient client = new RPCServiceClient(); Options options = client.getoptions(); // 指定调用WebService的URL options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloService")); // 指定getName方法的参数值 Object[] objects = new Object[] { "超人" }; // 指定getName方法返回值的数据类型的Class Class<?>[] classes = new Class[] { String.class }; // 指定要调用的方法名:getName 和 WSDL文件中的命名空间:http://service.com // 注意:命名空间(http://service.com)与类HelloService的包名(com.service)有一定关系。 QName qname = new QName("http://service.com","getName"); String result = (String) client.invokeBlocking(qname,objects,classes)[0]; System.out.println(result); } }
7.运行客户端,端测试结果: 你好 超人
今天的关于webservice应用一:Axis2和webservice axis调用的分享已经结束,谢谢您的关注,如果想了解更多关于Axis2 webservice 之使用java调用webservice、Axis2 WebService 客户端 Axis2 调用、Axis2 webservice入门--写个简单的webservice、axis2 发布 webservice 和 java调用webservice的相关知识,请在本站进行查询。
本文标签: