axis2生成客户端代码的四种方式
安装使用AXIS2的WSDL2JAVA工具来生成客户端代码
1.为eclipse安装Axis2插件,将我提供的Axis2_Codegen_Wizard_1.4.0文件夹放到MyEclipse 6.0\eclipse\plugins 下,如果是其他版本的Eclipse则需要下载相应插件(注意:要将myeclipse关闭后重新打开才能生效)2.我的示例创建了一个名为axisClient的Web项目。
3.然后在src上New—Other。
可以看到我们配置的Axis2插件已经成功了。
然后选择Axis2 Wizards下的Axis2 Code Generator,Next。
5. /WebServices/WeatherWS.asmx?wsdl是一个提供免费天气预报服务的网络WSDL文件。
我们先打开该网页,将其中的内容另存为WSDL文件(保存的时候以.WSDL结尾)。
6.选择要生成java源文件的wsdl文件的位置。
如下图:7.选择默认即可,当然也可以自己配置,比如自己设置客户端生成应用文件的包。
8.为要生成的文件选择存放的地点。
我们将他放在我们项目的src目录下,然后Finish。
9、刷新我们的axisClient项目,右键——refresh。
然后可以看到,我们的src目录下生成了,build.xml和src.custom包,包下面有两个文件:WeatherWebServiceCallbackHandler.Java和WeatherWebServiceStub.java。
我们自己将这两个文件调整到custom下。
package custom;import java.rmi.RemoteException;import org.apache.axis2.AxisFault;import custom.WeatherWebServiceStub.GetWeatherbyCityName;import custom.WeatherWebServiceStub.GetWeatherbyCityNameResponse;public class ClientTest {public static void main(String[] args) throws RemoteException {//客户端访问类WeatherWebServiceStub wwss=new WeatherWebServiceStub();/** 因为查询天气的城市参数是GetWeatherbyCityName对象,* 所以需要实例,然后设置要查询天气的城市*/GetWeatherbyCityName gwcn=new GetWeatherbyCityName();gwcn.setTheCityName("西安");/** 查询天气* 返回GetWeatherbyCityNameResponse对象* 该对象的getGetWeatherbyCityNameResult().getString()可以返回一个包含天气信息的数组* 循环数组,输出信息*/GetWeatherbyCityNameResponse gwcnr=wwss.getWeatherbyCityName(gwcn);for(String s:gwcnr.getGetWeatherbyCityNameResult().getString()){System.out.println(s);}新版本代码如下:。
Axis2教程
WebService 是为程序服务的,叧在浏览器中访问 WebService 是没有意义的。因此,在本节使用 Java 实现了一个 控制台程序来调用上一节发布的 WebService。调用 WebService 的客户端代码如下:
package client;
Axis2 是目前比较流行的 WebService 引擎。WebService 被应用在徆多丌同的场景。例如,可以使用 WebService 来发布服务端 Java 类的方法,以便使用丌同的客户端迚行调用。这样可以有效地集成多种丌 同的技术来完成应用系统。WebService 还经常被使用在 SOA 中,用亍 SOA 各个部分交换数据。本课程 重点讲觋了 Axis2 的核心功能,幵提供了三个项目以使学员理觋幵掌握如何将 Axis2 应用亍丌同的场景。 本课程站在刜学者觊度介绍了 Axis2 的大多数常用的功能,例如,以多种方式编写和发布 WebService、 JAX-RPC、JAX-WS、复杂类型传输、WebService 会话管理、Axis2 模块等。本课程共分为两部分,其中 第一部分为 Axis2 基础知识讲觋。在这部分介绍了前面所述的 Axis2 知识。第二部分介绍了三个小的项目。 这三个项目的功能类似。所丌同的是,它们使用了丌同的技术来实现。第一个项目使用 Java Swing 技术 实现了个人信息管理(PIM)系统,这个系统可以对个人信息(如姓名、职位、电话等)迚行增、初、改、 查。在这些操作中,涉及到了如何使用 WebService 来传输和下载图像文件、传输查询结果(Resultset 对象)等技术难点。第二个项目使用 Struts 2.1.6(目前 Struts 2 的最新版,2009 年 1 月发布)来实现 PIM。功能不第一个 PIM 类似。叧是这个系统为 Web 版。在这个项目中学员可以学习到如果将 WebService 应用在 Web 程序中。该系统的主要思想是如果 Web 程序和 WebService 部署在同一台机器上,Web 程 序可以直接调用 WebService 所对应的 Java 类。当然,也可以象第一个项目一样,直接通过 HTTP SOAP 协议调用 WebService。在第二个项目中同时使用了这两种方式来实现。这两种调用方式分别封装在两组 Model 类中。可以通过配置 struts.xml 文件来提定使用哪组模型类(调用方式)。第三个项目使用了 C# 来实现 PIM。这个项目的目的是为了演示如何将.net 技术不 Java 技术集成来实现一个完整的应用。一个 团队要想获得成功,需要每个成员通力合作,各尽所长。而在一个项目中,也和一个团队是一样的,没有 哪一种技术适合做所有的事情,因此,需要将各个领域的杰出代表组成一个技术团队。例如,Java 适合做 企业应用,也能跨平台,比较适合做服务端程序,但它在客户端(C/S)的实现上略显丌足,而.net(以 C#为代表)和 visual studio 是 windows 上诧言和开发工具的王者,在 GUI 上有着无法超越的优势。因 此,将 Java 和.net 结合是最完美的联姻。学员仍这个项目中就会体会到这个优势所在。
axis2客户端编码,RPC,OMElement,上传下载实现,服务端验证
return false;
} finally {
if (fos != null) {
try {
fos.close();
// 参数,如果有多个,继续往后面增加即可,不用指定参数的名称
Object[] opAddEntryArgs = new Object[] {"cuisuqiang" };
// 返回参数类型,这个和axis1有点区别
} catch (Exception e) {
return false;
} finally {
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
}
}
}
/*
* 请求的方法,输出接收到的参数,返回时间戳字符串
*/
public String getServiceInit(String name){
System.out.println("you name is :" + name);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(new Date());
}
// 下载图像
public byte[] dowImageWithByte() {
byte[] imageByte = null;
try {
// 下面的代码调用uploadImageWithByte方法上传图像文件
利用wsdl文件生成基于axis2c的c客户端代码
解压之后,编译源码进行安装。参数 prefix 用来指定安装目录,enable-openssl 用来指定 是否需要访问具有 SSL 的 REST API 系统。如下图所示: 图 2. 编译并安装
安装命令 1、 ./configure --prefix=/zhaojian/axis2c/ --enable-opensal=yes 2、make 3、make install
图 6. 启动 AXIS2/C Server 失败
我们可以通过使用启动命令参数 -p 来修改端口号,如下图所示:
图 7. 修改端口
Axis2c Server 启动之后,就可以运行用例代码了,
如何生成 c 语言客户端代码与应用处理
生成客户端代码,并进行应用处理。
1、我们需要一个 wsdl 文件,文件内容如下: <wsdl:definitions xmlns:apachesoap="/xml-soa p" xmlns:impl="http://192.168.1.35:8080/Axis2Dome/services/axis2S ercie" xmlns:intf="http://192.168.1.35:8080/Axis2Dome/services/ax is2Sercie" xmlns:soapenc="/soap/encodin g/"xmlns:wsdl="/wsdl/" xmlns:wsdlsoap=" /wsdl/soap/" xmlns:xsd="http://www.w3.o rg/2001/XMLSchema" targetNamespace="http://192.168.1.35:8080/Axis 2Dome/services/axis2Sercie"> <!-WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT) --> <wsdl:message name="simpleMessageResponse"> <wsdl:part name="simpleMessageReturn" type="xsd:string"></wsdl:pa rt> </wsdl:message> <wsdl:message name="simpleMessageRequest"> <wsdl:part name="name" type="xsd:string"></wsdl:part> <wsdl:part name="pwd" type="xsd:int"></wsdl:part> </wsdl:message> <wsdl:portType name="AxisDomeService"> <wsdl:operation name="simpleMessage" parameterOrder="name pwd">
Axis2 快速入门指南
Apache Axis2 中文文档(04) -- Axis2 快速入门指南/axis2/1_4_1/quickstartguide.h tmlAxis2快速入门指南本指南的目的是为了让您尽快掌握使用Axis2建立服务端和客户端的技术。
下文将以一个简单的股票询价(StockQuote)服务为例演示创建和部署服务的不同方法,并快速浏览一下几个Axis2附带的工具。
然后,再看看如何创建客户端来访问这些服务。
目录导言准备Axis2服务创建服务部署POJOs使用AXIOM构建服务使用ADB生成服务使用XMLBeans生成服务使用JiBX生成的服务生成客户端使用AXIOM创建一个客户端使用ADB生成客户端使用XMLBeans生成客户端使用JiBX生成客户端总结参考资源安装要点本文中的代码均包含在标准二进制分发包中,它们位于Axis2_HOME/samples内的quickstart、quickstartadb、quickstartaxiom、quickstartjibx和quickstartxmlbeans目录中。
(为便于接下来的学习,建议您现在就找到它们)。
代码中同时还提供了所有示例程序的Ant构建文件(build.xml),这将简化例程的编译过程。
导言让我们先从服务本身开始。
作为例子的服务应该足够简单以便让你能够看到在建立和部署服务的时候究竟发生了什么。
股票报价服务(Stock Quote Service)似乎是一个不错的例子。
让我们看看代码1的例子。
Code Listing 1: The StockQuoteService classpackage samples.quickstart.service.pojo;import java.util.HashMap;public class StockQuoteService {private HashMap map = new HashMap();public double getPrice(String symbol) {Double price = (Double) map.get(symbol);if(price != null){return price.doubleValue();}return 42.00;}public void update(String symbol, double price){map.put(symbol, new Double(price));}}这个简单的服务程序仅提供了两个调用接口。
Axis2分析
Axis2 的管道模型
可以使用一组关系对 Axis2 的核心消息处理部分进行建模。 Axis2 引擎的传入消息会通过“ In ”管道。所有传出消息都会通过 “Out”管道。
通过组合使用不同数量的 In 和 Out 管道,Axis2 可以处理任何 MEP。例如,可以使用一个 In 管道和一个 Out 管道来支持进行 Inout 交互。可以使用一个 In 管道来支持 In-Only 交互。这些管道 之间的连接由消息接受者进行。
3.ServiceDeployer
区别 POJODeployer 和 ServiceDeployer 本质上相同,唯一的 区别在于:前者是部署单一服务的,而后者是部署多个服务 端;POJO多一个方法setMessageReceivers。 ModuleDeployer 是模块部署,本质与服务部署相似,但其 没有实现 unDeploy 方法 ,说明它是不需要撤销的;
部署与测试
部署模块是用于部署Web Service的模块。部署模型提供了详细配置Axis2的机制, 主要有三个部分来配置Axis2。 Axis2.xml文件 这个文件为客户端和服务器端提供了全局的配置,主要包括下面的信息。
全局参数
注册的发送传输器(Transport In)和接收传输器(Transport Out) 用户定义的阶段名 全局被用到的模块 服务包(Service Archive) 服务包必须包含META-INF/services.xml文件和一些相关的类,services.xml包 含以下信息 服务级的参数 服务级的模块 模块包(Module Archive) 模块包必须包含META-INF/module.xml文件和一些相关的类,module.xml包含了 模块参数和在其中定义的操作。 服务中特定消息接收器 服务内部的操作 全局的消息接收器
axis2配置手册
用Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中。
这似乎有些不方便,为此,Axis2也允许将带包的POJO类发布成Web Service。
先实现一个POJO类,代码如下:package service;public class MyService{public String get Greeting(String name){return "您好 " + name;}public void update(String data){System.out.println("<" + data + ">已经更新");}}这个类有两个方法,这两个方法都需要发布成Web Service方法。
这种方式和直接放在pojo目录中的POJO类不同。
要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:<service nam e="myService"><description>Web Service例子</description><parameter name="ServiceClass">service.MyService</parameter><messageReceivers><m essageReceiver m ep="/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> <m essageReceiver m ep="/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/> </messageReceivers></service>其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService 的WSDL内容:http://localhost:8080/axis2/services/m yService?wsdl其中name属性名就是上面URL中"?"和"/"之间的部分。
把wsdl2转换成Java代码详解
下载axis2-1.6.1-bin.zip的版本(axis版本可以自己跟换),下载完后解压放在本地磁盘上。
在dos窗口下找到这个解压文件的路径。
跳转到bin目录下(如:axis在E盘下,则进入doc后输入命令,E: 回车,在输入cd axis2-1.6.1\bin)。
在里面执行相应的转化过程即可。
命令有如下:<path> : 指定生成代码的输出路径-a : 生成异步模式的代码-s : 生成同步模式的代码-p <pkg> : 指定代码的package名称 (生成的Java文件包名)-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指定存储路径-uri : wsdl文件路径-o :Java文件输出路径--noBuildXML : 输出中不生成build.xml文件--noWSDL : 在resources目录中不生成WSDL文件--noMessageReceiver : 不生成MessageReceiver类下面是例子:ETOS2SMS.wsdl生成客户端代码clientwsdl2java.bat --noBuildXML -t -p com.eastelsoft.etos2.facade.ws.sms.client -o ..\src -uri ..\src\config\META-INF\ETOS2SMS.wsdl生成服务器代码serverwsdl2java.bat --noBuildXML -ss -ssi -sd -p com.eastelsoft.etos2.facade.ws.sms -ns2p/=com.eastelsoft.etos2.facade.ws.sms.objs,http://etos.east /v1=com.eastelsoft.etos2.facade.ws.sms.objs -o ..\src -uri ..\src\config\META-INF\ETOS2SMS.wsdl。
Axis2中文手册
中文原文英文原文概述这个说明文档涉及以下内容:⌝如何使用 axis2 创建 web service 和客户端程序⌝如何定制一个模块 (Module) 并在 web service 中使用它⌝ Samples discussion⌝ Advanced Topics第一部分:简介Axis2 是重新设计的一个架构,它没有基于 Axis1.* 的结构,这种新的架构 much more flexible, efficient and configurable 。
Axis2 的特性有:Speed:采用自己的对象模型,利用 StAX 解析Low memory foot print:Axis2 在设计过程中一直遵循 low memory cost 的理念AXIOM:采用自己的轻量级的对象模型,使得消息处理过程可扩展、性能高,对开发者来说更加简单。
Hot Deployment:Axis2 装备了在系统运行时部署服务和处理器的能力。
也就是说,新的服务新服务的添加不再需要重启服务器。
将服务的发布包放在服务部属文件夹中,部署模型将自动部署该服务。
Asynchronous Web Services:Axis2 现在可以通过 non-blocking clients and transports 支持异步的服务和异步的服务调用。
(?什么是异步的服务 ? )MEP Support:Axis2 具备良好的伸缩性来支持 MEPs ,因为它内置了对 WSDL2.0 中 MEPs 的支持。
Flexibility:Axis2 的架构使得程序员能自由的对 Axis 添加扩展,这些扩展包括对自定义 Header 的处理,系统管理,甚至是任何一件你可以想象的到的事情Stability:Axis2 定义了一套公共接口,这些接口相对于其他代码而言改动很小Component-oriented Deployment:你可以自定义一些在处理过程中常用的可重用的处理器,并可以将这些处理器发布出来供其它人使用Transport Framework:定义了一个干净、简单的抽象作品来集成任意的传输协议,引擎的核心部分的实现是与传输协议无关的Add-ons:一些 web service 相关的协议也合并了进来。
IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码图文详解
4.ok
5.
6.最最要的地方,能改变一生的决定,就在于这!!! 请打开自己生成的wsdd文件 -复制<service。。。标签里所有内容替换到web.WEB-INF.server-config.wsdd service 标签步骤看以下图片
7. 8.
9. 10.
11.切记,端口号,不要设置6666,要么,tomcat启动,但是找不到网页,设置8987,就行。
package client; import javax.xml.rpc.ServiceException; import java.rmi.RemoteException; public class TestController {
public static void main(String[] argv) { try { CSPRequestService ctmsSoapBindingStub = new CSPRequestServiceLocator(); String CSPID = "ljkljklgjghjhgj6544654"; String LSPID = "tyfghgfhgfhgfh65465g4hf65gfh4g6f5h46"; String correlateID = "fghgfhgf6h54gf65h4gf6h54gf65h"; String cmdFileURL = "ghfhgfh6gf5h46gf5h4gf65h4fg65hf4h6g5h4f65"; CSPResult cspResult = ctmsSoapBindingStub.getctms().execCmd(CSPID, LSPID, correlateID, cmdFileURL);
使用axis自动生成webservice客户端代码
利用AXIS生成客户端文件,使得开发webservice更加简单,以下是我的个人代码,工具:Myeclipse7.0,axis1.4,tomcat5.5,jdk1.5一、下载axis的jar包,我的是axis-bin-1_4.zip包,解压后有axis的lib目录,一会儿我们要用,二、在myeclip se中创建自己的webservice工程,这个在的文库里有,三、在C盘目录下创建一个批处理文件,我的名字是wsdltojava.bat,内容如下:set Axis_Lib=E:\jar\axis\asixTool\axis-bin-1_4\axis-1_4\libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Axis_Servlet=http://localhost:8090/myAxis/services/HelloWorld?wsdl %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -u %Axis_Servlet%备注:红色字体我的axis的目录,也就是刚才我解压出来的axis,蓝色是我的webservice的访问地址,其他的不用处理,然后双击这个文件,产生以下几个文件:(1)、目录是:C:\localhost\myAxis\services\HelloWorld(2)、四、将这四个文件拷贝到你的客户端,创建客户端运行即可附录代码:服务端HelloWorld.javapackage webservice.axis.test;public class HelloWorld {public String hello(){return"Hello "+"aaaaaaaaaaaaaaaaaa";}}客户端(通过刚才命令生成的四个文件)HelloWorld.java/*** HelloWorld.java** This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package webservice.axis.test.batClient;public interface HelloWorld extends java.rmi.Remote {public ng.String hello() throws java.rmi.RemoteException;}HelloWorldService.java/*** HelloWorldService.java** This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package webservice.axis.test.batClient;public interface HelloWorldService extends javax.xml.rpc.Service {public ng.String getHelloWorldAddress();public webservice.axis.test.batClient.HelloWorld getHelloWorld() throwsjavax.xml.rpc.ServiceException;public webservice.axis.test.batClient.HelloWorld getHelloWorld(.URL portAddress) throws javax.xml.rpc.ServiceException;}HelloWorldServiceLocator.java/*** HelloWorldServiceLocator.java** This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package webservice.axis.test.batClient;public class HelloWorldServiceLocator extends org.apache.axis.client.Service implements webservice.axis.test.batClient.HelloWorldService {public HelloWorldServiceLocator() {}public HelloWorldServiceLocator(org.apache.axis.EngineConfiguration config) { super(config);}public HelloWorldServiceLocator(ng.String wsdlLoc, space.QName sName) throws javax.xml.rpc.ServiceException {super(wsdlLoc, sName);}// Use to get a proxy class for HelloWorldprivate ng.String HelloWorld_address = "http://localhost:8090/myAxis/services/HelloWorld";public ng.String getHelloWorldAddress() {return HelloWorld_address;}// The WSDD service name defaults to the port name.private ng.String HelloWorldWSDDServiceName = "HelloWorld";public ng.String getHelloWorldWSDDServiceName() {return HelloWorldWSDDServiceName;}public void setHelloWorldWSDDServiceName(ng.String name) {HelloWorldWSDDServiceName = name;}public webservice.axis.test.batClient.HelloWorld getHelloWorld() throws javax.xml.rpc.ServiceException {.URL endpoint;try {endpoint = new .URL(HelloWorld_address);}catch (.MalformedURLException e) {throw new javax.xml.rpc.ServiceException(e);}return getHelloWorld(endpoint);}public webservice.axis.test.batClient.HelloWorld getHelloWorld(.URL portAddress) throws javax.xml.rpc.ServiceException {try {webservice.axis.test.batClient.HelloWorldSoapBindingStub _stub = new webservice.axis.test.batClient.HelloWorldSoapBindingStub(portAddress, this);_stub.setPortName(getHelloWorldWSDDServiceName());return _stub;}catch (org.apache.axis.AxisFault e) {return null;}}public void setHelloWorldEndpointAddress(ng.String address) {HelloWorld_address = address;}/*** For the given interface, get the stub implementation.* If this service has no port for the given interface,* then ServiceException is thrown.*/public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException {try {if(webservice.axis.test.batClient.HelloWorld.class.isAssignableFrom(serviceEndpointInterface)) { webservice.axis.test.batClient.HelloWorldSoapBindingStub _stub = new webservice.axis.test.batClient.HelloWorldSoapBindingStub(new.URL(HelloWorld_address), this);_stub.setPortName(getHelloWorldWSDDServiceName());return _stub;}}catch (ng.Throwable t) {throw new javax.xml.rpc.ServiceException(t);}throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface: " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName()));}/*** For the given interface, get the stub implementation.* If this service has no port for the given interface,* then ServiceException is thrown.*/public java.rmi.Remote getPort(space.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException {if (portName == null) {return getPort(serviceEndpointInterface);}ng.String inputPortName = portName.getLocalPart();if ("HelloWorld".equals(inputPortName)) {return getHelloWorld();}else {java.rmi.Remote _stub = getPort(serviceEndpointInterface);((org.apache.axis.client.Stub) _stub).setPortName(portName);return _stub;}}public space.QName getServiceName() {return new space.QName("http://localhost:8090/myAxis/services/HelloWorld", "HelloWorldService");}private java.util.HashSet ports = null;public java.util.Iterator getPorts() {if (ports == null) {ports = new java.util.HashSet();ports.add(newspace.QName("http://localhost:8090/myAxis/services/HelloWorld", "HelloWorld"));}return ports.iterator();}/*** Set the endpoint address for the specified port name.*/public void setEndpointAddress(ng.String portName, ng.String address) throws javax.xml.rpc.ServiceException {if ("HelloWorld".equals(portName)) {setHelloWorldEndpointAddress(address);}else{ // Unknown Port Namethrow new javax.xml.rpc.ServiceException(" Cannot set Endpoint Address for Unknown Port" + portName);}}/*** Set the endpoint address for the specified port name.*/public void setEndpointAddress(space.QName portName, ng.String address) throws javax.xml.rpc.ServiceException {setEndpointAddress(portName.getLocalPart(), address);}}HelloWorldSoapBindingStub.java/*** HelloWorldSoapBindingStub.java** This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package webservice.axis.test.batClient;public class HelloWorldSoapBindingStub extends org.apache.axis.client.Stub implements webservice.axis.test.batClient.HelloWorld {private java.util.Vector cachedSerClasses = new java.util.Vector();private java.util.Vector cachedSerQNames = new java.util.Vector();private java.util.Vector cachedSerFactories = new java.util.Vector();private java.util.Vector cachedDeserFactories = new java.util.Vector();static org.apache.axis.description.OperationDesc [] _operations;static {_operations = new org.apache.axis.description.OperationDesc[1];_initOperationDesc1();}private static void _initOperationDesc1(){org.apache.axis.description.OperationDesc oper;org.apache.axis.description.ParameterDesc param;oper = new org.apache.axis.description.OperationDesc();oper.setName("hello");oper.setReturnType(newspace.QName("/2001/XMLSchema", "string"));oper.setReturnClass(ng.String.class);oper.setReturnQName(new space.QName("", "helloReturn"));oper.setStyle(org.apache.axis.constants.Style.RPC);oper.setUse(e.ENCODED);_operations[0] = oper;}public HelloWorldSoapBindingStub() throws org.apache.axis.AxisFault {this(null);}public HelloWorldSoapBindingStub(.URL endpointURL, javax.xml.rpc.Service service)throws org.apache.axis.AxisFault {this(service);super.cachedEndpoint = endpointURL;}public HelloWorldSoapBindingStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault {if (service == null) {super.service = new org.apache.axis.client.Service();} else {super.service = service;}((org.apache.axis.client.Service)super.service).setTypeMappingVersion("1.2");}protected org.apache.axis.client.Call createCall() throws java.rmi.RemoteException { try {org.apache.axis.client.Call _call = super._createCall();if (super.maintainSessionSet) {_call.setMaintainSession(super.maintainSession);}if (super.cachedUsername != null) {_call.setUsername(super.cachedUsername);}if (super.cachedPassword != null) {_call.setPassword(super.cachedPassword);}if (super.cachedEndpoint != null) {_call.setTargetEndpointAddress(super.cachedEndpoint);}if (super.cachedTimeout != null) {_call.setTimeout(super.cachedTimeout);}if (super.cachedPortName != null) {_call.setPortName(super.cachedPortName);}java.util.Enumeration keys = super.cachedProperties.keys();while (keys.hasMoreElements()) {ng.String key = (ng.String) keys.nextElement();_call.setProperty(key, super.cachedProperties.get(key));}return _call;}catch (ng.Throwable _t) {throw new org.apache.axis.AxisFault("Failure trying to get the Call object", _t);}}public ng.String hello() throws java.rmi.RemoteException {if (super.cachedEndpoint == null) {throw new org.apache.axis.NoEndPointException();}org.apache.axis.client.Call _call = createCall();_call.setOperation(_operations[0]);_call.setUseSOAPAction(true);_call.setSOAPActionURI("");_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);_call.setOperationName(newspace.QName("http://test.axis.webservice", "hello"));setRequestHeaders(_call);setAttachments(_call);try { ng.Object _resp = _call.invoke(new ng.Object[] {});if (_resp instanceof java.rmi.RemoteException) {throw (java.rmi.RemoteException)_resp;}else {extractAttachments(_call);try {return (ng.String) _resp;} catch (ng.Exception _exception) {return (ng.String) org.apache.axis.utils.JavaUtils.convert(_resp, ng.String.class);}}} catch (org.apache.axis.AxisFault axisFaultException) {throw axisFaultException;}}}最后要感谢网上资源。
axis2发布服务(WebService)和生成客户端(Client)
一、准备工作1.下载axis2相关jar包目前最新版本为 1.6.2;将axis2-1.6.2-bin.rar,axis2-1.6.2-war.zip一并下载下来,下载地址:/axis2/java/core/download.cgi2.下载axis2插件:axis2-eclipse-codegen-plugin-1.6.2.zip、axis2-eclipse-serv ice-plugin-1.6.2.zip,下载地址:/axis2/jav a/core/tools/index.html3安装Eclipse插件,安装成功如下图:5.新建Web Project(axis2_Serv ice)将axis2-1.6.2-bin\lib下的jar拷贝到axis2_Serv ice\lib下,打开axis2-1.6.2-war.zip\axis2\WEB-INF下的conf、modules、services 解压到项目(axis2_Serv ice)WebRoot\WEB-INF下6.修改web.xml文件,添加如下代码:7.添加两个类:bean类和服务类Bean类:package .zjl.entity;import java.io.Serializable;public class User implements Serializable{/****/private static final long serialVersionUID = 1L;private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}}要发布的服务类:package .zjl.service;import er;public class UserService {public User getUser(User user) {System.out.println("service:"+user.getId());System.out.println("service:"+user.getName());User po2 = new User();po2.setId(1);po2.setName("zjl");return po2;}}8.Axis2插件工具生成aar文件,发布WebService在项目上右击->new->other选择Axis2 Serv ice Archiv er,点击nextClass File Location选择工程路径下的classes文件,点击Next勾选Skip WSDL项,点击next这里没有jar文件,所以默认,点击Next勾选Generate the serv ice xml automatically项,点击NextServ ice Name 随便写记住就行,Class name包名点类名称点击Load会出现这个类下的所有方法名称,点击NextOutput location选择输出文件位置(具体位置根据具体而定),点击Finsh说明成功。
CXF使用教程(二)——webService自动生成客户端代码
CXF使⽤教程(⼆)——webService⾃动⽣成客户端代码webService⾃动⽣成客户端代码有四种⽅法:⼀:使⽤Axis⽣产客户端代码(另存为bat⽂件)需要注意的是:⽬录包含空格,⽐如Axis_Lib,Output_Pathset Axis_Lib=F:\axis1.4\axis\WEB-INF\libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Output_Path=D:\Workspacesset Package=com.axis.sub%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://192.168.11.62:8090/rainLogin?wsdl pause⼆:使⽤JDK1.6的wsimport.exe(在jdk的bin⽬录下)产⽣客户端代码(之前要将JDK的bin添加到环境变量Path中)wsimport -keep -p com.jdk6.sub -s JavaSrc http://192.168.11.62:8090/rainLogin?wsdl1. -s(src):在当前路径下的JavaSrc(要⼿动创建)⽂件夹中⽣成客户端代码2. -p(package):定义客户端代码的包名3. -keep 保留.class⽂件三:使⽤CXF wsdl2java.bat (要先将CXF的bin⽬录添加到环境变量Path下)在cmd本项⽬SCR⽬录下运⾏下⾯代码,就会在src下⽣成客户端代码wsdl2java http://192.168.11.62:8080/FFWebservice/services/PortalServices?wsdl四:使⽤Myeclipse⾃带⼯具⽣成客户端代码finnish 就可以⽣成客户端代码了。
个⼈⼀般⽐较喜欢⽤第⼆种⽅法。
Axis2生成客户端方式
Axis2⽣成客户端⽅式 Axis2提供的四种调⽤模式Axis2⽣成客户端⽅式基于StockQuoteService类创建客户端的四种⽅式构建基于AXIOM的客户端;使⽤Axis2 Databinding Frame work(ADB)⽣成客户端;使⽤XMLBeans⽣成客户端;使⽤JiBX⽣成客户端。
ADB:最简单的⽣成Axis客户端的⽅法。
⼤部分情况下,这些主要的类都会以内部类的形式创建在stub类中。
It is not meant to be a full schema binding application, and has difficulty with structures such as XML Schema element extensions and restrictions。
be meant to:有意要、打算XMLBeans:与ADB不同,他是⼀个全功能的schema编译器。
他没有ADB的限制。
然⽽,他也⽐ADB⽤起来更复杂。
他会产成⼤量的⽂件,编程模型不如ADB直观。
JiBX:他是⼀个数据绑定框架。
他不仅提供了WSDL-JAVA的转换,⽽且提供了JAVA-XML的转换。
JiBX相当灵活,允许你选择类来代表你的实体,但是这个却不好做,但还句话说,如果这些都能建好,那么使⽤JiBX 就更使⽤ADB⼀样容易。
对于简单应⽤来说ADB已经够⽤了,如果想⽤更加强⼤更加灵活的功能,那么你可能需要使⽤其他两种⽅式。
Axis2提供的四种调⽤模式Web services可以⽤来为⽤户提供⼴泛的功能,从简单的、少时间消耗的功能到多时间消耗的业务服务。
当我们使⽤(调⽤客户端的应⽤程序)这些Web Service时,我们不能⽤简单的调⽤机制来针对那些对时间消耗有很⼤要求的服务操作。
例如,如果我们使⽤⼀个简单的传输通道(如HTTP)并使⽤IN-OUT模式来调⽤⼀个需要很长时间来完成的Web Service,那么多数情况下,我们得到的结果将是"connection time outs"。
axis2开发的webservice的客户端生成、webservice的报文封装、解析、w。。。
axis2开发的webservice的客户端⽣成、webservice的报⽂封装、解析、w。
根据wsdl和axis2 ⽣成webservice的客户端,具体做法参照这篇随笔<!-- ========报⽂⼊参======= --><?xml version="1.0" encoding="GBK" standalone="no" ?><ROOT><SERVICE_NO type="string">136********</SERVICE_NO><MASTER_SERV_ID type="string">1001</MASTER_SERV_ID><REQUEST_INFO><OPR_INFO><PROVINCE_GROUP type="string">10010</PROVINCE_GROUP><OPEN_TIME type="string">20120301212121</OPEN_TIME><LOGIN_NO type="string">aa1868</LOGIN_NO><SERVICE_NO type="string">136********</SERVICE_NO><ACT_ID type="string">201304161360175132</ACT_ID><CONTACT_ID type="string"></CONTACT_ID><MEANS_ID type="string">201304161360175139</MEANS_ID><CUST_ADVINCE type="string"></CUST_ADVINCE><RECOMMEND_NO type="string"></RECOMMEND_NO><CHANNEL_TYPE type="string">11</CHANNEL_TYPE><TO_GROUP_ID type="string"></TO_GROUP_ID><SERIAL_NO type="string"></SERIAL_NO><JOIN_TERMI_FLAG type="string">JH111</JOIN_TERMI_FLAG><TAINFO_LIST><TA_INFO><PHONE_NO type="string"></PHONE_NO><ID_NO type="string"></ID_NO></TA_INFO></TAINFO_LIST></OPR_INFO><PARAMS><A06><PRC_INFO_LIST><PRC_INFO><PROD_PRCID type="string"></PROD_PRCID><PRC_INFO_LIST><PRC_INFO><PROD_PRCID type="string"></PROD_PRCID></PRC_INFO></PRC_INFO_LIST><SERV_NO type="string"></SERV_NO></B06><B02><SERV_NO type="string"></SERV_NO></B02><B10><SERV_NO type="string"></SERV_NO></B10><A11><RESOURCE_LIST><RESOURCE_INFO><RECEIVE_PHONE type="string">136********</RECEIVE_PHONE> <IMEI_NO type="string">869412018032158</IMEI_NO><COLOR_ID type="string">10000000</COLOR_ID></RESOURCE_INFO></RESOURCE_LIST></A11><A14><PHONE_NO type="string"></PHONE_NO></A14><A17><CONDCLASS_0178 type="string">0987</CONDCLASS_0178></A17><A24><SCORE_MONEY type="string"></SCORE_MONEY></A24><A26><IMEI_NO type="string"></IMEI_NO><PHONE_NO type="string"></PHONE_NO></A26></REQUEST_INFO></ROOT><!-- 报⽂出参: --><?xml version="1.0" encoding="GBK" standalone="no" ?><ROOT><RETURN_CODE type="long">0</RETURN_CODE> // 1<RETURN_MSG type="string">ok!</RETURN_MSG> // 2<USER_MSG type="string">ok!</USER_MSG> // 3<DETAIL_MSG type="string">OK!</DETAIL_MSG> // 4<PROMPT_MSG type="string"></PROMPT_MSG> // 5当封装报⽂时,这⾥1,2,3,4,5部分封装成了⼀个对象:ResponseHead<OUT_DATA><ORDER_ID type="string">O1113052800212745</ORDER_ID><CREATE_ACCEPT type="long">101973397749</CREATE_ACCEPT> <PASS_FLAG type="string">Y</PASS_FLAG></OUT_DATA></ROOT>封装⼊参报⽂对象package com.*.s4035IntCfm;import java.util.ArrayList;import java.util.List;public class S4035IntCfmRequest {private String serviceNo;private String masterServId;private String provinceGroup;private String loginNo;private String phoneNo;private String actId;private String meansId;private String contactId;private String channelType;private String custAdvince;private String recommendNo;private String serialNo;private String joinTermiFlag;private List<PrcInfo> prcInfoList =new ArrayList<PrcInfo>();private List<ResourceInfo> resourceInfo=new ArrayList<ResourceInfo>(); private String servNo;private String imeiNo;private String openTime;public String getOpenTime() {return openTime;}public void setOpenTime(String openTime) {this.openTime = openTime;}public String getImeiNo() {return imeiNo;}public void setImeiNo(String imeiNo) {this.imeiNo = imeiNo;}private String transferSNo;//TRANSFER_SERIALNOprivate String condclass;//CONDCLASS_0178private String scoreMoney;private String index;public String getIndex() {return index;}public void setIndex(String index) {this.index = index;}public String getScoreMoney() {return scoreMoney;}public void setScoreMoney(String scoreMoney) {this.scoreMoney = scoreMoney;}public String getCondclass() {return condclass;this.condclass = condclass;}public String getTransferSNo() {return transferSNo;}public void setTransferSNo(String transferSNo) {this.transferSNo = transferSNo;}public String getServNo() {return servNo;}public void setServNo(String servNo) {this.servNo = servNo;}public List<PrcInfo> getPrcInfoList() {return prcInfoList;}public void setPrcInfoList(List<PrcInfo> prcInfoList) {this.prcInfoList = prcInfoList;}public List<ResourceInfo> getResourceInfo() {return resourceInfo;}public void setResourceInfo(List<ResourceInfo> resourceInfo) { this.resourceInfo = resourceInfo;}public String getServiceNo() {return serviceNo;}public void setServiceNo(String serviceNo) {this.serviceNo = serviceNo;}public String getMasterServId() {return masterServId;}public void setMasterServId(String masterServId) {this.masterServId = masterServId;return provinceGroup;}public void setProvinceGroup(String provinceGroup) { this.provinceGroup = provinceGroup;}public String getLoginNo() {return loginNo;}public void setLoginNo(String loginNo) {this.loginNo = loginNo;}public String getPhoneNo() {return phoneNo;}public void setPhoneNo(String phoneNo) {this.phoneNo = phoneNo;}public String getActId() {return actId;}public void setActId(String actId) {this.actId = actId;}public String getMeansId() {return meansId;}public void setMeansId(String meansId) {this.meansId = meansId;}public String getContactId() {return contactId;}public void setContactId(String contactId) {this.contactId = contactId;}public String getChannelType() {return channelType;this.channelType = channelType;}public String getCustAdvince() {return custAdvince;}public void setCustAdvince(String custAdvince) {this.custAdvince = custAdvince;}public String getRecommendNo() {return recommendNo;}public void setRecommendNo(String recommendNo) { this.recommendNo = recommendNo;}public List<TaInfo> getTaInfoList() {return taInfoList;}public void setTaInfoList(List<TaInfo> taInfoList) {this.taInfoList = taInfoList;}public String getToGroupId() {return toGroupId;}public void setToGroupId(String toGroupId) {this.toGroupId = toGroupId;}public String getSerialNo() {return serialNo;}public void setSerialNo(String serialNo) {this.serialNo = serialNo;}public String getJoinTermiFlag() {return joinTermiFlag;}public void setJoinTermiFlag(String joinTermiFlag) { this.joinTermiFlag = joinTermiFlag;Request对象中引⽤类型属性TaInfopackage com.*.s4035IntCfm;public class TaInfo {private String phoneNo;//可空private String idNo;//可空public String getPhoneNo() {return phoneNo;}public void setPhoneNo(String phoneNo) {this.phoneNo = phoneNo;}public String getIdNo() {return idNo;}public void setIdNo(String idNo) {this.idNo = idNo;}}Request对象中引⽤类型属性PrcInfopackage com.*.s4035IntCfm;public class PrcInfo {private String prodPrcid;//给⽤户订购的资费,可空 public String getProdPrcid() {return prodPrcid;}public void setProdPrcid(String prodPrcid) {this.prodPrcid = prodPrcid;}}Request对象中引⽤类型属性ResourceInfo package com.*.s4035IntCfm;public class ResourceInfo {private String receivePhone;private String imeiNo;return receivePhone;}public void setReceivePhone(String receivePhone) { this.receivePhone = receivePhone;}public String getImeiNo() {return imeiNo;}public void setImeiNo(String imeiNo) {this.imeiNo = imeiNo;}public String getColorId() {return colorId;}public void setColorId(String colorId) {this.colorId = colorId;}}出参报⽂的封装对象的⽗类package com.*;public class ResponseHead {private String returnCode;private String returnMsg;private String userMsg;private String detailMsg;private String promptMsg;public String getReturnCode() {return returnCode;}public void setReturnCode(String returnCode) {this.returnCode = returnCode;}public String getReturnMsg() {return returnMsg;}public void setReturnMsg(String returnMsg) {this.returnMsg = returnMsg;return userMsg;}public void setUserMsg(String userMsg) {erMsg = userMsg;}public String getDetailMsg() {return detailMsg;}public void setDetailMsg(String detailMsg) {this.detailMsg = detailMsg;}public String getPromptMsg() {return promptMsg;}public void setPromptMsg(String promptMsg) {this.promptMsg = promptMsg;}}把出参报⽂为封装response对象,此处继承⼀个⾃定义的根据出参报⽂封装的⽗类package com.*.s4035IntCfm;import com.*.ResponseHead;public class S4035IntCfmResponse extends ResponseHead{private String orderId;private String createAccept;private String passFlag;public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public String getCreateAccept() {return createAccept;}public void setCreateAccept(String createAccept) {this.createAccept = createAccept;return passFlag;}public void setPassFlag(String passFlag) {this.passFlag = passFlag;}}把S4035IntCfmRequest对象装换成⼊参报⽂public static String parseS4035IntCfmRequest2XML(S4035IntCfmRequest request){String xml=null;StringBuffer sb = new StringBuffer();sb.append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\" ?>").append("\n");sb.append("<ROOT>").append("\n");sb.append("<SERVICE_NO type=\"string\">"+request.getServiceNo()+"</SERVICE_NO>").append("\n");sb.append("<MASTER_SERV_ID type=\"string\">"+request.getMasterServId()+"</MASTER_SERV_ID>").append("\n");sb.append("<REQUEST_INFO>").append("\n");sb.append("<OPR_INFO>").append("\n");sb.append("<PROVINCE_GROUP type=\"string\">"+request.getProvinceGroup()+"</PROVINCE_GROUP>").append("\n"); sb.append("<OPEN_TIME type=\"string\">"+request.getOpenTime()+"</OPEN_TIME>").append("\n");sb.append("<LOGIN_NO type=\"string\">"+request.getLoginNo()+"</LOGIN_NO>").append("\n");// sb.append("<PHONE_NO type=\"string\">"+request.getPhoneNo()+"</PHONE_NO>").append("\n");sb.append("<SERVICE_NO type=\"string\">"+request.getServiceNo()+"</SERVICE_NO>").append("\n");sb.append("<ACT_ID type=\"string\">"+request.getActId()+"</ACT_ID>").append("\n");if(request.getContactId()==null){sb.append("<CONTACT_ID type=\"string\"></CONTACT_ID>").append("\n");}else{sb.append("<CONTACT_ID type=\"string\">"+request.getContactId()+"</CONTACT_ID>").append("\n");}sb.append("<MEANS_ID type=\"string\">"+request.getMeansId()+"</MEANS_ID>").append("\n");if(request.getCustAdvince()==null){sb.append("<CUST_ADVINCE type=\"string\"></CUST_ADVINCE>").append("\n");}else{sb.append("<CUST_ADVINCE type=\"string\">"+request.getCustAdvince()+"</CUST_ADVINCE>").append("\n");}if(request.getRecommendNo()==null){sb.append("<RECOMMEND_NO type=\"string\"></RECOMMEND_NO>").append("\n");}else{sb.append("<RECOMMEND_NO type=\"string\">"+request.getRecommendNo()+"</RECOMMEND_NO>").append("\n"); }sb.append("<CHANNEL_TYPE type=\"string\">"+request.getChannelType()+"</CHANNEL_TYPE>").append("\n");if(request.getToGroupId()==null){sb.append("<TO_GROUP_ID type=\"string\"></TO_GROUP_ID>").append("\n");}else{sb.append("<TO_GROUP_ID type=\"string\">"+request.getToGroupId()+"</TO_GROUP_ID>").append("\n");}if(request.getSerialNo()==null){sb.append("<SERIAL_NO type=\"string\"></SERIAL_NO>").append("\n");}else{sb.append("<SERIAL_NO type=\"string\">"+request.getSerialNo()+"</SERIAL_NO>").append("\n");}if(request.getJoinTermiFlag()==null){sb.append("<JOIN_TERMI_FLAG type=\"string\"></JOIN_TERMI_FLAG>").append("\n");}else{sb.append("<JOIN_TERMI_FLAG type=\"string\">"+request.getJoinTermiFlag()+"</JOIN_TERMI_FLAG>").append("\n"); }sb.append("<TAINFO_LIST>").append("\n");if(request.getTaInfoList()!=null&&request.getTaInfoList().size()>0){String phoneNo=null;String idNo=null;for(int i=0;i<request.getTaInfoList().size();i++){TaInfo taInfo=request.getTaInfoList().get(i);sb.append("<TA_INFO>").append("\n");phoneNo=taInfo.getPhoneNo()!=null?taInfo.getPhoneNo():"";idNo=taInfo.getIdNo()!=null?taInfo.getIdNo():"";sb.append("<PHONE_NO type=\"string\">"+phoneNo+"</PHONE_NO>").append("\n");sb.append("<ID_NO type=\"string\">"+idNo+"</ID_NO>").append("\n");sb.append("</TA_INFO>").append("\n");}}else{sb.append("<TA_INFO>").append("\n");sb.append("<PHONE_NO type=\"string\"></PHONE_NO>").append("\n");sb.append("<ID_NO type=\"string\"></ID_NO>").append("\n");sb.append("</TA_INFO>").append("\n");}sb.append("</TAINFO_LIST>").append("\n");sb.append("</OPR_INFO>").append("\n");sb.append("<PARAMS>").append("\n");sb.append("<A06>").append("\n");sb.append("<PRC_INFO_LIST>").append("\n");if(request.getPrcInfoList()!=null&&request.getPrcInfoList().size()>0){String prodPrcId=null;for(int i=0;i<request.getPrcInfoList().size();i++){PrcInfo prcInfo=request.getPrcInfoList().get(i);sb.append("<PRC_INFO>").append("\n");prodPrcId=prcInfo.getProdPrcid()!=null?prcInfo.getProdPrcid():"";sb.append("<PROD_PRCID type=\"string\">"+prodPrcId+"</PROD_PRCID>").append("\n"); sb.append("</PRC_INFO>").append("\n");}}else{sb.append("<PRC_INFO>").append("\n");sb.append("<PROD_PRCID type=\"string\"></PROD_PRCID>").append("\n");sb.append("</PRC_INFO>").append("\n");}sb.append("</PRC_INFO_LIST>").append("\n");sb.append("</A06>").append("\n");sb.append("<B06>").append("\n");sb.append("<PRC_INFO_LIST>").append("\n");if(request.getPrcInfoList()!=null&&request.getPrcInfoList().size()>0){String prodPrcId=null;for(int i=0;i<request.getPrcInfoList().size();i++){PrcInfo prcInfo=request.getPrcInfoList().get(i);sb.append("<PRC_INFO>").append("\n");prodPrcId=prcInfo.getProdPrcid()!=null?prcInfo.getProdPrcid():"";sb.append("<PROD_PRCID type=\"string\">"+prodPrcId+"</PROD_PRCID>").append("\n"); sb.append("</PRC_INFO>").append("\n");}}else{sb.append("<PRC_INFO>").append("\n");sb.append("<PROD_PRCID type=\"string\"></PROD_PRCID>").append("\n");sb.append("</PRC_INFO>").append("\n");}sb.append("</PRC_INFO_LIST>").append("\n");if(request.getServNo()==null){sb.append("<SERV_NO type=\"string\"></SERV_NO>").append("\n");}else{sb.append("<SERV_NO type=\"string\">"+request.getServNo()+"</SERV_NO>").append("\n");}sb.append("</B06>").append("\n");sb.append("<B02>").append("\n");if(request.getServNo()==null){sb.append("<SERV_NO type=\"string\"></SERV_NO>").append("\n");}else{sb.append("<SERV_NO type=\"string\">"+request.getServNo()+"</SERV_NO>").append("\n");}sb.append("</B02>").append("\n");sb.append("<B10>").append("\n");if(request.getServNo()==null){sb.append("<SERV_NO type=\"string\"></SERV_NO>").append("\n");}else{sb.append("<SERV_NO type=\"string\">"+request.getServNo()+"</SERV_NO>").append("\n");}sb.append("</B10>").append("\n");sb.append("<A11>").append("\n");sb.append("<RESOURCE_LIST>").append("\n");if(request.getResourceInfo()!=null&&request.getResourceInfo().size()>0){String recPhone=null;String imeiNo=null;String colorId=null;for(int i=0;i<request.getResourceInfo().size();i++){ResourceInfo resourceInfo=request.getResourceInfo().get(i);sb.append("<RESOURCE_INFO>").append("\n");recPhone=resourceInfo.getReceivePhone()!=null?resourceInfo.getReceivePhone():"";imeiNo=resourceInfo.getImeiNo()!=null?resourceInfo.getImeiNo():"";colorId=resourceInfo.getColorId()!=null?resourceInfo.getColorId():"";sb.append("<RECEIVE_PHONE type=\"string\">"+recPhone+"</RECEIVE_PHONE>").append("\n"); sb.append("<IMEI_NO type=\"string\">"+imeiNo+"</IMEI_NO>").append("\n");sb.append("<COLOR_ID type=\"string\">"+colorId+"</COLOR_ID>").append("\n");sb.append("</RESOURCE_INFO>").append("\n");}}else{sb.append("<RESOURCE_INFO>").append("\n");sb.append("<RECEIVE_PHONE type=\"string\"></RECEIVE_PHONE>").append("\n");sb.append("<IMEI_NO type=\"string\"></IMEI_NO>").append("\n");sb.append("<COLOR_ID type=\"string\"></COLOR_ID>").append("\n");sb.append("</RESOURCE_INFO>").append("\n");}sb.append("</RESOURCE_LIST>").append("\n");sb.append("</A11>").append("\n");sb.append("<A14>").append("\n");if(request.getPhoneNo()==null){sb.append("<PHONE_NO type=\"string\"></PHONE_NO>").append("\n");}else{sb.append("<PHONE_NO type=\"string\">"+request.getPhoneNo()+"</PHONE_NO>").append("\n");}sb.append("</A14>").append("\n");sb.append("<A17>").append("\n");if(request.getCondclass()==null){sb.append("<CONDCLASS_0178 type=\"string\"></CONDCLASS_0178>").append("\n");}else{sb.append("<CONDCLASS_0178 type=\"string\">"+request.getCondclass()+"</CONDCLASS_0178>").append("\n"); }sb.append("</A17>").append("\n");sb.append("<A24>").append("\n");if(request.getScoreMoney()==null){sb.append("<SCORE_MONEY type=\"string\"></SCORE_MONEY>").append("\n");}else{sb.append("<SCORE_MONEY type=\"string\">"+request.getScoreMoney()+"</SCORE_MONEY>").append("\n");}sb.append("</A24>").append("\n");sb.append("<A26>").append("\n");if(request.getImeiNo()==null){sb.append("<IMEI_NO type=\"string\"></IMEI_NO>").append("\n");}else{sb.append("<IMEI_NO type=\"string\">"+request.getImeiNo()+"</IMEI_NO>").append("\n");}if(request.getPhoneNo()==null){sb.append("<PHONE_NO type=\"string\"></PHONE_NO>").append("\n");}else{sb.append("<PHONE_NO type=\"string\">"+request.getPhoneNo()+"</PHONE_NO>").append("\n");}sb.append("</A26>").append("\n");sb.append("<A04>").append("\n");if(request.getIndex()==null){sb.append("<INDEX type=\"string\"></INDEX>").append("\n");}else{sb.append("<INDEX type=\"string\">"+request.getScoreMoney()+"</INDEX>").append("\n");}sb.append("</A04>").append("\n");sb.append("</PARAMS>").append("\n");sb.append("</REQUEST_INFO>").append("\n");sb.append("</ROOT>").append("\n");xml = sb.toString();return xml;}把调⽤接⼝获得的出参报⽂转换成⾃⼰封装的S4035IntCfmResponse对象public static S4035IntCfmResponse parseXML2S4035IntCfmResponse(String xml) throws DocumentException{ Document document =DocumentHelper.parseText(xml);S4035IntCfmResponse response =new S4035IntCfmResponse();Element root = document.getRootElement();String DETAIL_MSG = root.elementTextTrim("DETAIL_MSG");String PROMPT_MSG = root.elementTextTrim("PROMPT_MSG");String RETURN_CODE = root.elementTextTrim("RETURN_CODE");if(RETURN_CODE!=null&&(RETURN_CODE.equals("0")||RETURN_CODE.equals("0"))){Element OUT_DATA = root.element("OUT_DATA");String ORDER_ID = OUT_DATA.elementTextTrim("ORDER_ID");String CREATE_ACCEPT = OUT_DATA.elementTextTrim("CREATE_ACCEPT");String PASS_FLAG = OUT_DATA.elementTextTrim("PASS_FLAG");response.setOrderId(ORDER_ID);response.setCreateAccept(CREATE_ACCEPT);response.setPassFlag(PASS_FLAG);}response.setDetailMsg(DETAIL_MSG);response.setPromptMsg(PROMPT_MSG);response.setReturnCode(RETURN_CODE);return response;}在service层调⽤webservice接⼝并把⼊参和出参报⽂记录到数据库public S4035IntCfmResponse S4035IntCfm(S4035IntCfmRequest request,String url) {S4035IntCfmResponse response = null;String xml = MyParseXML.parseS4035IntCfmRequest2XML(request);System.out.println(xml);("========⼊参=======" + xml);try {S4035IntCfmStub stub = new S4035IntCfmStub(url);S4035IntCfmStub.CallService call = new S4035IntCfmStub.CallService();call.setPin(xml);S4035IntCfmStub.CallServiceResponse response2 = stub.callService(call);String xml1 = "";xml1 = response2.get_return();System.out.println(xml1);("========出参=======" + xml1);// 记录⼊参报⽂和出参报⽂TOperationLogDTO oper = new TOperationLogDTO();oper.setOperateTime(new Date());oper.setOperateUser("商城 ");oper.setOperateDesc("⼊参:" + xml + "\n出参:" + xml1);oper.setOperateAction("⾃主开通合约");oper.setOperateObjectId(request.getServiceNo());oper.setOperateObjectReason("");oper.setOperateName(request.getPhoneNo());//底层通过this.getHibernateTemplate().save(dto);保存到数据中this.operationLogManagerImpl.save(oper);response = MyParseXML.parseXML2S4035IntCfmResponse(xml);} catch (Exception e) {e.printStackTrace();}return response;}这样在Action层,传⼊指定的参数,就可调⽤S4035IntCfm(S4035IntCfmRequest request,String url)⽅法了,并且可以通过调⽤接⼝的返回值S4035IntCfmResponse进⾏判断处理保存⼊参和出参时涉及到java类和相关⽂件import ng.builder.EqualsBuilder;import ng.builder.HashCodeBuilder;/*** <ul>* <li> <b>⽬的:</b> <br />* <p>* 表T_OPERATION_LOG的映射类,*/public class TOperationLogDTO extends AbstractTOperationLogDTO{private static final long serialVersionUID = 8980322235903658767L;public TOperationLogDTO(){super();}public TOperationLogDTO(ng.String logId){super(logId);}public boolean equals(Object other){ if ( !(other instanceof TOperationLogDTO) )return false;TOperationLogDTO castOther = (TOperationLogDTO) other;return new EqualsBuilder().append(this.getLogId(), castOther.getLogId()).isEquals(); }public int hashCode(){return new HashCodeBuilder().append(getLogId()).toHashCode();}@Overridepublic String toString() {return super.toString();}}import com.*.common.model.util.PageObject;/*** <ul>* <li><b>⽬的:</b> <br />* <p>* 实体对象,请勿做客户化操作,对应表:T_OPERATION_LOG 商城对象操作履历表*/public abstract class AbstractTOperationLogDTO extends PageObject{private static final long serialVersionUID = -3633835505537085014L// 表IDprivate ng.String logId;// 操作时间private java.util.Date operateTime;//操作查询结束时间。
生成与发布服务端说明
6.把一下配置拷贝到web.xml中:
<!--axi2相关配置-->
<display-name>Apache-Axis2</display-name>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--</init-param>-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>AxisAdminServlet</servlet-name>
<servlet-class>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
axis2客户端数据传送方式
Axis2客户端数据传送方式分为阻塞与阻塞方式创建客户端方式大概有以下几种:1.Creating a ServiceClient using Its Default ConstructorServiceClient serviceClient = new ServiceClient ();2.Creating a ServiceClient with Your Own ConfigurationContextServiceClient serviceClient = new ServiceClient (configContext, axisService);3.Creating a Dynamic Client (Client on the Fly)ServiceClient dynamicClient =new ServiceClient(configContext,wsdlURL, wsdlServiceName, portName);数据传送方式大概有以下几种:1.Invoking a service in Blocking Manner(sendReceive())a)Create client subb)Create OMElementpublic OMElement createPayLoad() {OMFactory fac = OMAbstractFactory.getOMFactory();OMNamespace omNs = fac.createOMNamespace( "/axis2", "ns1");OMElement method = fac.createOMElement("echo", omNs);OMElement value = fac.createOMElement("value", omNs);value.setText("Hello , my first service utilization");method.addChild(value);return method;}c)create a metadata to invoke the serviceServiceClient sc = new ServiceClient();// create option objectOptions opts = new Options();//setting target EPRopts.setTo(new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService"));//Setting actionopts.setAction("urn:echo");//setting created option into service clientsc.setOptions(opts);d)sendReceive is the API for invoking a service in a blocking manner方法一OMElement res = sc.sendReceive(createPayLoad());System.out.println(res);方法二ServiceClient sc = new ServiceClient(null, newURL("http://localhost:8080/axis2/services/MyService?wsdl"),null,null);sc.sendReceive(new QName("/axis2","echo"),createPayLoad());2.Utilizing a Service in a Non-Blocking Manner (sendReceiveNonBlocking()) (实现org.apache.axis2.client.async.AxisCallback)a)b)c)d)前面的步骤与1中的一样//Callback to handle the responseCallback callback = new Callback() {public void onComplete(AsyncResult result) {System.out.println(result.getResponseEnvelope());}public void onError(Exception e) {e.printStackTrace();}};sender.sendReceiveNonBlocking(payload, callback);//Wait till the callback receives the response.while (!callback.isComplete()) {Thread.sleep(1000);}这一步是没有返回值的3.Utilizing a Service using Two Transportsa)b)c)前面的步骤与2中相同ServiceClient sc = new ServiceClient();Options opts = new Options();opts.setTo(new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService"));//engaging addressing modulesc.engageModule(new QName("addressing"));// I need to use separate listener for my responseopts.setUseSeparateListener(true);// Need to receive via TCPopts.setTransportInProtocol(Constants.TRANSPORT_TCP);opts.setAction("urn:echo");sc.setOptions(opts);4.Utilizing an In-Only MEP (FireAndForget()) (If we want to send some data to a server,but we worry neither about response nor exceptions, then we could use this API)a)Create a ServiceClientb)Create the payload OMElementpublic OMElement createPayLoad() {OMFactory fac = OMAbstractFactory.getOMFactory();OMNamespace omNs = fac.createOMNamespace("/axis2", "ns1");OMElement method = fac.createOMElement("update", omNs);OMElement value = fac.createOMElement("value", omNs);value.setText("10");method.addChild(value);return method;}c)ServiceClient sc = new ServiceClient();Options opts = new Options();opts.setTo(newEndpointReference( "http://127.0.0.1:8080/axis2/services/MyService"));opts.setAction("urn:update");sc.setOptions(opts);sc.fireAndForget(createPayLoad());5.Utilizing an In-Only MEP (sendRobust()) (a one-way operation)a)b)c)前面的步骤怀4 中的相同ServiceClient sc = new ServiceClient();Options opts = new Options();opts.setTo(newEndpointReference("http://127.0.0.1:8080/axis2/services/MyService"));opts.setAction("urn:update");sc.setOptions(opts);sc.sendRobust(createPayLoad());。
用Axis2开发Web Service及客户端
用Axis2开发Web Service及客户端在《使用Eclipse的Axis1.4插件开发Web Service及客户端》介绍的Axis是用的Axis1.x,而Axis2是改进版本,进行了重新的设计,应该是Axis的第二代,本文介绍Axis2的使用方法。
/axis2/是Axis2的主页,写这篇文章的时候最新版本是1.5,从/axis2/download/1_5/download.cgi下载axis2-1.5-bin.zip、axis2-1.5-war.zip。
axis2-1.5-war.zip是web发布版本,可以在网页上进行Web Service的动态部署,提供Web Service服务。
解压缩后把axis2.war放到tomcat的webapps下面,启动tomcat,在网页中输入http://localhost:8080/axis2(取决于tomcat的设置)就可以进行操作了。
这方面的资料很多,就不详细介绍了。
下面介绍使用Eclipse插件开发的方法,环境与《使用Eclipse的Axis1.4插件开发Web Service及客户端》的相同。
启动Eclipse后,首先设置Axis2的主目录,需要先解压缩axis2-1.5-bin.zip,然后把解压缩之后的路径填入Eclipse的Window|Preferences|Web Services|Axis2 Preferences的界面上,如下图所示:图1在Eclipse中设置Axis2的runtime建立一个简单的类:package demo.axis; public class User{public String sayHello(String userName){return "hello " + userName;}}把这个类发布为Web Service的步骤与《使用Eclipse 的Axis1.4插件开发Web Service及客户端》中的相同,只是要注意选择Axis2,生成之后的目录结构是:图2生成Web Service后的目录结构但生成之后的项目中缺少.jar文件,可以把%AXIS2-HOME%/lib下的所有文件复制到项目的WEB-INF/lib下面,部署到tomcat就可以运行了,在浏览器中输入http://localhost:8080/Axis2ServerDemo/services/User?wsd l就可以看到发布的Web Service的wsdl了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
req.setPrice (42.35);
stub.update(req);
System.err.println("price updated");
} catch(Exception e){
sender.fireAndForget(updatePayload);
System.err.println("price updated");
OMElement result = sender.sendReceive(getPricePayload);
try{
StockQuoteServiceStub.GetPrice req = new StockQuoteServiceStub.GetPrice();
OMElement updatePayload = updatePayload("WSO", 123.42);
Options options = new Options();
options.setTo(targetEPR);
package samples.quickstart.clients;
import samples.quickstart.service.adb.StockQuoteServiceStub;
public class ADBClient{
public static void main(ng.String args[]){
- services.xml
- StockQuoteService.wsdl
- src
- samples
- quickstart
- service
- axiom
- StockQuoteService.java
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
method.addChild(value);
return method;
}
public static OMElement updatePayload(String symbol, double price) {
OMFactory fac = OMAbstractFactory.getOMFactory();
public class AXIOMClient {
private e targetEPR =
new EndpointReference("http://localhost:8080/axis2/services/StockQuoteService");
e.printStackTrace();
}
}
}
Axis2使用的AXIOM又叫AXIS对象模型,它是一个以StAX API (XML的流式 API)为基础的类似DOM (文档对象模型)的结构。在这里,您 为调用服务提供的两个方法update和getPrice设置了有效载荷。有效载荷的建立过程类似于您为AXIOM服务的getPriceResponse 建立有效载荷的情形。然后,您设置可选类,并创建一个用于和服务端通讯的ServiceClient。接下来先调用Update方法,这是 一个一触即忘的方法,因为它没有任何返回值。最后调用getPrice方法从服务端获得当前股价并显示出来。
输入下列在Axis2_HOME/samples/quickstartadb目录中的命令来创建ADB数据绑定的客户端:
%AXIS2_HOME%\bin\WSDL2Java -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.clients -d adb -s -o build\client
- clients
- AXIOMClient.java
上述引用的AXIOMClient.java类定义如代码9所示。
Code Listing 9: The AXIOMClient class using AXIOM
package samples.quickstart.clients;
使用AXIOM创建客户端
欲用AXIOM创建客户端,请执行以下步骤。
为了完整性,下面的目录结构将“用AXIOM创建服务”一节中的目录一并列出。
- quickstartaxiom
- README.txt
- build.xml
- resources
- META-INF
OMElement value2 = fac.createOMElement("price", omNs);
value2.addChild(fac.createOMText(value2,
& nbsp; &nbs p; Double.toString(price)));
public static OMElement getPricePayload(String symbol) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
try{
StockQuoteServiceStub stub =
new StockQuoteServiceStub
("http://localhost:8080/axis2/services/StockQuoteService");
getPrice(stub);
update(stub);
getPrice(stub);
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
或者,输入在Axis2_HOME/samples/quickstartadb目录中的命令”ant generate.client”。
代码10是quickstartadb/src/samples/quickstart/clients/ADBClient.java的内容。
Code Listing 10: The ADBClient Class
现在,您可以通过键入在Axis2_HOME/samples/quickstartaxiom的命令”ant run.client”构建并运行AXIOM客户端。
你应该看到以下输出:
done
Current price of WSO: 123.42
使用ADB生成客户端
若要用ADB生成客户端,请执行以下步骤。
String response = result.getFirstElement().getText();
System.err.println("Current price of WSO: " + response);
} catch (Exception e) {
OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
OMElement method = fac.createOMElement("update", omNs);
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
OMElement method = fac.createOMElement("getPrice", omNs);
OMElement value = fac.createOMElement("symbol", omNs);
value.addChild(fac.createOMText(value, symbol));
OMElement value1 = fac.createOMElement("symbol", omNs);
value1.addChild(fac.createOMText(value1, symbol));
method.addChild(value1);
}
}
/**//* fire and forget */
public static void update(StockQuoteServiceStub stub){
try{
StockQuoteServiceStub.Update req = new StockQuoteServiceStub.Update();
e.printStackTrace();
System.err.println("\n\n\n");
}
}
/**//* two way call/receive */