axis webservice - 开发指南.docx_第1页
axis webservice - 开发指南.docx_第2页
axis webservice - 开发指南.docx_第3页
axis webservice - 开发指南.docx_第4页
axis webservice - 开发指南.docx_第5页
免费预览已结束,剩余67页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Axis1.x WebService开发指南Axis的简单入门实例Axis的jws发布WebServiceAxis的wsdd模式发布WebServiceAxis中传递复杂对象和内部类Axis中的handler、chain的特性Axis中处理异常信息Axis中传递文件信息Axis常用命令介绍Axis 提供的工具和调试Axis 的wsdl生成代码Axis的Header信息操作.Net调用Axis出现的问题Version1.0 2010-12-19hoojo授之以鱼,不如授之以渔!希望能给广大IT朋友带来一些帮助IT达人自由IT职业/IBM_hoojo /5066373152010-12-19Axis1.x一、搭建简单的axis web服务1、在官方网站下载axis的工程(这个等下就有用的)和源码、jar包等,下载地址是:/apache-mirror/ws/axis/1_4/2、解压下载的工程或源码(两个中任意一个都可以),解压axis-bin-1.4可以看到大致目录是这样的:docs是文档、lib是jar包、sample是示例、xmls是当前工程所需的xml、webapps是当前工程的webroot目录;我们打开webapps目录就可以看到一个axis的文件夹,这个文件夹里面有WEB-INF文件夹和一些页面,将axis复制到你的tomcat的webapps目录下。然后启动tomcat服务,访问http:/localhost:8080/axis/,看到下面的解码就说明部署成功了:以后我们将和这个工程不离不弃,它将在我们的axis1.x的webService中发挥很大的作用!3、创建我们自己的web工程,这里我新建的AxisWebService;创建好工程后,将刚才解压的axis-bin中的lib的jar包copy到当前工程的lib中;axis-ant.jaraxis.jarcommons-discovery-0.2.jarcommons-logging-1.0.4.jarjaxrpc.jarlog4j-1.2.8.jarsaaj.jarwsdl4j-1.5.1.jaractivation-1.1.jarmail-1.4.jar创建webService类文件,代码如下:package com.hoo.service;/* * function:jws的axis WebService * author hoojo * createDate Dec 15, 2010 17:03:49 PM * file HelloWorldService.java * package com.hoo.service * project AxisWebService * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public class HelloWorldService public String sayHello(String name, int age) return name + say : hello world! axis my age is + age;4、复制HelloWorldService.java到我们刚才复制的axis文件夹下即可;也就是tomcat下的webapps下的axis下即可;注意:还有重要的一般就是要将这个java文件中的包名去掉,并且将这个文件重命名为HelloWorldService.jws;如果带包名的话,请求后编译的class将会在包路径下,这样我们在全球当前jws的时候就会出现找不到class,详细的你可以到发布在tomcat下的工程看看WEB-INF目录下的jwsClass就一目了然了。上面的工作完成后,启动tomcat服务器,访问http:/localhost:8080/axis/HelloWorldService.jws你会看到:There is a Web Service here Click to see the WSDL 如果你和我看到的是一样的,就证明你已经成功的部署了一个axis1.x的webService。然后我们点击下就可以看到wsdl的xml文件了,内容如下: - - - - - - - - - - - - 分析下wsdl的xml文件内容:targetNamespace=http:/localhost:8080/axis/HelloWorldService.jws是我们部署的webservice命名空间,也就是我们访问的webService路径。 是返回值的信息,sayHelloResponse代表响应,即返回值,type是返回值的类型 请求方法参数信息,sayHelloRequest即请求,part是参数parameter,type是参数的类型 portType的name是当前webService的名称,operation是一个操作,即可以调用的方法。name就是方法名称了,parameterOrder是参数,input输入即传入参数,output输出即返回的值; webService的名称和绑定的信息,以及访问的url地址。5、下面编写客户端代码代码如下:package com.hoo.client;import java.rmi.RemoteException;import space.QName;import javax.xml.rpc.ServiceException;import org.apache.axis.client.Call;import org.apache.axis.client.Service;public class HelloWorldClient /* * function:jws axis WebService客户端 * author hoojo * createDate 2010-12-15 下午05:10:28 * param args * throws ServiceException * throws RemoteException */public static void main(String args) throws ServiceException, RemoteException /webService访问地址/String url = http:/localhost:8080/axis/HelloWorldService.jws;String url = http:/localhost:8080/AxisWebService/HelloWorldService.jws;/创建服务Service service = new Service();/创建调用句柄Call call = (Call) service.createCall();/设置请求地址call.setTargetEndpointAddress(url);/* * 设置调用的方法和方法的命名空间; * 因为这里是手动发布到webroot目录下的,所以命名空间和请求地址一致 * 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是 * 包名倒写组成,如com.hoo.service,ns= */call.setOperationName(new QName(null, sayHello);/* * 用call调用sayHello方法,设置请求的参数,返回的就是返回值了 */String result = (String) call.invoke(new Object jack, 99 );System.out.println(result);分析上面的代码url是根据xml文件中的wsdlsoap:address location的信息得到的,命名空间和方法名称是根据 - - 的信息得到的,而请求参数和返回值的详细信息是在 - - - 里可以很详细的看到。至于代码的call.invoke是java中反射机制,不懂的建议看看jdk文档java.lang.reflect包下的内容。运行上面的代码就可以看到控制台输出:jack say : hello world! axis my age is 99好了,axis的就完成了,下面我们不用官方的axis的工程,我们写一个自己的AxisWebService工程,然后发布的tomcat的webapps中看看。6、刚才copy了lib下的jar包,现在要copy下web.xml中的内容,去掉里面的AdminServlet这个配置,其他的都可保留。然后像刚才一样,将HelloWorldService.java复制到webroot目录下,去掉包名,并且修改后缀为HelloWorldService.jws即可。(如果有兴趣可以看看,发布在tomcat目录下的当前工程的web-inf目录,看看里面是否多了些东西)最后发布当前web工程,访问http:/localhost:8080/AxisWebService/HelloWorldService.jws,如果看到和刚才一样的界面,证明你快成功了。点击链接看到wsdl的xml就成功了。好了,还没有完。看看web.xml中的配置,你大概就知道为什么了。web.xml中最主要的文件就是org.apache.axis.transport.http.AxisServlet,它就是webService的中央控制器;即配置jws的后缀也在web.xml中定义的,在看看还有services/*,这就表明上面的访问路径也可以是这样的:http:/localhost:8080/AxisWebService/services/HelloWorldService当然如果要这样写就需要用wsdd的发布方式,详细请看下文!参考文档:/axis/java/user-guide.html二、用wsdd(Web Services Deployment Descriptor)方式发布WebServicewsdd方法比jws方法要稍微复杂些,但一定程度上比jws发布的方法要灵活。1、首先在AxisWebService工程创建一个java类,里面写简单的2个方法getName、getAge,代码如下:package com.hoo.service;/* * function:wsdd发布模式的axis WebService * author hoojo * createDate Dec 15, 2010 17:24:35 PM * file HelloWorldWSDD.java * package com.hoo.service * project AxisWebService * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public class HelloWorldWSDD public String getName(String name) return your name : + name;public int getAge(int age) return age + 10;2、如果用wsdd方法首先需要定制我们的wsdd xml文件,这里命名为deploy.wsdd,创建在当前web工程的WEB-INF目录下,代码如下:service标签代表一个WebService服务,HelloWorldWSDD就是当前WebService的名称;provider是java的WebService类型,分别有: RPC、Document、Wrapped、Message、EJB、RMI;有兴趣的可以看看viders.java包下面的WebService的实现类或是文档;parameter的参数className代表当前WebService的class类路径;allowedMethods代表暴露的方法,那些方法在客户端可以调用; 这个是当前WebService的作用域,它有3个值,分别是:request、session、application。request代表为每个WebService SOAP的请求都产生一个服务对象,和Spring的scope很像,在服务请求频繁的话会消耗很多资源。session 是给每个调用当前WebService的客户端创建一个服务对象application 是个当前所有的请求创建一个服务对象3、写完配置后,就需要用axis提供的AdminClient工具类帮我们发布WebService,直到生成server-config.wsdd,步骤如下:运行cmd命令,然后进入当前工程发布的目录,即%tomcat_home%/webapps/project/WEB-INF我的是:C:SoftWaretomcat-5.0.28tomcat-5.0.28webappsAxisWebServiceWEB-INF然后输入命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd这里的deploy.wsdd是我们刚才定制的wsdd文件,java当然是jvm的命令,-Djava.ext.dirs=lib设置当前命令的依赖包,AdminClient是axis提供的工具类,这个类本来是可以在官方的工程中admin可以直接运行的(这里不可以,下载下来的少了AdminServlet,有兴趣的可以研究下,就是前面说的官方的示例);如果运行命令后,看到:Processing file deploy.wsddDone processing就代表快成功了,why?快! 看看deploy.wsdd同级目录有没有生成server-config.wsdd如果有这个文件就成功了,没有就失败了。如果失败了还有解决办法,首先你得启动tomcat,将我们的工程发布出去。然后在重复上面的命令,不行就换命令行代码如下:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp:/localhost:8080/AxisWebService/services/AdminService deploy.wsdd-lhttp:/localhost:8080/AxisWebService/services/AdminService是因为你的端口可能被axis占用了,我们将指定AdminService来完成转换,运行上面命令就没有问题了。4、在WebBrowser的地址栏输入:http:/localhost:8080/AxisWebService/servlet/AxisServlet你就可以看到如下效果:And now. Some Services HelloWorldWSDD (wsdl) o getName o getAge AdminService (wsdl) o AdminService Version (wsdl) o getVersion 刚才在deploy.wsdd中指定的WebService就在上面出现了,还有暴露出来的方法。点击wsdl就可以看到刚才一样熟悉的wsdl的xml文档。5、下面我们编写客户端代码调用上面的WebService,代码块和上面的jws几乎一样,只是参数,方法名称不同。package com.hoo.client;import java.rmi.RemoteException;import space.QName;import javax.xml.rpc.ServiceException;import org.apache.axis.client.Call;import org.apache.axis.client.Service;/* * function:wsdd 模式的axis WebService客户端 * author hoojo * createDate Dec 15, 2010 17:30:48 PM * file HelloWorldWSDDClient.java * package com.hoo.client * project AxisWebService * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public class HelloWorldWSDDClient public static void main(String args) throws ServiceException, RemoteException /webService访问地址String url = http:/localhost:8080/AxisWebService/services/HelloWorldWSDD;/创建服务Service service = new Service();/创建调用句柄Call call = (Call) service.createCall();/设置请求地址call.setTargetEndpointAddress(url);/* * 设置调用的方法和方法的命名空间; * 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是 * 包名倒写组成,如com.hoo.service,ns= */call.setOperationName(new QName(, getName);/* * 用call调用getName方法,设置请求的参数,返回的就是返回值了 */String result = (String) call.invoke(new Object jack );System.out.println(result);call.setOperationName(new QName(, getAge);/* * 用call调用getAge方法,设置请求的参数,返回的就是返回值了 */int resultAge = Integer.parseInt(call.invoke(new Object 89 ).toString();/服务器端+10System.out.println(resultAge);运行后结果如下:your name : jack99call.setOperationName(new QName(, getName);这里设置命名空间,也可以用null代替,但是不能随意设置,有时候会出现异常。三、取消发布的WebService(删除一个发布成功的Web服务)首先,取消发布也需要定制wsdd文件,undeploy.wsdd具体格式如下:同样,像上面发布WebService一样,用命令完成。命令如下:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp:/localhost:8080/AxisWebService/services/AdminService undeploy.wsdd键入命令后,回车看到:Processing file undeploy.wsddDone processing就代表你取消服务成功了,那样别人就不能访问你的服务了。再在浏览器地址栏输入:http:/localhost:8080/AxisWebService/servlet/AxisServlet看看是不是刚才发布的服务被成功取消了!四、handler的作用及特性Axis中有一个basicHandler的抽象类,这个类可以供我们继承。可以完成很多复杂的功能,如:统计当前服务被调用的次数、验证服务调用信息等待1、下面我们继承这个类,完成统计服务调用次数的功能;RequestHandler代码如下:package com.hoo.service.handler;import org.apache.axis.AxisFault;import org.apache.axis.MessageContext;import org.apache.axis.handlers.BasicHandler;/* * function:继承抽象类BasicHandler完成服务的调用统计功能 * author hoojo * createDate Dec 15, 2010 11:00:20 PM * file RequestHandler.java * package com.hoo.service.handler * project AxisWebService * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public class RequestHandler extends BasicHandler private static final long serialVersionUID = 2128841024713159133L;private static long COUNT = 0L;private static int REQUEST_COUNT = 0;public void invoke(MessageContext msgContext) throws AxisFault /* * MessageContext相当于当前Services的一个上下文, * 里面存储的是当前服务和调用的一些信息 */COUNT +;REQUEST_COUNT +;String state = (String) this.getOption(state);System.out.println(state: + state + , count: + COUNT + , requestCount: + REQUEST_COUNT);BasicHandler是一个抽象类,继承这个类需要实现invoke签名方法,上面的代码很简单,就是一个累加统计,MessageContext是当前WebService的一个上下文,可以得到当前服务的公共信息和请求信息。这里的this.getOption(state);是和wsdd中的parameter对应的。2、编写wsdd文件,加入RequestHandler配置信息,wsdd配置如下:deployHandler.wsdd:handler元素配置的就是在上面编写的RequestHandler,type就是classpath;里面的parameter和上面RequestHandler中的this.getOption(“state”)的对应。service元素中的requestFlow handler是请求的时候调用的handler、responsHandler是响应的时候调用的handler。3、发布当前WebService,和前面的一样运行命令行:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp:/localhost:8080/AxisWebService/services/AdminService deployHandler.wsdd看到下面的就表示执行成功Processing file undeploy.wsddDone processing然后在浏览器中请求:http:/localhost:8080/AxisWebService/servlet/AxisServlet就可以看到发布的服务,下面编写客户端代码4、客户端和上面HelloWorldWSDDClient一样,这里就不写了。调用后可以看到服务器端的控制台输出:state: success, count: 5, requestCount: 5state: success, count: 6, requestCount: 6state: success, count: 7, requestCount: 7state: success, count: 8, requestCount: 8why? 为什么是4次?首先请求的时候执行一次handler,响应执行一次。然后调用2个方法,那就响应了2次,所以是4次。可以注销一个方法看看是不是少了2次,state是配置文件中的消息。五、Chain链的作用Chain是一个链,是Handler的链。也就是说一次请求可能要执行多个Handler。1、下面我们就编写一个Handler,让它用chain的方法执行。package com.hoo.service.chain;import org.apache.axis.SimpleChain;import com.hoo.service.handler.RequestHandler;import com.hoo.service.handler.ResponseHandler;/* * function:用chain实现调用多个handler * author hoojo * createDate Dec 15, 2010 11:25:27 PM * file HandlerChain.java * package com.hoo.service.chain * project AxisWebService * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public class HandlerChain extends SimpleChain private static final long

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论