使用Eclipse+Axis2构建Web Service应用(客户端无需生成Stub方式)

  本文介绍了如何使用tomcat和Axis2开发、部署和使用Web Service,而且开发了一个简单的例子,经过例子开发流程来向你们展现如何建立Axis2的服务端和客户端。该例子与其余例子最大的不一样是否是用客户端stub存根方式调用web服务,提供了一种统一的客户端调用方式。但愿读者读完本文后可以快速上手Axis2的应用开发。

   1、开发环境和软件下载

  开发环境是:Eclipse3.4 + JDK1.6 + Tomcat6.0 + Axis2 1.3。这些软件都是各个软件最新版本,下载方式因为软件网站的更新,地址也会更新,这里就再也不贴出来了,就请读者到相应网站下载。
  软件下载和安装:
    (1) JDK1.6环境变量配置:
    JAVA_HOME: C:\Program Files\Java\jdk1.6.0_07,其中C:\Program Files\Java是个人JDK安装目录。
    Path: %JAVA_HOME%\bin
    Classpath: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
   
    (2) tomcat6.0环境变量配置:
    CATALINA_HOME:C:\Program Files\Apache Software Foundation\Tomcat 6.0, 其中C:\Program Files\Apache Software Foundation是个人Tomcat 6.0安装目录。
    其实这里tomcat6.0不须要配置环境变量,由于最新版本不须要配置。

    (3) Axis2 1.3下载:从[url]http://apache.justdn.org/ws/axis2/1_4_1/[/url]网站上下载axis2-1.3-war.zip 。将其解压,把其中的axis2.war文件复制到tomcat的webapps目录下便可完成Axis2的安装。
  安装完成后,启动tomcate,在地址栏内输入[url]http://localhost:8080/axis2/[/url],打开以下图界面,代表安装正确:



    (4) Eclipse3.4下载:到[url]www.eclipse.org[/url]官方网站下载,直接解压后配置Windows/Preference中的JDK便可。

    (5) 下载Eclipse Axis2插件:axis2-eclipse-codegen-wizard-1.4.zip和axis2-eclipse-codegen-wizard-1.4.zip。下载地址是:[url]http://apache.justdn.org/ws/axis2/tools/1_4_1/      [/url] 这两个插件解压到Eclipse安装目录下plugins中便可。打开Eclipse,选择File/New/Other菜单项,看到以下界面代表安装成功:



    安装这两个插件的目的是:方便生成Axis2服务和生成Axis2客户端,这里我使用了无Stub方式的客户端调用服务,所以就不演示生成Axis2客户端的功能了。

  2、构建服务
   
在开发环境及 Axis2 环境搭建好后,咱们即可着手 Web Services 服务的开发:
1.创建要发布的Web Service

    (1) Eclispse 中添加一个用户库命名为 axis2 ,将 axis2\lib 下的包均添加进来。 这一步操做的目的是为了之后工程添加 axis2 所需的 jar 文件方便。
    (2)
创建一个 JavaProject 命名为 ws ,将 axis2 用户库加入到 build path 中。
    (3)
如今开始编写要发布的 WebSevice ,在 src 中建包 briup ,创建 Hello 类以下:
package briup;

public class Hello {
   public String sayHello(String user) {
     return "Hello, " + user;
  }
}

    2.发布Web Service

   
打包要发布的 Service Eclipse New --> File --> Other --> Axis2 wizards --> Axis2 Services Archiver ,按照向导选择刚创建的类编译后的 class 文件。
    (1)
选择 class 文件目录,注意,不是 java 源文件,而是 classes 目录,这里须要注意因为你的类是带包briup的,所以不要选到包这个目录。
(2) 连按两次 “Next>” ,选中 “Generate the service xml automatically”
(3) 按下一步,输入 service 名称和类名,我这里输入的服务名是:ws;类名是咱们刚刚写的类名:briup.Hello,这里须要注意加入完整的包名。
(4) 按下一步,输入 service 文件的保存路径和文件名,完成。
选择生成目录为:C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\axis2\WEB-INF\services,也能够选择其余目录,而后copy到这一目录下。

3.测试Web Service

打开[url]http://localhost:8080/axis2/services/listServices[/url]页面,能够看到ws服务,点击进到ws的wsdl页面:[url]http://localhost:8080/axis2/services/ws?wsdl[/url],代表服务部署正确。

3、编写客户端代码调用服务

个人这个例子与其余例子最大的不一样就在这里,其余例子通常须要根据刚才的服务wsdl生成客户端stub,而后经过stub来调用服务,这种方式显得比较单一,客户端必须须要stub存根才可以访问服务,很不方面。
本例子的客户端不采用stub方式,而是一种实现通用的调用方式,不须要任何客户端存根便可访问服务。只须要指定对于的web servce地址、操做名、参数和函数返回类型便可。代码以下:

package briup;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class WsClient {

   private RPCServiceClient serviceClient;
   private Options options;
   private EndpointReference targetEPR;
  
   public WsClient(String endpoint) throws AxisFault {
    serviceClient = new RPCServiceClient();
    options = serviceClient.getOptions();
    targetEPR = new EndpointReference(endpoint);
    options.setTo(targetEPR);
  }
   public Object[] invokeOp(String targetNamespace, String opName,
      Object[] opArgs, Class<?>[] opReturnType) throws AxisFault,
      ClassNotFoundException {
     // 设定操做的名称
    QName opQName = new QName(targetNamespace, opName);
     // 设定返回值
    
     //Class<?>[] opReturn = new Class[] { opReturnType };

     // 操做须要传入的参数已经在参数中给定,这里直接传入方法中调用
     return serviceClient.invokeBlocking(opQName, opArgs, opReturnType);
  }
   /**
    * @param args
    * @throws AxisFault
    * @throws ClassNotFoundException
    */

   public static void main(String[] args) throws AxisFault, ClassNotFoundException {
     // TODO Auto-generated method stub
     final String endPointReference = "http://localhost:8080/axis2/services/ws";
    final String targetNamespace = "http://briup";
    WsClient client = new WsClient(endPointReference);
    
    String opName = "sayHello";
    Object[] opArgs = new Object[]{"Repace中心"};
    Class<?>[] opReturnType = new Class[]{String[].class};
    
    Object[] response = client.invokeOp(targetNamespace, opName, opArgs, opReturnType);
    System.out.println(((String[])response[0])[0]);
  }

}

运行该程序,点击Run As->Java application,能够看到控制台端口的输出是:Hello, Repace中心  代表客户端调用成功。
该例子最大的不一样和优点表如今客户端的调用方式,或者说是发起服务调用的方式,虽然比起客户端stub存根的方式,代码稍多,可是这种方式统一,不须要生产stub存根代码,解决了客户端有不少类的问题。若是读者对这些代码进一步封装,我想调用方式很简单,只须要传递相关参数,这更好地说明了服务调用的优点。并且这种方式更加简单明了,一看便知具体含义。而不须要弄得stub类的一些机制。
相关文章
相关标签/搜索