精华内容
下载资源
问答
  • Axis2分发包Axis2分几种不同的分发包来提供,可以被当作独立的服务器运行或是当作j2ee兼容的servlet容器的一部分来运行,Axis2遵循Apache授权协议2.0这里的安装向导主要集中在使用独立的二进制分发包来运行Apache ...

    Axis2分发包

    Axis2分几种不同的分发包来提供,可以被当作独立的服务器运行或是当作j2ee兼容的servlet容器的一部分来运行,Axis2遵循Apache授权协议2.0这里的安装向导主要集中在使用独立的二进制分发包来运行Apache Axis2.

    Download  Apache Axis2 1.6.3  (最新版).

    Download 所有版本的 Apache Axis2.

    发布包以下列的几种形式提供:

    1.  标准二进制发布包

    这是Axis2最完整的版本,包括例子和脚本。

    2. WAR (Web Archive) 发布包

    是Axis2的WEB应用,可以被部署到servlet容器。

    3. 文档发布包

    包括了所有的axis2文档,其中分为xdocs和java api docs两个目录包。

    4. 源文件发布包

    包含Axis2标准版本的源文件,更适合高级用户来使用,可以使用$mvn -Drelease来生成以个二进制发布包。你在运行该命令的时候需要配置Axis2 环境变量,在高级部分,我们会进行详细说明,带领你一步一步的完成这个工作。

    Download 下载源文件分发包

    系统要求

    Java Development Kit (JDK)1.5 或 更高版本 (安装jdk可以访问 http://java.sun.com)

    磁盘空间二进制分发包大概需要11M的磁盘空间

    兼容的操作系统Windows XP, Linux, Mac OS X, Fedora core, Ubuntu, Gentoo

    项目工具-Apache Ant

    可以用来运行例子和从Axis2二进制分发包生成WARb包版本 1.6.5 或更高版本 (download).

    项目工具- Apache Maven 2.x

    当你从源代码分发包建立Axis2的时候需要。版本2.0.7 或 更高 in Maven 2.x series (download).

    Axis2已经不再支持Maven 1.x.

    在安装Axis2的时候,请确保以上安装条件的满足。

    使用独立二进制分发包安装一个独立的Axis2服务器。

    本小节提供如下信息:使用二进制分发包安装Axis2

    启动Axis2独立服务器

    使用独立二进制分发包建立一个axis2.war文件,以作为j2ee兼容的servlet容器的一部分运行

    运行Axis2的脚本

    1. 下载并安装Axis2二进制分发包

    下载并安装一个jdk(版本需要1.5以上),设置JAVA_HOME环境变量,指向你的jdk安装目录。

    下载并解压缩Axis2标准二进制分发包到一个合适的目录,设置AXIS2_HOME环境变量指向解压缩的目录例如/opt/axis2-1.6.3 linux用户可以运行setenv.sh文件,该文件在AXIS2_HOME/bin目录,来设置AXIS2_HOME环境变量指向Axis2类路径。

    2.  启动Axis2 独立服务器

    独立的Axis2 服务器可以通过键入下列的命令来启动:

    %AXIS2_HOME%inaxis2server.bat (Windows)

    $AXIS2_HOME/bin/axis2server.sh (Unix)

    启动以后,一组默认的web服务就会通过访问http://localhost:8080/axis2/services/可以看到,并可用。

    3. 使用独立二进制分发包建立Axis2的web应用(axis2.war)

    Download 并 安装 Apache Ant (版本 1.6.5 或 更高版本).

    在Axis2的主目录下的webapp目录,你可以找到ant的build文件-build.xml例如($AXIS2_HOME/webapp),通过执行ant create.war命令在AXIS2_HOME/webapps目录下,你可以在AXIS2_HOME/dist目录下找到生成的axis2.war文件。所有的可用服务和模块在AXIS2_HOME/repository里存在的都会被打包到axis2.war文件,同时还包括axis2.xml配置文件,该文件在AXIS2_HOME/conf/目录下

    阅读 在servlet容器内安装Axis2 以找到合适的指导方法,来安装你的axis2.war到servlet容器。

    4. 熟悉 Axis2 脚本

    建议把AXIS2_HOME/bin添加到PATH环境变量,这样你可以自由灵活的执行下面的脚本了。脚本名字功能描述

    axis2.{bat|sh}你可以用该脚本来运行使用Axis2写的web服务客户端,该脚本会调用 java命令在添加了Axis2 独立库路径以后(*.jar文件都在AXIS2_HOME/lib目录下),设置Axis2库位置(AXIS2_HOME/repository)和设置Axis2配置文件路径(AXIS2_HOME/conf/axis2.xml)为你。使用该脚本,你可以确保配置了所有上述Axis2所需要的特定参数。

    使用方法 : axis2.{sh.bat} [-options] class [args...]

    axis2server.{sh|bat}该脚本可以启动一个独立的Axis2服务器,使用AXIS2_HOME/repository当作Axis2库使用AXIS2_HOME/conf/axis2.xml当作Axis2的配置文件,该命令会启动所有的传输监听接口,这些接口只要在AXIS2_HOME/conf/axis2.xml配置了。

    例如你想部署一个服务使用一个独立的Axis2 服务器,那么你复制你的服务包到AXIS2_HOME/repository/services目录,然后你在AXIS2_HOME/conf/axis2.xml配置文件的Transport Ins段来配置传输的接收者(simpleHttpServer默认在端口8080),然后执行该脚本。

    服务可以通过在命令行下添加-xdebug来启动调试模式,一个远程的调试器可以被附在端口8000 连接上。

    wsdl2java.{bat|sh}该脚本可以通过特定的WSDL文件来生成java代码文件来处理web服务的调用(是客户端的代码结构)该脚本也可以通过给定的wsdl来生成web服务的结构。

    语法格式: wsdl2java.{sh|bat} [OPTION]... -uri

    例如 wsdl2java.sh -uri ../wsdl/Axis2Sample.wsdl

    更多信息请访问 here

    java2wsdl.{bat|sh}该脚本可以通过给定的java类来生成合适的wsdl文件。

    语法格式: Java2WSDL.{sh|bat} [OPTION]... -cn

    例子:Java2WSDL.sh -cn ../samples/test/searchTool.Search

    更多信息请访问 here

    在一个Servlet容器内安装Axis2

    下面是具体的安装不受:使用Axis2独立二进制分发包建立Axis2 war文件,你也可以下载axis2.war文件或者使用源代码分发包制作axis2.war 文件。

    把该war文件放到servlet容器的webapps目录,大多数的servlet容器都会自动安装该WAR文件的。(有部分servlet容器需要重新启动才能识别放进去的新的web应用,所以这个要注意不同的情况)

    一旦WAR文件被成功安装,你可以通过访问http://axis2来进行测试,你会看到如下的界面:

    使用Validate链接来确保所有的服务都运行正确,如果Validation失败,那么WAR 的安装就不正常或者某些基础的jar文件丢失了,在这种情况下,请参考特定servlet 容器的文档,来寻找问题,下图是成功验证的界面:

    上传服务

    Axis2 Web应用也提供了一个界面来上传服务,一旦一个服务的包文件被生成,通常是.aar文件,就可以使用这里的上传页面功能。

    上传的.aar文件会保存到一个默认的服务目录下,例如Axis2会使用/axis2/WEB-INF/services目录,一旦上传完成,就会立刻对该服务进行安装。

    自从Axis2支持热部署以后,你可以把服务包文件直接通过文件系统放到服务目录下,也可以实现服务的自动安装,不需要容器重新启动。

    使用Web应用主页的Services链接来检查服务是否安装成功,成功安装的服务会在可用服务页面被显示出来。

    如果服务的部署过程出了错误,那么它会作为失效的服务显示出来,如果你检查该链接,你会发现部署的错误消息。

    部署时生成的错误消息

    Axis2 系统管理员可以在运行的时候配置所有的Axis2 配置项目,并且这些配置项是可以立刻生效的,更多的参考信息请访问:Axis2 Web 管理员

    高级

    Axis2 源代码发布包

    通过使用源代码发布包,可以借助Maven命令生成二进制发布包和axis2.war文件包。

    所需的jar文件不会包括在分发包中,它们需要你运行maven命令来生成,在我们开始之前,你需要安装Maven2和配置相关的参数。

    配置环境与安装工具

    Maven

    Axis2的build都是基于Maven2因此你需要确保Maven的正确安装,更多的信息,你可以参考maven的官网。Windows平台下下载并运行maven的安装文件。

    设置环境变量 ( 生成系统环境变量 MAVEN_HOME 并编辑path变量,把 %MAVEN_HOME%in放到PATH路径上)

    确保配置好了JAVA_HOME变量

    运行 mvn -v 或 mvn -version 验证Maven是否被成功安装。

    unix和Linux平台

    使用tar 或zip文档文件是最好的选择,一旦这些归档文件被下载并解压缩到一个给定的目录,那么就开始设置MAVEN_HOME和MAVEN_HOME/bin路径吧,更多安装指导仍然请参考Maven官网。

    一旦Maven被正确安装,我们就可以组建Axis2 了。

    我们需要熟悉Maven的常用命令,这需要大家访问Maven官网,熟悉其命令的使用格式。

    生成二进制和WAR分发包使用源代码分发包。

    源代码分发包是以zip压缩包的方式存在的,包括所有的 build脚本,一旦下载并解压缩源代码分发包到了特定的目录,那么切换到那个目录,并运行mvn install命令就可以生成Axis2 jar文件。

    一旦该命令执行完毕,那么二进制的jar文件可以在target目录被发现。

    注意: 在第一次执行maven命令的时候,maven会执行下载所需组件的过程,通常会需要几分钟,但是只执行一次,后续就不会反复下载了。

    默认的maven build过程会把生成的war 文件放到webapp/target目录中。

    谢谢,阅读,更多文章,请关注官网微信号 elearn007.

    展开全文
  • 文件名大小更新时间axis2-1.7.902018-11-16axis2-1.7.9\apidocs02018-11-16axis2-1.7.9\etc02018-11-16axis2-1.7.9\etc\IDEA02018-11-16axis2-1.7.9\legal02018-11-16axis2-1.7.9\modules02018-11-16axis2-1.7.9\...

    文件名大小更新时间

    axis2-1.7.902018-11-16

    axis2-1.7.9\apidocs02018-11-16

    axis2-1.7.9\etc02018-11-16

    axis2-1.7.9\etc\IDEA02018-11-16

    axis2-1.7.9\legal02018-11-16

    axis2-1.7.9\modules02018-11-16

    axis2-1.7.9\modules\adb02018-11-16

    axis2-1.7.9\modules\adb\src02018-11-16

    axis2-1.7.9\modules\adb\src\org02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis202018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding\i18n02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding\typemapping02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding\types02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding\types\soapencoding02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding\types\xsd02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding\utils02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\databinding\utils\reader02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\rpc02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\rpc\client02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\rpc\receivers02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\rpc\receivers\ejb02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\transport02018-11-16

    axis2-1.7.9\modules\adb\src\org\apache\axis2\transport\java02018-11-16

    axis2-1.7.9\modules\adb\test02018-11-16

    axis2-1.7.9\modules\adb\test\org02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis202018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding\types02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding\types\soapencoding02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding\types\xsd02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding\utils02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding\utils\reader02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding\wsdl02018-11-16

    axis2-1.7.9\modules\adb\test\org\apache\axis2\databinding\wsdl\codegen02018-11-16

    axis2-1.7.9\modules\adb\test-resources02018-11-16

    axis2-1.7.9\modules\adb\test-resources\xmls02018-11-16

    axis2-1.7.9\modules\adb-codegen02018-11-16

    axis2-1.7.9\modules\adb-codegen\src02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache\axis202018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache\axis2\schema02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache\axis2\schema\i18n02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache\axis2\schema\template02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache\axis2\schema\typemap02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache\axis2\schema\util02018-11-16

    axis2-1.7.9\modules\adb-codegen\src\org\apache\axis2\schema\writer02018-11-16

    axis2-1.7.9\modules\adb-codegen\test02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\helper02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\helper\org02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\helper\org\apache02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\helper\org\apache\axis202018-11-16

    axis2-1.7.9\modules\adb-codegen\test\helper\org\apache\axis2\schema02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\helper\org\apache\axis2\schema\testsuite02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis202018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\all02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\anytype02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\attribute02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\base64binary02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\booleantest02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\chameleon02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\choice02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\compile02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\compile\simple02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\decimal02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\defaultnamespaces02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\defaultvalue02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\enumeration02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\extension02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\fix02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\group02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\innerchoice02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\innerparticleextension02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\innerparticles02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\list02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\nonamespace02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\particlemaxoccurs02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\populate02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\populate\derived02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\populate\other02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\populate\simple02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\references02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\restriction02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\soapencoding02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\testsuite02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\union02018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\union202018-11-16

    axis2-1.7.9\modules\adb-codegen\test\org\apache\axis2\schema\unqualified02018-11-16

    axis2-1.7.9\modules\adb-codegen\test-resources02018-11-16

    axis2-1.7.9\modules\adb-codegen\test-resources\schemas02018-11-16

    axis2-1.7.9\modules\adb-codegen\test-resources\schemas\custom_schemas02018-11-16

    axis2-1.7.9\modules\adb-codegen\test-resources\soapencoding02018-11-16

    axis2-1.7.9\modules\adb-codegen\test-resources\std02018-11-16

    axis2-1.7.9\modules\adb-codegen\test-resources\testsuite02018-11-16

    展开全文
  • axis2-1.7.9-bin

    2021-04-21 11:23:28
    axis2-1.7.9, 0 , 2018-11-16axis2-1.7.9\repository, 0 , 2018-11-16axis2-1.7.9\repository\modules, 0 , 2018-11-16axis2-1.7.9\repository\services, 0 , 2018-11-16axis2-1.7.9\bin, 0 , 2018-11-16axis2-1.7.9...

    axis2-1.7.9, 0 , 2018-11-16

    axis2-1.7.9\repository, 0 , 2018-11-16

    axis2-1.7.9\repository\modules, 0 , 2018-11-16

    axis2-1.7.9\repository\services, 0 , 2018-11-16

    axis2-1.7.9\bin, 0 , 2018-11-16

    axis2-1.7.9\conf, 0 , 2018-11-16

    axis2-1.7.9\webapp, 0 , 2018-11-16

    axis2-1.7.9\lib, 0 , 2018-11-16

    axis2-1.7.9\samples, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\client, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\client\src, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\client\src\samples, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\client\src\samples\databinding, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\docs, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\service, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\service\src, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\service\src\samples, 0 , 2018-11-16

    axis2-1.7.9\samples\databinding\service\src\samples\databinding, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling\client, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling\client\src, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling\client\src\example, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling\docs, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling\service, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling\service\src, 0 , 2018-11-16

    axis2-1.7.9\samples\faulthandling\service\src\example, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src\main, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src\main\demo, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src\main\demo\hw, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src\main\demo\hw\server, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src\webapp, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src\webapp\WEB-INF, 0 , 2018-11-16

    axis2-1.7.9\samples\java_first_jaxws\src\webapp\WEB-INF\classes, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-addressbook, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-addressbook\src, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-addressbook\src\org, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-addressbook\src\org\apache, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-addressbook\src\org\apache\axis2, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-addressbook\src\org\apache\axis2\jaxws, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-addressbook\src\org\apache\axis2\jaxws\addressbook, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\resources, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\resources\META-INF, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\src, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\src\org, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\src\org\apache, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\src\org\apache\axis2, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\src\org\apache\axis2\jaxws, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\src\org\apache\axis2\jaxws\calculator, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-calculator\src\org\apache\axis2\jaxws\calculator\client, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\resources, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\resources\wsdl, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\src, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\src\org, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\src\org\apache, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\src\org\apache\axis2, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\src\org\apache\axis2\jaxws, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\src\org\apache\axis2\jaxws\sample, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-dynamic\src\org\apache\axis2\jaxws\sample\dynamic, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\resources, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\resources\META-INF, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\com, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\com\microsoft, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\com\microsoft\schemas, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\com\microsoft\schemas\_2003, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\com\microsoft\schemas\_2003\_10, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\com\microsoft\schemas\_2003\_10\serialization, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\apache, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\apache\axis2, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\apache\axis2\jaxws, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\apache\axis2\jaxws\interop, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\datacontract, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\datacontract\schemas, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\datacontract\schemas\_2004, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\datacontract\schemas\_2004\_07, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\datacontract\schemas\_2004\_07\system, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-interop\src\org\tempuri, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\client, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\client\echo, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\client\mtom, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\client\ping, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\echo, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\handler, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\mtom, 0 , 2018-11-16

    axis2-1.7.9\samples\jaxws-samples\src\main\org\apache\axis2\jaxws\samples\ping, 0 , 2018-11-16

    展开全文
  • 本文转自百度文库Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。这些都将在后面的系列...

    本文转自百度文库

    Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。这些都将在后面的系列教程中讲解。在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用Java和C#调用这个WebService。

    一、Axis2的下载和安装

    读者可以从如下的网址下载Axis2的最新版本:

    在本文使用了目前Axis2的最新版本1.4.1。读者可以下载如下两个zip包:

    axis2-1.4.1-bin.zip

    axis2-1.4.1-war.zip

    其中axis2-1.4.1-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.4.1-war.zip文件用于将WebService发布到Web容器中。

    将axis2-1.4.1-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到\webapps目录中(本文使用的Tomcat的版本是6.x),并启动Tomcat。

    在浏览器地址栏中输入如下的URL:

    如果在浏览器中显示出如图1所示的页面,则表示Axis2安装成功。

    999d29ea6ef86e597b3db3e85957cb4b.png

    图1

    二、编写和发布WebService

    对于用Java实现的服务程序给人的印象就是需要进行大量的配置,不过这一点在Axis2中将被终结。在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。

    下面我们来实现一个简单的POJO,代码如下:

    public classSimpleService

    {publicString getGreeting(String name)

    {return "你好 " +name;

    }public intgetPrice()

    {return new java.util.Random().nextInt(1000);

    }

    }

    在SimpleService类中有两个方法,由于这两个方法都是public方法,因此,它们都将作为WebService方法被发布。

    编译SimpleService类后,将SimpleService.class文件放到\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录)。现在我们已经成功将SimpleService类发布成了WebService。在浏览器地址栏中输入如下的URL:

    这时当前页面将显示所有在Axis2中发布的WebService,如图2所示。

    7426c8c56dc683111ddc1ba304829f12.png

    图2

    在浏览器地址栏中输入如下的两个URL来分别测试getGreeting和getPrice方法:

    图3和图4分别显示了getGreeting和getPrice方法的测试结果。

    1d8d3b225b04733e37e1b7358f168da6.png

    图3  getGreeting方法的测试结果

    e4188c1bda05b751f87f16176bfea446.png

    图4  getPrice方法的测试结果

    在编写、发布和测试0配置的WebService时应注意如下几点:

    1. POJO类不能使用package关键字声明包。

    2. Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。如果想取消Axis2的热发布功能,可以打开\webapps\axis2\WEB-INF\conf\axis2.xml,找到如下的配置代码:

    true

    将true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新,也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。在axis2.xml文件中找到false,将false改为true即可。

    3. 在浏览器中测试WebService时,如果WebService方法有参数,需要使用URL的请求参数来指定该WebService方法参数的值,请求参数名与方法参数名要一致,例如,要测试getGreeting方法,请求参数名应为name,如上面的URL所示。

    4. 发布WebService的pojo目录只是默认的,如果读者想在其他的目录发布WebService,可以打开axis2.xml文件,并在元素中添加如下的子元素:

    上面的配置允许在\webapps\axis2\WEB-INF\my目录中发布WebService。例如,将本例中的SimpleService.class复制到my目录中也可以成功发布(但要删除pojo目录中的SimpleService.class,否则WebService会重名)。

    三、用Java实现调用WebService的客户端程序

    WebService是为程序服务的,只在浏览器中访问WebService是没有意义的。因此,在本节使用Java实现了一个控制台程序来调用上一节发布的WebService。调用WebService的客户端代码如下:

    packageclient;importjavax.xml.namespace.QName;importorg.apache.axis2.addressing.EndpointReference;importorg.apache.axis2.client.Options;importorg.apache.axis2.rpc.client.RPCServiceClient;public classRPCClient

    {public static void main(String[] args) throwsException

    {//使用RPC方式调用WebService

    RPCServiceClient serviceClient = newRPCServiceClient();

    Options options=serviceClient.getOptions();//指定调用WebService的URL

    EndpointReference targetEPR = newEndpointReference("http://localhost:8080/axis2/services/SimpleService");

    options.setTo(targetEPR);//指定getGreeting方法的参数值

    Object[] opAddEntryArgs = new Object[] {"超人"};//指定getGreeting方法返回值的数据类型的Class对象

    Class[] classes = new Class[] {String.class};//指定要调用的getGreeting方法及WSDL文件的命名空间

    QName opAddEntry = new QName("http://ws.apache.org/axis2", "getGreeting");//调用getGreeting方法并输出该方法的返回值

    System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);//下面是调用getPrice方法的代码,这些代码与调用getGreeting方法的代码类似

    classes = new Class[] {int.class};

    opAddEntry= new QName("http://ws.apache.org/axis2", "getPrice");

    System.out.println(serviceClient.invokeBlocking(opAddEntry,new Object[]{}, classes)[0]);

    }

    }

    运行上面的程序后,将在控制台输出如下的信息:

    你好 超人

    443

    在编写客户端代码时应注意如下几点:

    1. 客户端代码需要引用很多Axis2的jar包,如果读者不太清楚要引用哪个jar包,可以在Eclipse的工程中引用Axis2发行包的lib目录中的所有jar包。

    2. 在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。

    3. 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

    4. 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是元素的targetNamespace属性值,下面是SimpleService类生成的WSDL文件的代码片段:

    四、用wsdl2java简化客户端的编写

    也许有很多读者会说“有没有搞错啊,只调用两个WebService方法用要写这么多代码,太麻烦了”。

    不过幸好Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。wsdl2java.bat命令可以在"bin目录中找到。在使用wsdl2java.bat命令之前需要设置AXIS2_HOME环境变量,该变量值是。

    在Windows控制台输出如下的命令行来生成调用WebService的代码:

    %AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p com.jlins.client -s -o stub

    其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,读者就会发现在当前目录下多了个stub目录,在."stub"src"client目录可以找到一个SimpleServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类,代码如下:

    packageclient;importjavax.xml.namespace.QName;importorg.apache.axis2.addressing.EndpointReference;importorg.apache.axis2.client.Options;importorg.apache.axis2.rpc.client.RPCServiceClient;public classStubClient

    {public static void main(String[] args) throwsException

    {

    SimpleServiceStub stub= newSimpleServiceStub();

    SimpleServiceStub.GetGreeting gg= newSimpleServiceStub.GetGreeting();

    gg.setName("比尔");

    System.out.println( stub.getGreeting(gg).get_return());

    System.out.println(stub.getPrice().get_return());

    }

    }

    上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名为方法名,例如,getGreeting方法的参数都封装在了GetGreeting类中,要想调用getGreeting方法,必须先创建GetGreeting类的对象实例。

    五、使用C#调用WebService

    从理论上说,WebService可以被任何支持SOAP协议的语言调用。在Visual Studio中使用C#调用WebService是在所有语言中最容易实现的(VB.net的调用方法类似,也同样很简单)。

    新建一个Visual Studio工程,并在引用Web服务的对话框中输入如下的URL,并输入Web引用名为“WebService”:

    然后引用Web服务的对话框就会显示该WebService中的所有的方法,如图5所示。

    6ca8144bce270c4d0519f438076638fb.png

    图5

    在完成上面的工作后,只需要如下三行C#代码就可以调用getGreeting和getPrice方法,并显示这两个方法的返回值:

    WebService.SimpleService simpleService = newWSC.WebService.SimpleService();

    MessageBox.Show( simpleService.getGreeting("比尔"));

    MessageBox.Show(simpleService.getPrice().@return.ToString());

    在.net解析WSDL文件时直接将getGreeting方法的参数映射为String类型,因此,可以直接进行传值。

    从上面的调用过程可以看出,添加Web引用的过程就相当于在Java中调用wsdl2java.bat自动生成stub类的过程。只是在调用stub类时与C#有一定的区别,但从总体上来说,都大大简化了调用WebService的过程。

    在实际的应用中,不仅需要使用WebService来传递简单类型的数据,有时也需要传递更复杂的数据,这些数据可以被称为复合类型的数据。数组与类(接口)是比较常用的复合类型。在Axis2中可以直接使用将WebService方法的参数或返回值类型声明成数组或类(接口)。但要注意,在定义数组类型时只能使用一维数组,如果想传递多维数组,可以使用分隔符进行分隔,如下面的代码所示:

    String[] strArray = new String[]{ "自行车,飞机,火箭","中国,美国,德国", "超人,蜘蛛侠,钢铁侠" } ;

    上面的代码可以看作是一个3*3的二维数组。

    在传递类的对象实例时,除了直接将数组类型声明成相应的类或接口,也可以将对象实例进行序列化,也就是说,将一个对象实例转换成字节数组进行传递,然后接收方再进行反序列化,还原这个对象实例。

    下面的示例代码演示了如何传递数组与类(接口)类型的数据,并演示如何使用字节数组上传图像。本示例的客户端代码使用Java和C#编写。要完成这个例子需要如下几步:

    一、实现服务端代码

    ComplexTypeService是一个WebService类,该类的代码如下:

    importjava.io.FileOutputStream;importdata.DataForm;public classComplexTypeService

    {//上传图像,imageByte参数表示上传图像文件的字节,//length参数表示图像文件的字节长度(该参数值可能小于imageByte的数组长度)

    public boolean uploadImageWithByte(byte[] imageByte, intlength)

    {

    FileOutputStream fos= null;try{//将上传的图像保存在D盘的test1.jpg文件中

    fos = new FileOutputStream("d:\\test1.jpg");//开始写入图像文件的字节

    fos.write(imageByte, 0, length);

    fos.close();

    }catch(Exception e)

    {return false;

    }finally{if (fos != null)

    {try{

    fos.close();

    }catch(Exception e)

    {

    }

    }

    }return true;

    }//返回一维字符串数组

    publicString[] getArray()

    {

    String[] strArray= new String[]{ "自行车", "飞机", "火箭"};returnstrArray;

    }//返回二维字符串数组

    publicString[] getMDArray()

    {

    String[] strArray= new String[]{ "自行车,飞机,火箭","中国,美国,德国", "超人,蜘蛛侠,钢铁侠"} ;returnstrArray;

    }//返回DataForm类的对象实例

    publicDataForm getDataForm()

    {return newDataForm();

    }//将DataForm类的对象实例序列化,并返回序列化后的字节数组

    public byte[] getDataFormBytes() throwsException

    {

    java.io.ByteArrayOutputStream baos= newjava.io.ByteArrayOutputStream();

    java.io.ObjectOutputStream oos= newjava.io.ObjectOutputStream(baos);

    oos.writeObject(newDataForm());returnbaos.toByteArray();

    }

    }

    二、实现DataForm类

    DataForm是要返回的对象实例所对应的类,该类的实现代码如下:

    packagedata;public class DataForm implementsjava.io.Serializable

    {private String name = "bill";private int age = 20;publicString getName()

    {returnname;

    }public voidsetName(String name)

    {this.name =name;

    }public intgetAge()

    {returnage;

    }public void setAge(intage)

    {this.age =age;

    }

    }

    三、发布WebService

    由于本示例的WebService类使用了一个Java类(DataForm类),因此,在发布WebService之前,需要先将DataForm.class文件复制到\webapps\axis2\WEB-INF\classes\data目录中,然后将ComplexTypeService.class文件复制到\webapps\axis2\WEB-INF\pojo目录中,最后启动Tomcat(如果Tomcat已经启动,由于增加了一个DataForm类,因此,需要重新启动Tomcat)。

    四、使用Java编写调用WebService的客户端代码

    在客户端仍然使用了RPC的调用方式,代码如下:

    packageclient;importjavax.xml.namespace.QName;importorg.apache.axis2.addressing.EndpointReference;importorg.apache.axis2.client.Options;importorg.apache.axis2.rpc.client.RPCServiceClient;public classComplexTypeRPCClient

    {public static void main(String[] args) throwsException

    {

    RPCServiceClient serviceClient= newRPCServiceClient();

    Options options=serviceClient.getOptions();

    EndpointReference targetEPR= newEndpointReference("http://localhost:8080/axis2/services/ComplexTypeService");

    options.setTo(targetEPR);//下面的代码调用uploadImageWithByte方法上传图像文件

    ///打开图像文件,确定图像文件的大小

    java.io.File file = new java.io.File("f:\\images.jpg");

    java.io.FileInputStream fis= new java.io.FileInputStream("f:\\images.jpg");//创建保存要上传的图像文件内容的字节数组

    byte[] buffer = new byte[(int) file.length()];//将图像文件的内容读取buffer数组中

    int n =fis.read(buffer);

    System.out.println("文件长度:" +file.length());

    Object[] opAddEntryArgs= newObject[]{ buffer, n };

    Class[] classes= new Class[]{ Boolean.class};

    QName opAddEntry= new QName("http://ws.apache.org/axis2","uploadImageWithByte");

    fis.close();//开始上传图像文件,并输出uploadImageWithByte方法的返回传

    System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);///下面的代码调用了getArray方法,并返回一维String数组

    /

    opAddEntry = new QName("http://ws.apache.org/axis2", "getArray");

    String[] strArray=(String[]) serviceClient.invokeBlocking(opAddEntry,new Object[]{}, new Class[]{String[].class })[0];for(String s : strArray)

    System.out.print(s+ " ");

    System.out.println();///下面的代码调用了getMDArray方法,并返回一维String数组

    /

    opAddEntry = new QName("http://ws.apache.org/axis2", "getMDArray");

    strArray= (String[]) serviceClient.invokeBlocking(opAddEntry, newObject[]{},new Class[]{String[].class})[0];for(String s : strArray)

    {

    String[] array= s.split(",");for(String ss: array)

    System.out.print(" ");

    System.out.println();

    }

    System.out.println();///下面的代码调用了getDataForm方法,并返回DataForm对象实例

    /

    opAddEntry = new QName("http://ws.apache.org/axis2", "getDataForm");

    data.DataForm df= (data.DataForm) serviceClient.invokeBlocking(opAddEntry, newObject[]{},new Class[]{data.DataForm.class})[0];

    System.out.println(df.getAge());///下面的代码调用了getDataFormBytes方法,并返回字节数组,最后将返回的字节数组反序列化后,转换成DataForm对象实例

    /

    opAddEntry = new QName("http://ws.apache.org/axis2", "getDataFormBytes");

    buffer= (byte[]) serviceClient.invokeBlocking(opAddEntry, new Object[]{}, new Class[]{byte[].class})[0];

    java.io.ObjectInputStream ois= newjava.io.ObjectInputStream(newjava.io.ByteArrayInputStream(buffer));

    df=(data.DataForm) ois.readObject();

    System.out.println(df.getName());//}

    }

    运行上面的程序,将输出如下的内容:

    文件长度:3617

    true

    自行车 飞机 火箭

    20

    bill

    五、使用C#编写调用WebService的客户端代码

    在Visual Studio中使用WebService就简单得多。假设引用WebService时的引用名为complexType,则下面的代码调用了uploadImageWithByte方法来上传图像文件。在Visual Studio引用WebService时,uploadImageWithByte方法多了两个out参数,在使用时要注意。

    complexType.ComplexTypeService cts = newWSC.complexType.ComplexTypeService();

    System.IO.FileStream fs= new System.IO.FileStream(@"f:\images.jpg", System.IO.FileMode.Open);byte[] buffer = new byte[fs.Length];

    fs.Read(buffer,0, (int)fs.Length);

    bool r;

    bool rs;

    cts.uploadImageWithByte( buffer, (int)fs.Length, true, out r, out rs);

    在获得二维数组时,可以将数据加载到DataGridView或其他类似的控件中,代码如下:

    String[] strArray =cts.getMDArray();for (int i = 0; i < strArray.Length; i++)

    {//用正则表达式将带分隔符的字符串转换成String数组

    String[] columns = strArray[i].Split(',');//如果DataGridView的表头不存在,向DataGridView控件添加三个带表头的列

    if (dataGridView1.Columns.Count == 0)for (int j = 0; j < columns.Length; j++)

    dataGridView1.Columns.Add("column" + (j + 1).ToString(), "列" + (j + 1).ToString());//添加行

    dataGridView1.Rows.Add(1);for(int j = 0; j < columns.Length; j++)

    {

    dataGridView1.Rows[i].Cells[j].Value=columns[j];

    }

    }

    向DataGridView控件添加数据后的效果如图1所示。

    38024157086e9b013da127946110eae9.png

    图1

    对于其他的WebService方法的调用都非常简单,读者可以自己做这个实验。

    要注意的是,由于.net和java序列化和反序列化的差异,通过序列化的方式传递对象实例只使用于客户端与服务端为同一种语言或技术的情况,如客户端和服务端都使用Java来编写。

    如果读者要上传大文件,应尽量使用FTP的方式来传递,而只通过WebService方法来传递文件名等信息。这样有助于提高传输效率。

    下一篇:WebService大讲堂之Axis2(3):使用services.xml文件发布WebService

    用Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便,为此,Axis2也允许将带包的POJO类发布成Web Service。

    先实现一个POJO类,代码如下:

    packageservice;public classMyService

    {publicString getGreeting(String name)

    {return "您好 " +name;

    }public voidupdate(String data)

    {

    System.out.println("已经更新");

    }

    }

    这个类有两个方法,这两个方法都需要发布成Web Service方法。这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:

    Web Service例子

    service.MyService

    其中元素用于发布Web Service,一个元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:

    其中name属性名就是上面URL中"?"和"/"之间的部分。

    元素表示当前Web Service的描述,元素用于设置WebService的参数,在这里用于设置WebService对应的类名。在这里最值得注意的是元素,该元素用于设置处理WebService方法的处理器。例如,getGreeting方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,而update方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

    使用这种方式发布WebService,必须打包成.aar文件,..aar文件实际上就是改变了扩展名的.jar文件。在现在建立了两个文件:MyService.java和services.xml。将MyService.java编译,生成MyService.class。services.xml和MyService.class文件的位置如下:

    D:\ws\service\MyService.class

    D:\ws\META-INF\services.xml

    在windows控制台中进入ws目录,并输入如下的命令生成.aar文件(实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使用.aar文件发布webservice):

    jar cvf ws.aar .

    最后将ws.aar文件复制到\webapps\axis2\WEB-INF\services目录中,启动Tomcat后,就可以调用这个WebService了。调用的方法和《WebService大讲堂之Axis2(1):用POJO实现0配置的WebService》所讲的方法类似。

    另外services.xml文件中也可以直接指定WebService类的方法,如可以用下面的配置代码来发布WebService:

    Web Service例子

    service.MyService

    上面的配置代码前面的部分和以前的services.xml文件的内容相同,但后面使用了元素来指定每一个WebService方法,并单独指定了处理每一个方法的处理器。对于客户端来说,调用使用这两个services.xml文件发布的WebService并没有太大我区别,只是使用第二个services.xml文件发布WebServices后,在使用wsdl2java命令或使用C#、delphi等生成客户端的stub时,update方法的String类型被封装在了update类中,在传递update方法的参数时需要建立update类的对象实例。而使用第一个services.xml文件发布的WebService在生成stub时直接可以为update方法传递String类型的参数。从这一点可以看出,这两种方法生成的WSDL有一定的区别。但实际上,如果客户端程序使用第一个services.xml文件发布的WebService生成stub类时(这时update方法的参数是String),在服务端又改为第二个services.xml文件来发布WebService,这时客户端并不需要再重新生成stub类,而可以直接调用update方法。也就是说,服务端使用什么样的方式发布WebService,对客户端并没有影响。

    如果想发布多个WebService,可以使用元素,如再建立一个MyService1类,代码如下:

    packageservicepublic classMyService1

    {publicString getName()

    {return "bill";

    }

    }

    在services.xml文件中可以使用如下的配置代码来配置MyService和MyService1类:

    Web Service例子

    service.MyService

    Web Service例子

    service.MyService1

    在《WebService大讲堂之Axis2(2):复合类型数据的传递》中讲过,如果要传递二进制文件(如图像、音频文件等),可以使用byte[]作为数据类型进行传递,然后客户端使用RPC方式进行调用。这样做只是其中的一种方法,除此之外,在客户端还可以使用wsdl2java命令生成相应的stub类来调用WebService,wsdl2java命令的用法详见《WebService大讲堂之Axis2(1):用POJO实现0配置的WebService》。

    WebService类中包含byte[]类型参数的方法在wsdl2java生成的stub类中对应的数据类型不再是byte[]类型,而是javax.activation.DataHandler。DataHandler类是专门用来映射WebService二进制类型的。

    在WebService类中除了可以使用byte[]作为传输二进制的数据类型外,也可以使用javax.activation.DataHandler作为数据类型。不管是使用byte[],还是使用javax.activation.DataHandler作为WebService方法的数据类型,使用wsdl2java命令生成的stub类中相应方法的类型都是javax.activation.DataHandler。而象使用.net、delphi生成的stub类的相应方法类型都是byte[]。这是由于javax.activation.DataHandler类是Java特有的,对于其他语言和技术来说,并不认识javax.activation.DataHandler类,因此,也只有使用最原始的byte[]了。

    下面是一个上传二进制文件的例子,WebService类的代码如下:

    packageservice;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.FileOutputStream;importjavax.activation.DataHandler;public classFileService

    {//使用byte[]类型参数上传二进制文件

    public boolean uploadWithByte(byte[] file, String filename)

    {

    FileOutputStream fos= null;try{

    fos= newFileOutputStream(filename);

    fos.write(file);

    fos.close();

    }catch(Exception e)

    {return false;

    }finally{if (fos != null)

    {try{

    fos.close();

    }catch(Exception e)

    {

    }

    }

    }return true;

    }private void writeInputStreamToFile(InputStream is, OutputStream os) throwsException

    {int n = 0;byte[] buffer = new byte[8192];while((n = is.read(buffer)) > 0)

    {

    os.write(buffer,0, n);

    }

    }//使用DataHandler类型参数上传文件

    public booleanuploadWithDataHandler(DataHandler file, String filename)

    {

    FileOutputStream fos= null;try{

    fos= newFileOutputStream(filename);//可通过DataHandler类的getInputStream方法读取上传数据

    writeInputStreamToFile(file.getInputStream(), fos);

    fos.close();

    }catch(Exception e)

    {return false;

    }finally{if (fos != null)

    {try{

    fos.close();

    }catch(Exception e)

    {

    }

    }

    }return true;

    }

    }

    上面代码在services.xml文件的配置代码如下:

    文件服务

    service.FileService

    如果使用wsdl2java命令生成调用Java客户端代码,则需要创建DataHandler类的对象实例,代码如下:

    DataHandler dh = new DataHandler(new FileDataSource(imagePath));

    wsdl2java命令会为每一个方法生成一个封装方法参数的类,类名为方法名(第一个字符大写),如uploadWithByte方法生成的类名为UploadWithByte。如果要设置file参数的值,可以使用UploadWithByte类的setFile方法,代码如下:

    UploadWithByte uwb = newUPloadWithByte();

    uwb.setFile(dh);

    最后是调用uploadWithByte方法,代码如下(FileServiceStub为wsdl2java生成的stub类名):

    FileServiceStub fss = newFileServiceStub();

    fss.uploadWithByte(uwb);

    如果使用C#调用FileService,则file参数类型均为byte[],代码如下:

    MemoryStream ms = newMemoryStream();

    Bitmap bitmap= newBitmap(picUpdateImage.Image);

    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

    service.fileService fs= newWSC.service.fileService();

    fs.uploadWithDataHandler(ms.ToArray());

    fs.uploadWithByte(ms.ToArray());

    WebService给人最直观的感觉就是由一个个方法组成,并在客户端通过SOAP协议调用这些方法。这些方法可能有返回值,也可能没有返回值。虽然这样可以完成一些工具,但这些被调用的方法是孤立的,当一个方法被调用后,在其他的方法中无法获得这个方法调用后的状态,也就是说无法保留状态。

    读者可以想象,这对于一个完整的应用程序,无法保留状态,就意味着只依靠WebService很难完成全部的工作。例如,一个完整的应用系统都需要进行登录,这在Web应用中使用Session来保存用户登录状态,而如果用WebService的方法来进行登录处理,无法保存登录状态是非常令人尴尬的。当然,这也可以通过其他的方法来解决,如在服务端使用static变量来保存用户状态,并发送一个id到客户端,通过在服务端和客户端传递这个id来取得相应的用户状态。这非常类似于Web应用中通过Session和Cookie来管理用户状态。但这就需要由开发人员做很多工作,不过幸好Axis2为我们提供了WebService状态管理的功能。

    使用Axis2来管理WebService的状态基本上对于开发人员是透明的。在WebService类需要使用org.apache.axis2.context.MessageContext和org.apache.axis2.context.ServiceContext类来保存与获得保存在服务端的状态信息,这有些象使用HttpSession接口的getAttribute和setAttribute方法获得与设置Session域属性。

    除此之外,还需要修改services.xml文件的内容,为元素加一个scope属性,该属性有四个可取的值:Application, SOAPSession, TransportSession, Request,不过要注意一下,虽然Axis2的官方文档将这四个值的单词首字母和缩写字母都写成了大写,但经笔者测试,必须全部小写才有效,也就是这四个值应为:application、soapsession、transportsession、request,其中request为scope属性的默认值。读者可以选择使用transportsession和application分别实现同一个WebService类和跨WebService类的会话管理。

    在客户端需要使用setManageSession(true)打开Session管理功能。

    综上所述,实现同一个WebService的Session管理需要如下三步:

    1. 使用MessageContext和ServiceContext获得与设置key-value对。

    2. 为要进行Session管理的WebService类所对应的元素添加一个scope属性,并将该属性值设为transportsession。

    3. 在客户端使用setManageSession(true)打开Session管理功能。

    下面是一个在同一个WebService类中管理Session的例子。

    先建立一个WebService类,代码如下:

    packageservice;importorg.apache.axis2.context.ServiceContext;importorg.apache.axis2.context.MessageContext;public classLoginService

    {public booleanlogin(String username, String password)

    {if("bill".equals(username) && "1234".equals(password))

    {//第1步:设置key-value对

    MessageContext mc =MessageContext.getCurrentMessageContext();

    ServiceContext sc=mc.getServiceContext();

    sc.setProperty("login", "成功登录");return true;

    }else{return false;

    }

    }publicString getLoginMsg()

    {//第1步:获得key-value对中的value

    MessageContext mc =MessageContext.getCurrentMessageContext();

    ServiceContext sc=mc.getServiceContext();return (String)sc.getProperty("login");

    }

    }

    在LoginService类中有两个方法:login和getLoginMsg,如果login方法登录成功,会将“成功登录”字符串保存在ServiceContext对象中。如果在login方法返回true后调用getLoginMsg方法,就会返回“成功登录”。

    下面是LoginService类的配置代码(services.xml):

    登录服务

    service.LoginService

    使用如下的命令生成客户端使用的stub类:

    %AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/loginService?wsdl -p client -s -o stub

    在stub\src\client目录中生成了一个LoginServiceStub.java类,在该类中找到如下的构造句方法:

    publicLoginServiceStub(org.apache.axis2.context.ConfigurationContext configurationContext,

    java.lang.String targetEndpoint,booleanuseSeparateListener)throwsorg.apache.axis2.AxisFault

    {

    _serviceClient.getOptions().setSoapVersionURI(

    org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);

    }

    在该方法中最后添加如下的代码:

    //  第3步:打开客户端的Session管理功能

    _serviceClient.getOptions().setManageSession(true);

    下面的客户端代码使用LoginServiceStub对象访问了刚才建立的WebService:

    LoginServiceStub stub = newLoginServiceStub();

    LoginServiceStub.Login login= newLoginServiceStub.Login();

    login.setUsername("bill");

    login.setPassword("1234");if(stub.login(login).local_return)

    {

    System.out.println(stub.getLoginMsg().local_return);

    }

    运行上面的代码后,会输出“成功登录”信息。

    在《WebService大讲堂之Axis2(5):会话(Session)管理》一文中介绍了如何使用Axis2来管理同一个服务的会话,但对于一个复杂的系统,不可能只有一个WebService服务,例如,至少会有一个管理用户的WebService(用户登录和注册)以及处理业务的WebService。象这种情况,就必须在多个WebService服务之间共享会话状态,也称为跨服务会话(Session)管理。实现跨服务会话管理与实现同一个服务的会话管理的步骤类似,但仍然有一些差别,实现跨服务会话管理的步骤如下:

    实现跨服务的Session管理需要如下三步:

    1. 使用MessageContext和ServiceGroupContext获得与设置key-value对。

    2. 为要进行Session管理的WebService类所对应的元素添加一个scope属性,并将该属性值设为application。

    3. 在客户端使用setManageSession(true)打开Session管理功能。

    从上面的步骤可以看出,实现跨服务会话管理与实现同一个服务的会话管理在前两步上存在着差异,而第3步是完全一样的。下面是一个跨服务的会话管理的实例。在这个例子中有两个WebService类:LoginService和SearchService,代码如下:LoginService.java

    packageservice;importorg.apache.axis2.context.MessageContext;importorg.apache.axis2.context.ServiceGroupContext;public classLoginService

    {public booleanlogin(String username, String password)

    {if("bill".equals(username) && "1234".equals(password))

    {//第1步:设置key-value对

    MessageContext mc =MessageContext.getCurrentMessageContext();

    ServiceGroupContext sgc=mc.getServiceGroupContext();

    sgc.setProperty("login", "成功登录");return true;

    }else{return false;

    }

    }publicString getLoginMsg()

    {//第1步:获得key-value对中的value

    MessageContext mc =MessageContext.getCurrentMessageContext();

    ServiceGroupContext sgc=mc.getServiceGroupContext();return (String)sgc.getProperty("login");

    }

    }

    SearchService.java

    packageservice;importorg.apache.axis2.context.MessageContext;importorg.apache.axis2.context.ServiceGroupContext;public classSearchService

    {publicString findByName(String name)

    {//第1步:获得key-value对中的value

    MessageContext mc =MessageContext.getCurrentMessageContext();

    ServiceGroupContext sgc=mc.getServiceGroupContext();if (sgc.getProperty("login") != null)return "找到的数据";else

    return "用户未登录";

    }

    }

    services.xml文件中的配置代码如下:

    登录服务

    service.LoginService

    搜索服务

    service.SearchService

    下面是使用两个stub类的对象实例访问上面实现的两个WebService的客户端代码:

    LoginServiceStub stub = newLoginServiceStub();

    LoginServiceStub.Login login= newLoginServiceStub.Login();

    login.setUsername("bill");

    login.setPassword("1234");if(stub.login(login).local_return)

    {

    System.out.println(stub.getLoginMsg().local_return);

    SearchServiceStub searchStub= newSearchServiceStub();

    SearchServiceStub.FindByName fbn= newSearchServiceStub.FindByName();

    fbn.setName("abc");

    System.out.println(searchStub.findByName(fbn).local_return);

    }

    在执行上面的代码后,将输出如下的信息:

    成功登录

    找到的数据

    读者可以将scope属性值改成transportsession,看看会输出什么!

    实际上,Axis2的会话管理也是通过Cookie实现的,与Web应用中的Session管理类似。如果读者使用C#访问支持会话(在同一个服务中的会话管理)的WebService,需要指定一个CookieContainer对象,代码如下:

    service.loginService ls = newservice.loginService();

    System.Net.CookieContainer cc= newSystem.Net.CookieContainer();

    ls.CookieContainer=cc;

    bool r, rs;

    ls.login("bill", "1234", out @r, out rs);if(r)

    {

    MessageBox.Show(ls.getLoginMsg().@return);

    }

    如果是访问跨服务的支持会话的WebService,则不需要指定CookieContainer对象,代码如下:

    service.loginService ls = newservice.loginService();

    bool r, rs;

    ls.login("bill", "1234", out @r, out rs);if(r)

    {

    service1.searchService ss= newservice1.searchService();

    MessageBox.Show(ss.findByName("abc"));

    }

    如果读者使用delphi(本文使用的是delphi2009,其他的delphi版本请读者自行测试)调用支持会话的WebService时有一些差别。经笔者测试,使用delphi调用WebService,将scope属性值设为transportsession和application都可以实现跨服务的会话管理,这一点和Java与C#不同,Java和C#必须将scope属性值设为application才支持跨服务会话管理。在delphi中不需要象C#指定一个CookieContainer或其他类似的对象,而只需要象访问普通的WebService一样访问支持会话的WebService即可。

    在现今的Web应用中经常使用Spring框架来装载JavaBean。如果要想将某些在Spring中装配的JavaBean发布成WebService,使用Axis2的Spring感知功能是非常容易做到的。

    在本文的例子中,除了\webapps\axis2目录及该目录中的相关库外,还需要Spring框架中的spring.jar文件,将该文件复制到\webapps\axis2\WEB-INF\lib目录中。

    下面先建立一个JavaBean(该JavaBean最终要被发布成WebService),代码如下:

    packageservice;importentity.Person;public classSpringService

    {privateString name;privateString job;public voidsetName(String name)

    {this.name =name;

    }public voidsetJob(String job)

    {this.job =job;

    }publicPerson getPerson()

    {

    Person person= newPerson();

    person.setName(name);

    person.setJob(job);returnperson;

    }publicString getGreeting(String name)

    {return "hello " +name;

    }

    }

    其中Person也是一个JavaBean,代码如下:

    packageentity;public classPerson

    {privateString name;privateString job;publicString getName()

    {returnname;

    }public voidsetName(String name)

    {this.name =name;

    }publicString getJob()

    {returnjob;

    }public voidsetJob(String job)

    {this.job =job;

    }

    }

    将上面两个Java源文件编译后,放到\webapps\axis2\WEB-INF\classes目录中。

    在\webapps\axis2\WEB-INF\web.xml文件中加入下面的内容:

    org.springframework.web.context.ContextLoaderListener

    contextConfigLocation

    /WEB-INF/applicationContext.xml

    在\webapps\axis2\WEB-INF目录中建立一个applicationContext.xml文件,该文件是Spring框架用于装配JavaBean的配置文件,内容如下:

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    在applicationContext.xml文件中装配了service.SpringService类,并被始化了name和job属性。在配置完SpringService类后,就可以直接在程序中FileSystemXmlApplicationContext类或其他类似功能的类读取applicationContext.xml文件中的内容,并获得SpringService类的对象实例。但现在我们并不这样做,而是将SpringService类发布成WebService。

    在\webapps\axis2\WEB-INF\lib目录中有一个axis2-spring-1.4.1.jar文件,该文件用于将被装配JavaBean的发布成WebService。在D盘建立一个axi2-spring-ws目录,并在该目录中建立一个META-INF子目录。在META-INF目录中建立一个services.xml文件,内容如下:

    Spring aware

    org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier

    springService

    在Windows控制台进入axi2-spring-ws目录,并使用jar命令将axi2-spring-ws目录中的内容打包成axi2-spring-ws.aar,然后将该文件复制到\webapps\axis2\WEB-INF\services目录中,启动Tomcat后,就可以访问该WebService了,访问方式与前面几篇文章的访问方式相同。获得wsdl内容的URL如下:

    http://localhost:8080/axis2/services/springService?wsdl

    在将Spring中的装配JavaBean发布成WebService需要注意以下几点:

    1. 由JavaBean编译生成的.class文件需要放在WEB-INF\classes目录中,或打成.jar包后放在WEB-INF\lib目录中,而WEB-INF\services目录中的.aar包中不需要包含.class文件,而只需要包含一个META-INF目录,并在该目录中包含一个services.xml文件即可。

    2. services.xml的配置方法与前几篇文章的配置方法类似,只是并不需要使用ServiceClass参数指定要发布成WebService的Java类,而是要指定在applicationContext.xml文件中的装配JavaBean的名称(SpringBeanName参数)。

    3. 在services.xml文件中需要通过ServiceObjectSupplier参数指定SpringServletContextObjectSupplier类来获得Spring的ApplicationContext对象。

    在前面几篇文章中都是使用同步方式来调用WebService。也就是说,如果被调用的WebService方法长时间不返回,客户端将一直被阻塞,直到该方法返回为止。使用同步方法来调用WebService虽然很直观,但当WebService方法由于各种原因需要很长时间才能返回的话,就会使客户端程序一直处于等待状态,这样用户是无法忍受的。

    当然,我们很容易就可以想到解决问题的方法,这就是多线程。解决问题的基本方法是将访问WebService的任务交由一个或多个线程来完成,而主线程并不负责访问WebService。这样即使被访问的WebService方法长时间不返回,客户端仍然可以做其他的工作。我们可以管这种通过多线程访问WebService的方式称为异步访问。

    虽然直接使用多线程可以很好地解决这个问题,但比较麻烦。幸好Axis2的客户端提供了异步访问WebService的功能。

    RPCServiceClient类提供了一个invokeNonBlocking方法可以通过异步的方式来访问WebService。下面先来建立一个WebService。

    MyService是一个WebService类,代码如下:

    packageservice;public classMyService

    {publicString getName()

    {try{

    System.out.println("getName方法正在执行");//延迟5秒

    Thread.sleep(5000);

    }catch(Exception e)

    {

    }return "火星";

    }

    }

    为了模拟需要一定时间才返回的WebService方法,在getName方法中使用了sleep方法来延迟5秒。

    下面是MyService类的配置代码:

    异步调用演示

    service.MyService

    从上面的配置代码可以看出,MyService的配置方式与前几章的WebService的配置方式完全一样,也就是说,MyService只是一个普通的WebService。

    下面是异步调用MyService的Java客户端代码:

    packageclient;importjavax.xml.namespace.QName;importorg.apache.axis2.addressing.EndpointReference;importorg.apache.axis2.client.Options;importorg.apache.axis2.context.MessageContext;importorg.apache.axis2.rpc.client.RPCServiceClient;public classRPCAsyncClient

    {public static void main(String[] args) throwsException

    {

    RPCServiceClient serviceClient= newRPCServiceClient();

    Options options=serviceClient.getOptions();

    EndpointReference targetEPR= newEndpointReference("http://localhost:8080/axis2/services/myService");

    options.setTo(targetEPR);

    Object[] opAddEntryArgs= newObject[]{};

    QName opAddEntry= new QName("http://service", "getName");

    serviceClient.invokeNonBlocking(opAddEntry, opAddEntryArgs,neworg.apache.axis2.client.async.AxisCallback()

    {

    @Overridepublic voidonComplete()

    {

    }

    @Overridepublic voidonError(Exception arg0)

    {

    } }

    @Overridepublic voidonFault(MessageContext arg0)

    {

    }

    @Overridepublic voidonMessage(MessageContext mc)

    {//输出返回值

    System.out.println(mc.getEnvelope().getFirstElement()

    .getFirstElement().getFirstElement().getText());

    }

    });

    System.out.println("异步调用!");//阻止程序退出

    System.in.read();

    }

    }

    从上面的代码可以看出,invokeNonBlocking方法有三个参数,前两个参数分别指定了要调用的方法及方法参数的相关信息,而最后一个参数并不是方法返回值的类型信息,而是一个实现org.apache.axis2.client.async.AxisCallback接口的类的对象实例。在本例中隐式实现了AxisCallback接口。在AxisCallback接口中有四个方法需要实现,其中当被异步调用的方法返回时onMessage方法被调用。当运行上面的程序后,将输出如下的信息:

    异步调用!

    火星

    虽然上面的例子可以实现异步调用,但比较麻烦。为了更方便地实现异步调用,可以使用wsdl2java命令的-a参数生成可异步调用的Stub类。下面的命令可生成同步和异步调用的客户端代码(两个类),其中-s表示生成同步调用代码,-a表示生成异步调用代码。

    %AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/myService?wsdl -p client -s -a -o stub

    在执行上面的命令后,将生成两个类:MyServiceStub和MyServiceCallbackHandler类,其中MyServiceStub类负责同步和异步调用WebService,MyServiceCallbackHandler类是一个抽象类,也是一个回调类,当使用异步方式调用WebService方法时,如果方法返回,则MyServiceCallbackHandler类的receiveResultgetName方法被调用。下面是使用MyServiceStub类异步访问WebService的代码:

    packageclient;importclient.MyServiceStub.GetNameResponse;class MyCallback extendsMyServiceCallbackHandler

    {

    @Overridepublic voidreceiveResultgetName(GetNameResponse result)

    {//输出getName方法的返回结果

    System.out.println(result.get_return());

    }

    }public classStubClient

    {public static void main(String[] args) throwsException

    {

    MyServiceStub stub= newMyServiceStub();//异步调用WebService

    stub.startgetName(newMyCallback());

    System.out.println("异步调用!");

    System.in.read();

    }

    }

    执行上面的程序后,将输出如下的信息:

    异步调用!

    火星

    在.net中也可以使用异步的方式来调用WebService,如在C#中可使用如下的代码来异步调用getName方法:

    //回调方法

    private voidgetNameCompletedEvent(object sender, WSC.asyn.getNameCompletedEventArgs e)

    {

    listBox1.Items.Add( e.Result.@return);

    }private voidbutton1_Click(object sender, EventArgs e)

    {

    async.myService my= newWSC.async.myService();

    my.getNameCompleted+= newWSC.async.getNameCompletedEventHandler(getNameCompletedEvent);

    my.getNameAsync();

    MessageBox.Show("完成调用");

    }

    其中async是引用MyService的服务名。要注意的是,在C#中不能在同一个WebService实例的getName方法未返回之前,再次调用该实例的getName方法,否则将抛出异常。如下面的代码会抛出一个异常:

    async.myService my = newWSC.async.myService();

    my.getNameCompleted+= newWSC.async.getNameCompletedEventHandler(getNameCompletedEvent);

    my.getNameAsync();//将抛出异常

    my.getNameAsync();

    但不同的WebService实例的方法可以在方法未返回时调用,如下面的代码是可以正常工作的:

    asyn.myService my = newWSC.asyn.myService();

    my.getNameAsync();

    my.getNameCompleted+= newWSC.asyn.getNameCompletedEventHandler(getNameCompletedEvent);

    asyn.myService my1= newWSC.asyn.myService();

    my1.getNameCompleted+= newWSC.asyn.getNameCompletedEventHandler(getNameCompletedEvent);

    my1.getNameAsync();

    Axis2可以通过模块(Module)进行扩展。Axis2模块至少需要有两个类,这两个类分别实现了Module和Handler接口。开发和使用一个Axis2模块的步骤如下:

    1. 编写实现Module接口的类。Axis2模块在进行初始化、销毁等动作时会调用该类中相应的方法)。

    2. 编写实现Handler接口的类。该类是Axis2模块的业务处理类。

    3. 编写module.xml文件。该文件放在META-INF目录中,用于配置Axis2模块。

    4. 在axis2.xml文件中配置Axis2模块。

    5. 在services.xml文件中配置Axis2模块。每一个Axis2模块都需要使用元素引用才能使用。

    6. 发布Axis2模块。需要使用jar命令将Axis2模块压缩成.mar包(文件扩展名必须是.mar),然后将.mar文件放在

    \webapps\axis2\WEB-INF\modules目录中。

    先来编写一个WebService类,代码如下:

    packageservice;public classMyService

    {publicString getGreeting(String name)

    {return "您好 " +name;

    }

    }

    下面我们来编写一个记录请求和响应SOAP消息的Axis2模块。当客户端调用WebService方法时,该Axis2模块会将请求和响应SOAP消息输出到Tomcat控制台上。

    第1步:编写LoggingModule类

    LoggingModule类实现了Module接口,代码如下:

    packagemodule;importorg.apache.axis2.AxisFault;importorg.apache.axis2.context.ConfigurationContext;importorg.apache.axis2.description.AxisDescription;importorg.apache.axis2.description.AxisModule;importorg.apache.axis2.modules.Module;importorg.apache.neethi.Assertion;importorg.apache.neethi.Policy;public class LoggingModule implementsModule

    {//initialize the module

    public voidinit(ConfigurationContext configContext, AxisModule module)throwsAxisFault

    {

    System.out.println("init");

    }public void engageNotify(AxisDescription axisDescription) throwsAxisFault

    {

    }//shutdown the module

    public voidshutdown(ConfigurationContext configurationContext)throwsAxisFault

    {

    System.out.println("shutdown");

    }publicString[] getPolicyNamespaces()

    {return null;

    }public voidapplyPolicy(Policy policy, AxisDescription axisDescription)throwsAxisFault

    {

    }public booleancanSupportAssertion(Assertion assertion)

    {return true;

    }

    }

    在本例中LoggingModule类并没实现实际的功能,但该类必须存在。当Tomcat启动时会装载该Axis2模块,同时会调用LoggingModule类的init方法,并在Tomcat控制台中输出“init”。

    第2步:编写LogHandler类

    LogHandler类实现了Handler接口,代码如下:

    packagemodule;importorg.apache.axis2.AxisFault;importorg.apache.axis2.context.MessageContext;importorg.apache.axis2.engine.Handler;importorg.apache.axis2.handlers.AbstractHandler;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;public class LogHandler extends AbstractHandler implementsHandler

    {private static final Log log = LogFactory.getLog(LogHandler.class);privateString name;publicString getName()

    {returnname;

    }publicInvocationResponse invoke(MessageContext msgContext)throwsAxisFault

    {//向Tomcat控制台输出请求和响应SOAP消息

    log.info(msgContext.getEnvelope().toString());returnInvocationResponse.CONTINUE;

    }public voidrevoke(MessageContext msgContext)

    {

    log.info(msgContext.getEnvelope().toString());

    }public voidsetName(String name)

    {this.name =name;

    }

    }

    LogHandler类的核心方法是invoke,当使用该Axis2模块的WebService的方法被调用时,LogHandler类的invoke方法被调用。

    第3步:编写module.xml文件

    在META-INF目录中建立一个module.xml文件,内容如下:

    第4步:在axis2.xml文件中配置Axis2模块

    打开axis2.xml文件,分别在如下四个元素中加入:

    第5步:在services.xml文件中引用logging模块

    services.xml文件的内容如下:

    使用logging模块

    service.MyService

    第6步:发布logging模块

    到现在为止,我们应用可以建立两个发行包:logging.mar和service.aar。其中logging.mar文件是Axis2模块的发行包,该包的目录结构如下:

    logging.mar

    module\LoggingModule.class

    module\LogHandler.class

    META-INF\module.xml

    service.aar文件是本例编写的WebService发行包,该包的目录结构如下:

    service.aar

    service\MyService.class

    META-INF\services.xml

    将logging.mar文件放在\webapps\axis2\WEB-INF\modules目录中,将service.aar文件放在\webapps\axis2\WEB-INF\services目录中。要注意的是,如果modules目录中包含了modules.list文件,Axis2会只装载在该文件中引用的Axis2模块,因此,必须在该文件中引用logging模块,该文件的内容如下:

    addressing-1.4.1.mar

    soapmonitor-1.4.1.mar

    ping-1.4.1.mar

    mex-1.4.1.mar

    axis2-scripting-1.4.1.mar

    logging.mar

    如果modules目录中不包含modules.list文件,则Axis2会装载modules文件中的所有Axis2模块。

    现在启动Tomcat,使用如下的C#代码调用MyService的getGreeting方法则会在Tomcat控制台中输出相应的请求和响应SOAP消息。

    //async是引用MyService的服务名

    async.myService my = newWSC.asyn.myService();

    MessageBox.Show(my.getGreeting("中国"));

    MessageBox.Show("完成调用");

    在执行上面的代码后,在Tomcat控制台中输出的信息如下图所示。

    114ec0a0c739f3fdae8865f7f4daafd2.png

    在Axis2中提供了一个Axis2模块(soapmonitor),该模块实现了与《WebService大讲堂之Axis2(9):编写Axis2模块(Module)》中实现的logging模块相同的功能,所不同的是,logging模块直接将SOAP请求与响应消息输出到Tomcat控制台中,而soapmonitor模块利用applet直接在页面中输出SOAP请求和响应消息。

    下面是配置和使用soapmonitor模块的步骤:

    第1步:部署Applet和Servlet

    由于axis2默认情况下已经自带了soapmonitor模块,因此,soapmonitor模块并不需要单独安装。但applet所涉及到的相应的.class文件需要安装一下。在\webapps\axis2\WEB-INF\lib目录中找到soapmonitor-1.4.1.jar文件,将该文件解压。虽然applet并不需要soapmonitor-1.4.1.jar文件中所有的.class文件,但为了方便,读者也可以直接将解压目录中的org目录复制到\webapps\axis2目录中,Applet所需的.class文件需要放在这个目录。然后再将org目录复制到\webapps\axis2\WEB-INF\classes目录中,soapmonitor模块中的Servlet所对应的.class文件需要放在这个目录。

    第2步:配置Servlet

    打开\webapps\axis2\WEB-INF\web.xml文件,在其中加入如下的内容:

    SOAPMonitorService

    org.apache.axis2.soapmonitor.servlet.SOAPMonitorService

    SOAPMonitorPort

    5001

    1

    SOAPMonitorService

    /SOAPMonitor

    第3步:在services.xml文件中引用soapmonitor模块

    与引用logging模块一样,引用soapmonitor模块也需要使用元素,引用soapmonitor模块的services.xml文件的内容如下:

    使用logging和soapmonitor模块

    service.MyService

    由于soapmonitor模块已经在axis2.xml进行配置了,因此,在本例中不需要再对axis2.xml文件进行配置了。

    第4步:使用soapmonitor模块

    在浏览器中将出现soapmonitor所带的Applet的界面,当访问MyService的getGreeting方法时,在Tomcat控制台与Applet中都显示了相应的SOAP请求和响应消息。如图1和图2分别是调用了两次getGreeting方法后输出的SOAP请求和响应消息。

    efd90e18d7b4ab35193d00b5fefd85d8.png

    图1

    8fb17172605aa10d3249183f61def1cb.png

    图2

    如果读者想让logging和soapmonitor模块监视部署在Axis2中的所有WebService,可以在axis2.xml文件中使用元素来引用这两个模块,代码如下:

    展开全文
  • 因客户需使用Springboot 集成Webservice,本文参考了两位大佬的文章: ...未经许可,不准转载 一、引入依赖 <dependency> <groupId>org.apache.axis2</groupId>
  • 一、开发工具服务端:Apache Http Server2.2.15 + Tomcat6.0+Axis2C1.6.0 + VS2005客户端:CXF2.2.8 + MyEclipse7.0二、开发步骤1....用Axis2C的wsdl2c工具根据Test.wsdl生成服务端存根wsdl2c-uriTest.wsdl-ss-sd-dn...
  • plugin 1.6.2 wsdl4j wsdl4j org.apache.axis2 axis2-java2wsdl XmlSchema org.apache.ws.commons.schema org.apache.axis2 axis2-fastinfoset 1.6.2 wsdl4j wsdl4j org.apache.axis2 axis2-java2wsdl XmlSchema org...
  • Axis2中,不再使用service.wsdd文件来配置服务,改用services.xml了。这两个配置文件的语法是截然不同的。本文涵盖了services.xml文件的语法和使用说明。在Apache Axis2/Java中,同一个服务包文件既可以用于部署...
  • axis2java包,axis2-1.7.9-bin

    2021-04-21 11:24:22
    axis2-1.7.9, 0 , 2018-11-16axis2-1.7.9\repository, 0 , 2018-11-16axis2-1.7.9\repository\modules, 0 , 2018-11-16axis2-1.7.9\repository\services, 0 , 2018-11-16axis2-1.7.9\bin, 0 , 2018-11-16axis2-1.7.9...
  • 【实例简介】axis2生成客户端代码 (带jar包)【实例截图】【核心代码】axis2-1.6.2-bin└── axis2-1.6.2-bin├── axis2-1.6.2│ ├── bin│ │ ├── axis2.bat│ │ ├── axis2server.bat│ │ ├── axis...
  • SpringBoot集成Axis2,部署webservice接口并调用一、省略新建springboot项目过程1、pom.xml2、application.yml3、准备工作做完,编写service4、下面在springboot中配置axis25、 以上配置成功后,启动...
  • 一、利用Axis2工具的WSDL2Java命令自动生成JAVA代码,进入cmd命令行模式,运行命令WSDL2Java1.生成服务端代码命令WSDL2Java -uri wsdl文件全路径 -p 包名 -d xmlbeans -s -ss -sd -ssi -o 生成的java代码存放路径2....
  • idea中springboot整合Axis2框架一1、Axis2框架所需要的maven坐标:2、编写webservice服务类3、在WEB-INF/services/webService/META-INF/下路径创建services.xml文件4、axis2配置类5、启动项目在浏览器访问wsdl文档树...
  • Axis2与CXF是现在很主流的WebService开发框架(java6也已经支持了),项目上还都是基本上用前两种做开发,今天记录一下我安装Axis2插件在eclipse中的安装和写一个简单的测试代码。一、eclipse的版本为Luna Release ...
  • axis2所有jar包

    2021-02-28 19:06:36
    【实例简介】里面包括使用axis2需要的全部jar包,另外附上《java使用axis2调用webservice接口实例》代码:http://blog.csdn.net/xlb744868186/article/details/42167811【实例截图】【核心代码】axis2所有jar包└─...
  • Axis2 的安装

    2020-12-31 13:01:50
    Axis2的下载地址http://axis.apache.org/axis2/java/core/download.cgiaxis2-1.6.2-bin.zip服务器axis2-1.6.2-war.zip服务器部署包环境变量配置:变量名:AXIS2_HOME变量值:D:\Program Files\axis2-1.6.2在系统变量...
  • 最近由于要提交课程作业的缘故所以学习了Web Service相关技术,学习了Axis2技术,该技术虽然较老,但是可能还有人用,所以在这边对其用法做一个简单介绍。由于Axis2配置以及使用方法较多,本文不赘述所有方法,只...
  • 利用AXIS2传递JSON数据

    2021-01-17 15:57:03
    Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如,可以使用WebService来发布服务端 Java类的方法,以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。...
  • 基于 AXIS2/C 的 C 语言库实现对提供 REST API 的系统进行数据访问宋 东平 和 赵 健2013 年 3 月 07 日发布AXIS2/C 简介和 REST 及 REST API 相关内容的简介AXIS2/C 简介Axis2/c 是基于 C 语言实现的 Web Service ...
  • 作者:Longofo@知道创宇404实验室日期:2021年2月26日Apache Axis分为Axis1(一开始就是Axis,这里为了好区分叫Axis1)和Axis2,Axis1是比较老的版本了,在Axis1官方文档说到,Apache Axis1现在已经很大程度被Apache ...
  • 1.4 AXIS2(SOAP引擎) AXIS2下载页面:http://ws.apache.org/axis2/download.cgi axis2-1.3-bin.zip下载链接: http://apache.mirror.phpchina.com/ws/axis2/1_3/axis2-1.3-bin.zip 解压缩axis2-1.3-bin.zip,lib...
  • 打印Axis2请求响应XML

    2021-04-17 01:44:04
    我使用wsdl2java axis2创建了存根.wsdl2java创建了2个java文件,一个用于存根,一个用于callbackhandler.我正在尝试使用以下方法,但获取null值operationContext.getMessageContext("Out");/operationContext.getMes...
  • 方法一:RPCServiceClient serviceClient = new RPCServiceClient();Options options = serviceClient....EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/Addre...
  • JAVA 调用Axis2 code generator 生成的webservice 以下代码为调用 JAVA 调用Axis2 code generator 生成的webservice的代码. package test; import java.rmi.RemoteException; ... java调用C# webService发布的接口 ...
  • 文章目录一、AXIS2服务端1. 版本选型2.导入依赖3. services.xml4.Axis2配置类5.服务接口6.服务接口实现类7. FileCopyUtils工具类8. 测试验证二、AXIS2服务端2.1. 客户端类2.2. 服务调用测试开源源码. 一、AXIS2...
  • AXIS2 如何返回JSON数据

    2021-03-07 16:03:20
    按照网上两篇博文操作了http://blog.djakapm.com/2011/12/15/json-web-service-with-java-and-axis2/http://www.marcusschiesser.de/2009/01/building-a-json-web-service-with-java-and-axis2/但是结果一直是返回的...
  • /*** 指定要调用的getPrice方法及WSDL文件的命名空间 * 如果 webservice 服务端由axis2编写 * 命名空间 不一致导致的问题 * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0*/...
  • 1 使用命令:WSDL2Java -uri http://localhost/MGESB/services/AxisService?wsdl -o d:\src 生成:AxisServiceCallbackHandler.javaAxisServiceStub.java其中常用的options具体如下: -o : 指定生成代码的输出路径 -...
  • 1.下载axis2,并安装,具体安装方法自行百度; 2.dos环境进入bin文件夹wsdl2java -uri ...
  • 使用Axis2生成wsdl文件

    2021-03-18 13:35:39
    之前在实践Axis2实例的时候最头疼的问题便是无法通过java代码生成wsdl文件!无论是通过eclipse插件还是在控制台手动生成,都会报错~但这回被我解决了一种方式。我的环境是Fedora8 64bit,Axis2 1.4,java1.6。我在/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 380,488
精华内容 152,195
关键字:

axis2