AXIS开发Webservice(即时发布与定制发布)_lw371496536的博客-程序员宅基地

技术标签: java  string  tomcat  service  webservice  deployment  


因为工作关系需要从事Webservice的开发工作,公司的webserivce是由Apache的AXIS来实现的,以前对这个了解不算多,不过经过几天的研究,特奉上小小的心得一篇。

先介绍下本人开发环境吧。 JDK 1.4.2 + Myeclipse 6.0(实在经不起诱惑,尝尝鲜) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在http://ws.apache.org/axis/ 找到。 假设所有的环境你已经搭好,并且AXIS包也已经下好了。OK, Here we go~

解压axis-bin-1_4.zip这个包可以看到webapps目录,双击进入把里面的AXIS文件夹拷到 %TOMCAT_HOME%/webapps目录下,之后拷贝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%/webapps/axis/WEB-INF/lib目录下。启动tomcat,访问http://localhost:8080/axis/happyaxis.jsp 如果访问成功,恭喜你!基本的配置你已经做完了。

PS:此处的%TOMCAT_HOME%指的是Tomcat的安装目录,至于那另外的三个jar包,J2EE 1.4库里就能找的到。

现在来说一下最关键的Webservice的发布。AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才是首选。这里也将会以定制发布为重点来介绍。

1.即时发布 JWS (Java Web Service) Files - Instant Deployment

即时发布提供了一种非常简单发布方式,发布者只要有Java源代码(也就是.java文件),然后把其后缀名改成jws(也就是 java web service的缩写)拷贝到%TOMCAT_HOME%/webapps/axis目录下即完成了所有的发布工作。AXIS的编译引擎会处理接下来的所有事情。下面是一段示例代码:

