`
chnic
  • 浏览: 227726 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用AXIS开发Webservice(一) —— 如何发布自己的webservice

阅读更多

       因为工作关系需要从事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.        
  3.      public  String Hello(String name){   
  4.          return   "AXIS say hello to "  + name;   
  5.     }   
  6. }  

        把 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.   
  3. import  java.net.URL;   
  4.   
  5. import  javax.xml.namespace.QName;   
  6.   
  7. import  org.apache.axis.client.Call;   
  8. import  org.apache.axis.client.Service;   
  9.   
  10. public   class  Test {   
  11.        
  12.      public   static   void  main(String[] args)  throws  Exception{   
  13.         String targetEendPoint =  "http://localhost:8080/axis/HelloAXIS.jws" ;   
  14.         Service service =  new  Service();   
  15.         Call call = (Call) service.createCall();               
  16.         call.setOperationName( new  QName(targetEendPoint,  "Hello" ));   
  17.         call.setTargetEndpointAddress( new  URL(targetEendPoint));   
  18.         String result = (String) call.invoke( new  Object[]{ "Robert" });   
  19.         System.out.println(result);   
  20.     }   
  21. }   

       测试代码很简单,如果熟悉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.   
  3. public   class  HelloWorld {   
  4.        
  5.      public  HelloWorld(){   
  6.            
  7.     }   
  8.        
  9.      public  String hello(String str){   
  10.          return   "Hello "  + str;   
  11.     }   
  12.        
  13.      public   int  add( int  a,  int  b){   
  14.          return  a + b;   
  15.     }   
  16.        
  17. }   

        一个带包的很简单的类,在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.        
  4.      < service   name = "HelloWorld"   provider = "java:RPC" >   
  5.          < parameter   name = "className"   value = "com.chnic.webservice.HelloWorld" />   
  6.          < parameter   name = "allowedMethods"   value = "*" />        
  7.     </ service >   
  8. </ deployment >   

       简单的介绍下各个节点的含义,"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.   
  6. call.setOperationName( new  QName(targetEendPoint,  "hello" ));        
  7. String result = (String) call.invoke( new  Object[]{ "Robert" });   
  8. System.out.println(result);   
  9.   
  10. call.setOperationName( new  QName(targetEendPoint,  "add" ));   
  11. Integer res = (Integer) call.invoke( new  Object[]{ new  Integer( 1 ),  new  Integer( 2 )});   
  12. System.out.println( "The result is: "  + res);  

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

分享到:
评论
11 楼 sdonly 2015-12-03  
好文 ,网上乱七八糟文章一大片,条理清晰,完整全面的很少。博主赞
10 楼 lxdhq1011 2011-08-10  
你好,我想问一下android调用webservice,如何调用以复杂对象作为参数的方法,我尝试了很多次,都是无法序列化对象,不知道要怎么做才可以。173802474,这是我的QQ,有兴趣的朋友可以交流一下
9 楼 meilishiwode 2009-05-18  
楼主加我qq吧
461762790
8 楼 meilishiwode 2009-05-18  
请问我哪里错了?
7 楼 meilishiwode 2009-05-18  
- Exception:
org.xml.sax.SAXException: Fatal Error: URI=null Line=1: 缺少文件根组件。
        at org.apache.axis.utils.XMLUtils$ParserErrorHandler.fatalError(XMLUtils
.java:723)
        at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3342)
        at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3327)
        at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:635)
        at org.apache.crimson.parser.Parser2.parse(Parser2.java:333)
        at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)

        at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl
.java:185)
        at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369)
        at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388)
        at org.apache.axis.message.SOAPBodyElement.getDocumentElement(SOAPBodyEl
ement.java:90)
        at org.apache.axis.message.SOAPBodyElement.<init>(SOAPBodyElement.java:7
9)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:438)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:404)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:410)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:320)
        at org.apache.axis.client.AdminClient.main(AdminClient.java:463)
Exception: org.xml.sax.SAXException: Fatal Error: URI=null Line=1: 缺少文件根组
件。
6 楼 jackson_jar 2009-03-11  
请楼主帮忙看一下。谢谢啦。。
5 楼 jackson_jar 2009-03-11  

我用第一种即时发布时,报错如下:
这是访问的路径 http://localhost:8080/axis/HelloAXIS.jws?wsdl
AXIS error
Sorry, something seems to have gone wrong... here are the details:

Fault - Error while compiling:  F:\Tomcat 6.0\webapps\axis\WEB-INF\jwsClasses\HelloAXIS.java
AxisFault
faultCode: {http://xml.apache.org/axis/}Server.compileError
faultSubcode:
faultString: Error while compiling:  F:\Tomcat 6.0\webapps\axis\WEB-INF\jwsClasses\HelloAXIS.java
faultActor:
faultNode:
faultDetail:
{}Errors:Error compiling F:\Tomcat 6.0\webapps\axis\WEB-INF\jwsClasses\HelloAXIS.java:
Line 0, column 0:
错误: 读取 E:/javadevelop/jdk1.5/jre/lib/ext/localedata.pack 时出错;java.util.zip.ZipException: error in opening zip file
1 错误



我用第二种定制发布时:
F:\Tomcat 6.0\webapps\axis\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.clie
nt.AdminClient deploy.wsdd
Processing file deploy.wsdd
- Exception:
org.xml.sax.SAXException: Fatal Error: URI=null Line=8: XML document structures
must start and end within the same entity.
        at org.apache.axis.utils.XMLUtils$ParserErrorHandler.fatalError(XMLUtils
.java:723)
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalErro
r(ErrorHandlerWrapper.java:218)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(
XMLErrorReporter.java:386)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(
XMLErrorReporter.java:316)
        at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(X
MLScanner.java:1438)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.endEntity(XMLDocumentFragmentScannerImpl.java:663)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.endEnt
ity(XMLDocumentScannerImpl.java:556)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.endEntity(XM
LEntityManager.java:1779)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEnti
tyScanner.java:1758)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(XML
EntityScanner.java:1186)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1639)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X
ML11Configuration.java:834)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X
ML11Configuration.java:764)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.
java:148)
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.
java:250)
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Doc
umentBuilderImpl.java:292)
        at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369)
        at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388)
        at org.apache.axis.message.SOAPBodyElement.getDocumentElement(SOAPBodyEl
ement.java:90)
        at org.apache.axis.message.SOAPBodyElement.<init>(SOAPBodyElement.java:7
9)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:438)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:404)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:410)
        at org.apache.axis.client.AdminClient.process(AdminClient.java:320)
        at org.apache.axis.client.AdminClient.main(AdminClient.java:463)
Exception: org.xml.sax.SAXException: Fatal Error: URI=null Line=8: XML document
structures must start and end within the same entity.
4 楼 dracularking 2008-08-14  
阐述是相当地清晰
3 楼 蘑蘑茶 2008-05-27  
fsdfas
2 楼 zhangcheng 2007-12-12  
那个第一个url没有引号啊
1 楼 zouzou 2007-11-20  
这两天也在弄这个axis,是关于axis+spring,在网上看了一些资料,好象不是很全,所以也没有弄明白.
不知博主你玩过没有,加我QQ:179645114

相关推荐

    SpringBoot开发WebService之Axis示例

    总的来说,SpringBoot和Axis的结合为Java开发者提供了一种快速开发Web服务的方法。通过理解这两个工具的核心功能以及如何将它们集成在一起,我们可以更好地利用它们的特性来满足项目需求,同时享受到SpringBoot带来...

    利用axis开发webservice使用的jar包

    在标题中提到的"利用Axis开发Web服务使用的jar包",是指一组必要的Java类库文件,这些文件包含了Axis运行时所需的组件。在描述中提到的"调用接口使用的 Axis jar包,亲测可用",表明这些jar包是经过验证的,可以用于...

    axis 发布webservice的步骤

    标题中的“axis发布webservice的步骤”涉及到的是在Java环境中使用Apache Axis库创建并部署Web服务的过程。Apache Axis是开源的Web服务工具包,它允许开发者通过简单的API将Java类暴露为Web服务,或者调用远程Web...

    axis 开发webservice经典入门例子

    标题 "axis 开发webservice经典入门例子" 指向的是使用Apache Axis工具来创建和使用Web服务的基本教程。Apache Axis是开源的Java框架,它允许开发者轻松地在Java应用程序中构建和部署Web服务。本教程可能是为了帮助...

    利用AXIS开发Webservice教程.doc

    本文将深入讲解如何利用AXIS 1.4版本创建和发布Web服务,重点在于定制发布,因为即时发布虽然简单,但在实际开发中可能无法满足复杂需求。 首先,确保你已准备好了必要的开发环境,包括JDK 1.4.2、Myeclipse 6.0、...

    axis2webservice接口例子

    标题中的“axis2webservice接口例子”指的是使用Apache Axis2框架创建的一个Web...通过这个例子,开发者能够深入理解Web服务的工作原理,以及如何利用Apache Axis2这一强大工具来简化开发流程,提高跨平台通信的效率。

    axis发布webservice教程源代码

    【标题】"Axis发布Web服务教程源代码"指的是使用Apache Axis框架来创建并发布Web服务的教学资源,其中可能包含了详细的步骤、示例代码以及相关的配置文件。Apache Axis是开源的Java库,它允许开发者在Java平台上快速...

    利用AXIS调用webservice所需JAR包

    在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而WebService API的实现之一就是Apache Axis。本篇文章将深入探讨如何利用AXIS调用WebService,以及所需的JAR包及其作用。 首先,理解AXIS的基本概念至...

    axis2发布webservice和调用axis2服务接口

    在IT行业中,Axis2是Apache软件基金会开发的一个用于构建Web服务和Web服务客户端的框架,主要基于Java语言。本文将详细讲解如何使用Axis2来发布Web服务以及如何生成客户端代码来调用这些服务。 首先,让我们了解...

    WebService二——使用Eclipse开发WebService及各种调用方式

    WebService是一种通过Web进行交互的应用程序,它使用XML(可扩展标记语言)作为数据格式,SOAP(简单对象访问协议)作为传输协议,WSDL(Web服务描述语言)来描述服务,UDDI(统一描述、发现和集成)用于服务的发布...

    axis2开发webservice(二)

    资源包含了:axis2-1.7.4-bin.zip、axis2-1.7.4-war.zip、axis2-eclipse-...备注:资源超过了70M 分成了3部分 见axis2方式开发webservice(一)和 axis2方式开发webservice(二)、 axis2方式开发webservice(三)

    Axis2WebService 源码

    Axis2 WebService是一个开源的、基于Java的Web服务框架,由Apache软件基金会开发。它提供了构建和部署Web服务以及处理SOAP消息的强大工具。这个源码包可能是为了帮助开发者深入理解Axis2的工作原理,或者用于自定义...

    利用Axis编写简单的WebService

    本篇文章将指导你如何利用Axis来编写一个简单的WebService。 首先,我们需要理解什么是WebService。WebService是一种基于开放标准的、平台无关的通信机制,它允许不同系统间的应用程序通过互联网交换数据。SOAP是...

    eclipse+AXIS开发webservice.doc

    【知识点详解】 本文档主要介绍了如何使用Eclipse和AXIS框架开发和发布Web服务,以及进行客户端测试。以下是详细步骤和关键知识点:...通过这些步骤,开发者可以有效地在Eclipse环境中利用AXIS框架开发和测试Web服务。

    eclipse axis webservice 开发

    eclipse axis webservice 开发 eclipse下使用axis2 开发webservice系统

    java使用axis开发webservice服务端和客户端简单例子

    访问地址: http://127.0.0.1:8080/axis/services

    利用Axis构建Webservice

    ### 利用Axis构建Webservice的关键知识点 #### 一、Axis环境的安装与配置 - **基础环境需求**: - J2SE SDK 1.4:Java版本的选择非常重要,因为Axis的一些特性依赖于特定的Java版本。 - Tomcat 5.0:作为Web容器...

    Java-tomcat-axis2开发webservice返回json数据

    标题“Java-tomcat-axis2开发webservice返回json数据”涉及的是使用Java、Tomcat服务器以及Axis2框架来创建Web服务,并返回JSON格式的数据。这是一个常见的技术组合,用于构建RESTful API或者提供服务化接口。下面...

    axis开发webservice客户端

    标题中的“axis开发webservice客户端”指的是使用Apache Axis框架创建并使用Web服务客户端的过程。Apache Axis是Java平台上的一个开源工具,它简化了SOAP(Simple Object Access Protocol)Web服务的开发,包括...

    Axis2开发webservice总结

    Axis2开发webservice总结,资源一般,希望对大家有用

Global site tag (gtag.js) - Google Analytics