java 代码

  1. public class HelloAXIS { 

  2. public String Hello(String name){ 
  3. return "AXIS say hello to " + name; 
  4. }

把 HelloAXIS.java 文件改成 HelloAXIS.jws 然后拷贝到%TOMCAT_HOME%/webapps/axis目录下,启动Tomcat之后访问 http://localhost:8080/axis/HelloAXIS.jws 如果能看到 Click to see the WSDL这个超链接就说明已经发布成功了,点击进去就可以看到这个Webservice的WSDL描述文件。server端的发布已经完成了,接下来就是编写Client端测试代码了。

java 代码

  1. package com.chnic.test; 

  2. import java.net.URL; 

  3. import javax.xml.namespace.QName; 

  4. import org.apache.axis.client.Call; 
  5. import org.apache.axis.client.Service; 

  6. public class Test { 

  7. public static void main(String[] args)  throws Exception{ 
  8. String targetEendPoint =  "http://localhost:8080/axis/HelloAXIS.jws" ; 
  9. Service service =  new Service(); 
  10. Call call = (Call) service.createCall();
  11. call.setOperationName( new QName(targetEendPoint,  "Hello" )); 
  12. call.setTargetEndpointAddress( new URL(targetEendPoint)); 
  13. String result = (String) call.invoke( new Object[]{ "Robert" }); 
  14. System.out.println(result); 

测试代码很简单,如果熟悉java反射机制的朋友不用两分钟就能看明白。运行后客户端控制台出现 AXIS say hello Robert。测试成功。果然很简单吧。不过在这简单背后却是以牺牲灵活性为代价的。假如你现在手里只有.class 或者一个jar包,jws就不再能满足你的需求了,最要命的就是即时发布不支持带包的类,这点AXIS的用户手册上写的也很明白。

Important: JWS web services are intended for simple web services. You cannot use packages in the pages, and as the code is compiled at run time you can not find out about errors until after deployment. Production quality web services should use Java classes with custom deployment.

2.定制发布 Custom Deployment - Introducing WSDD

比起即时发布定制发布更加烦琐也更复杂,但是换来的却是更大的灵活性,因此在实际项目中定制发布还是不二的选择。定制发布需要你自己编写一个WSDD(Web Service Deployment Descriptor)文件,这个东东类似与XML稍后会做出介绍。废话不多说,我们来看代码:

java 代码

  1. package com.chnic.webservice; 

  2. public class HelloWorld { 

  3. public HelloWorld(){ 


  4. public String hello(String str){ 
  5. return "Hello " + str; 

  6. public int add( int a,  int b){ 
  7. return a + b; 

一个带包的很简单的类,在eclipse下编译后按照包名拷到 %TOMCAT_HOME%/webapps/axis/WEB-INF/classes 目录下。以这个类为例,拷贝完之后这个HelloWorld.class的路径就是%TOMCAT_HOME%/webapps/axis/WEB-INF/classes/com/chnic/webservice。PS: 如果嫌这样太麻烦,可以另外建一个Java Web工程用myeclipse的发布工具发布到Tomcat之后,整体一次性拷贝到websericve的工程中。

接下来就需要编写发布文件deploy.wsdd。到%TOMCAT_HOME%/webapps/axis/WEB-INF 目录下建立这个文件并在其中添加如下内容:

xml 代码

  1. < deployment xmlns = http://xml.apache.org/axis/wsdd/
  2. xmlns:java = "http://xml.apache.org/axis/wsdd/providers/java" >

  3. < service name = "HelloWorld" provider = "java:RPC" >
  4. < parameter name = "className" value = "com.chnic.webservice.HelloWorld" />
  5. < parameter name = "allowedMethods" value = "*" />


简单的介绍下各个节点的含义,"HelloWorld"当然是这个webservice的名字,后面紧跟的java:RPC指的是服务类型。这里一共有有4种类型,分别是:RPC, Document, Wrapped 和 Message。有兴趣可以看下 org.apache.axis.providers这个包和子包下面的类的API文档。之后的parameter节点第一个当然是指出具体的类,第二个从字面上也很好理解:允许调用的方法。这里的配置告诉引擎可以调用所有的public方法,当然你也可以自己指定。

编写完配置发布文件之后,cmd打开windows的控制台,进入%TOMCAT_HOME%/webapps/axis/WEB-INF目录下键入如下命令

  1. java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd

之后控制台返回Processing file deploy.wsdd 和 Done processing 这两段话即说明发布成功。(此时会在同级目录生成一个server-config.wsdd文件 )在这里的AdminClient是AXIS提供的一个客户端管理工具。至于java.ext.dirs的含义可以去了解一下classloader和JVM类装载机制方面的知识,在这里就不多解释。 还有一点要注意的是在发布的时候Tomcat服务必须处于启动状态,否则就会抛出一堆无法连接的异常信息。发布成功之后你可以通过访问 http://localhost:8080/axis/servlet/AxisServlet 来查看你所有的定制发布的服务。

客户端测试代码

  1. String targetEendPoint =  "http://localhost:8080/axis/services/HelloWorld" ; 
  2. Service service =  new Service(); 
  3. Call call = (Call) service.createCall(); 
  4. call.setTargetEndpointAddress( new URL(targetEendPoint)); 

  5. call.setOperationName( new QName(targetEendPoint,  "hello" ));
  6. String result = (String) call.invoke( new Object[]{ "Robert" }); 
  7. System.out.println(result); 

  8. call.setOperationName( new QName(targetEendPoint,  "add" )); 
  9. Integer res = (Integer) call.invoke( new Object[]{ new Integer( 1 ),  new Integer( 2 )}); 
  10. System.out.println( "The result is: " + res);

运行测试代码,控制台显示 Hello Robert 和 The result is: 3 这两句话,说明发布成功。仔细观察下发现其实除了那个targetEndpoint 之外,即时发布和定制发布的客户端调用代码基本上都是一样的。定制发布的URL可以在WSDL文件里找到。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lw371496536/article/details/8065572

智能推荐

万豪国际预计于2022年将在全球范围内开设超过30家奢华酒店;四季酒店集团2023年全新私人飞机行程发布 | 全球旅报..._美通社的博客-程序员宅基地

四季酒店集团2023年全新私人飞机行程发布。国际奢华酒店管理公司——四季酒店集团宣布,基于宾客对四季私人飞机2022年行程的高度兴趣,2023年将继续推出适合家庭出行的“非洲奇迹之旅”路线...

清理linux 服务器的命令行,使用Linux上的Magic SysRq键修复冻结的X服务器,清理重新启动并运行其他低级命令 | MOS86..._咕噜咕噜吨的博客-程序员宅基地

在Linux中,魔术SysRq键可以直接发送命令到Linux内核。您可以使用它来恢复冻结或干净地重新启动系统,即使没有任何反应。魔术SysRq键是作为Linux键盘驱动程序的一部分实现的 - 只要Linux内核仍在运行,它将会工作。只有内核崩溃才能禁用此组合键。Image Credit1010mh1112 solylunafamilia on Flickr使用Magic SysRq键SysRq键位...

linux常用操作命令、目录结构解释_一茗道人的博客-程序员宅基地

linux常用命令文章目录 linux常用命令 1、linux 目录结构 2、目录操作 ls 命令:列出cd 命令:切换目录pwd 命令:显示当前工作目录mkdir 命令: 创建文件夹...

宁波大学计算机网络实验五,宁波大学计算机网络实验四.doc_隆儿哥哥丶的博客-程序员宅基地

宁波大学计算机网络实验四宁波大学信息科学与工程学院计算机网络第四章DIY!now电子版实验报告班 级: 通信112班姓 名: 徐威学 号: 116040040完成时间: 2012-12-29[注]每个实验问题回答时可以采用截图辅助说明;实验报告(包含数据)打包成rar文件,传到Reports文件夹,并用 学号+姓名+章号 命名,如山-Reports-.rar...

ajax提交成功后局部刷新 jq_jQuery ajaxSubmit 实现ajax提交表单局部刷新_零悠悠的博客-程序员宅基地

AJAX简介AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。AJAX 不是新的编程语言,而是一种使用现有标准的新方法。AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。需要引入 : jquery-form.js使用说明:Java代码$(document).ready(function() {va...

mysql中usage是什么权限?_weixin_34068198的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

随便推点

Java中dynamic是什么_java中dynamic web project与web project 的区别_RemusrickCat的博客-程序员宅基地

java中dynamic web project与web project 的区别1.DynamicWeb Project 概念2.eclipse 中的动态Web 项目与 Myeclipse 中的web项目有何区别3.动态的运行原理及目录结构—是否都涉及到由类生成表的技术(如果没的话,也应该 把这个搞清楚)4,如何建立server?5.如何建立一个动态Web?要知道各配置文件的作用6.熟悉auc...

关于socket阻塞与非阻塞情况下的recv、send、read、write返回值及用setsockopt()来控制recv()与send()的超时_whymewuxian的博客-程序员宅基地_socket 非阻塞模式

地址转换时的htonl和inet_pton 参数是32bit的二进制数值,在转换地址时就是32位的主机字节序ip地址(经常用点分十进制) 用法:servaddr.sin_addr.s_addr=htonl(127.0.0.1); servaddr.sin_addr.s_addr=htonl(INADDR_ANY); // INADDR_ANY真实值为0.0.0.0int i

Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3)_chuoshao2508的博客-程序员宅基地

 Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3) Android Bluetooth蓝牙设备的连接编程模型和Java socket网络连接编程模型类型。Android不同设备间的蓝牙连接,首先在编程模型上分为“服务器端(server...

php js offset,全栈工程师看过来!PHP Javascript语法对照、速查_weixin_39523529的博客-程序员宅基地

PHP、JavaScript 语法对照、速查全栈工程师看过来,学的计算机语言多了,往往会把不同语言的各个函数搞混。作为一个全栈PHPer,往往PHP、JavaScript 语法傻傻分不清楚,百度一下,查手册要网速。不如收藏下这篇文章,打印出来,贴到一旁快速查阅。相关推荐:《PHP视频教程》《javascript高级教程》JavaScript 的一些数组map函数有jQuery实现,ES6后,又出了...

程序编码(机器级代码+汇编代码+C代码+反汇编)_PacosonSWJTU的博客-程序员宅基地_程序编码

【0】写在前面——程序编码GCC调用了一系列程序,将源代码转化成可执行代码的流程如下:(1)C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏;(2)编译器产生两个源代码的汇编代码:*.s;(3)汇编器将汇编代码转化为二进制目标代码 :*.o ; (目标代码是机器代码的一种形式,它包含所有指令的二进制表示,但没有填入地址的全局值)(4)链接器将目标代码与实现库函

Web服务器如何确定哪个Servlet处理请求_一瓣向日葵的博客-程序员宅基地

一、Web服务器二、Servlet三、Web服务器确定Servlet处理请求过程