用Apache axis开发Web服务

目前Apache 拥有两个版本的axis  axis1.X 系列 和  axis2, axis2  并不是axis1.x的升级版本,而是一个全新的版本,用他们自己的话说就是complete re-design and re-write ,从使用上来讲两个版本的axis也有很较大不同 ,下面依次介绍一下。
- 显示引用文字 -
 
Axis1.x的安装配置以及简单例子  
 
一.  安装和配置
      1.  axis1.x  主页   http://ws.apache.org/axis/
          axis1.4  下载地址     http://www.apache.org/dist/ws/axis/1_4/axis-bin-1_4.zip
          axis1.4  源码下载     http://www.apache.org/dist/ws/axis/1_4/axis-src-1_4.zip
      2.  解压  axis-bin-1_4.zip  将子目录  webapps  目录下的axis目录  拷贝到  tomcat/webapps下  
      3.  从    axis-src-1_4/axis-1_4/lib  中拷贝  activation.jar  到tomcat/common/lib  下
          从   jdk_home(例如:"C:/Program Files/Java/jdk1.5.0")/lib下拷贝 tools.jar 到 tomcat/common/lib下    
          从 http://java.sun.com/products/javamail/downloads/index.html  下载javamail-1_4.zip  将其中的mail.jar拷贝到tomcat/common /lib  下  
          从 http://xml.apache.org/security/dist/java-library/  下载  xml-security-bin-1_3_0.zip  将其中的lib/xmlsec-1.3.0.jar拷贝到                        tomcat/common/lib  下
      4.  启动  Tomcat,访问   http://127.0.0.1:8080/axis/  正常将出现  一个Apache  Axis的页面  点击其中的   Validation 正常的显示是提示找到了所有
            必要组件和可选组件
 
      5.  配置环境变量 
         AXIS_HOME = Tomcat/webapps/axis
         AXIS_LIB = %AXIS_HOME%/lib/WEB-INF/lib
         AXISCLASSPATH = .;%AXIS_LIB%/axis.jar;%AXIS _LIB%/commons-discovery-0.2.jar;
                         %AXIS_LIB%/commons-logging-1.0.4.jar;%AXIS_LIB%/jaxrpc.jar;%AXIS _LIB%/saaj.jar;%AXIS_LIB% /log4j-1.2.8.jar;
                         %AXIS_LIB%axis-ant.jar;  (注意这个) %TomcatHome%/common/lib /activation.jar; .....
         也就是lib下所有包的名字,以及步骤3中加入的四个包的名字
     另外有个log4j的配置,以后再补  
 
     注:为了减少以后的麻烦  ,tomcat  服务器必须占用端口8080                    
二. 发布服务(两种方式发布,三种方式调用)  
    A. DII(Dynamic Invocation Interface )方式访问web服务
       1. 编写服务器代码

        public class HelloWorld
        {
            public String getName(String name)
            {
                   return "hello "+name;
            }
        }

 
- 显示引用文字 -
       2. 将源码拷贝到Axis_HOME下,重命名为 HelloWorld.jws
       3. 访问连接 http://localhost:8080/Axis/HelloWorld.jws?wsdl,页面显示Axis自动生成的wsdl
       4. 编写访问服务的客户端代码

import org.apache.Axis.client.Call;
import org.apache.Axis.client.Service;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;

public class SayHelloClient
{
    public static void main(String[] args)
 {
        try
  {
  String endpoint =
  "http://localhost:8080/Axis/HelloWorld
.jws";

    Service service = new Service();
            Call call = null;

            call = (Call) service.createCall();

            call.setOperationName(new QName(
               "http://localhost:8080/Axis/HelloWorld.jws",
      "getName"));
            call.setTargetEndpointAddress
   (new java.net.URL(endpoint));

            String ret = (String) call.invoke(new Object[]
   {"zhangsan"});
            System.out.println("return value is " + ret);
        }
  catch (Exception ex)
  {
       ex.printStackTrace();
        }
    }
}
  

    B. Dynamic Proxy方式访问服务 
        1.  编写部署服务端程序,同上边DII方式 ,本次仍使用上边部署的HelloWorld
        2.  编写代理接口

                public interface HelloWorldInterface  extends java.rmi.Remote
                {
                    public String getName(String name)
                         throws java.rmi.RemoteException;
                }

        3. 编写并执行客户端程序TestHelloClient.java 

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import java.net.URL;
import javax.xml.namespace.QName;

public class TestHelloClient
{
    public static void main(String[] args)
 {
        try
        {
            String wsdlUrl =
   "http://localhost:8080/Axis/HelloWorld.jws?wsdl";
            String nameSpaceUri =
   "http://localhost:8080/Axis/HelloWorld.jws";
            String serviceName = "HelloWorldService";
            String portName = "HelloWorld";

            ServiceFactory serviceFactory =
   ServiceFactory.newInstance();
            Service afService =
   serviceFactory.createService(new URL(wsdlUrl),
         new QName(nameSpaceUri, serviceName));
            HelloWorldInterface  proxy = (HelloWorldInterface  )
        afService.getPort(new QName(
                    nameSpaceUri, portName), 
     HelloWorldInterface  .class);
            System.out.println
   ("return value is "+proxy.getName("john") ) ;
        }catch(Exception ex)
        {
            ex.printStackTrace() ;
        }
    }
}

    C. 编写wsdd发布web服务,编写stub client访问web服务

      1、编写服务端程序SayHello.java,编译SayHello.java

            public class SayHello
            {
                public String getName(String name)
                {
                    return "hello "+name;
                }
             }

      2.  编写LogHandler.java

            import org.apache.axis.AxisFault;
            import org.apache.axis.Handler;
            import org.apache.axis.MessageContext;
            import org.apache.axis.handlers.BasicHandler;

            import java.util.Date;

            public class LogHandler extends BasicHandler
            {
                 public void invoke(MessageContext msgContext) throws AxisFault
                {
                    /** Log an access each time we get invoked. */
                    try {
                            Handler serviceHandler = msgContext.getService();

                            Integer numAccesses =  (Integer)serviceHandler.getOption("accesses");
                            if (numAccesses == null)
                                numAccesses = new Integer(0);
                            numAccesses = new Integer(numAccesses.intValue() + 1);
                            Date date = new Date();
                            String result = date + ": service " +msgContext.getTargetService() +" accessed " + numAccesses + " time(s).";
                            serviceHandler.setOption("accesses", numAccesses);
                            System.out.println(result);
                        } catch (Exception e)
                        {
                            throw AxisFault.makeFault(e);
                        }
                }
            }

  3. 编写deploy.wsdd文件

       <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java= "http://xml.apache.org/axis/wsdd/providers/java">          
           <handler name="print" type="java:LogHandler"/>
           <service name="sayhello" provider="java:RPC">
                 <requestFlow>
                     <handler type="print"/>
                 </requestFlow>
                 <parameter name="className"  value="SayHello"/>
                 <parameter name="allowedMethods" value="*"/> 
           </service>
       </deployment>

    4. 将编译后的文件拷贝到Axis_HOME/WEB-INF/classes下,如:D:/tomcat/webapps/Axis/WEB-INF/classes

    5. 发布服务,生成服务配置文件  java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd 正常会输出一个文件server-config.wsdd

    6.生成客户端代码  

    a:方式1

  将SayHello.java拷贝到Axis_HOME/下,重命名为SayHello.jws,

  执行下面的命令生存client stub

java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java -p client  http://localhost:8080/axis/SayHello.jws?wsdl 

这种方式相当于实际上使用了第一种发布方式来生成 wsdl 文件 然后用WSDL2Java  生成客户端stub代码

  b:方式2

   这种方式 先用SayHello生成一个静态的SayHello.wsdl 文件,然后用WSDL2Java  生成对应的客户端stub框架  

  执行如下命令生成SayHello.wsdl

java -cp %AXISCLASSPATH% org.apache.axis.wsdl.Java2WSDL -oSayHello.wsdl -lhttp://localhost:8080/axis/services/SayHello -nsayhello SayHello

  执行如下命令生成client stub

java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java  SayHello.wsdl  -p client

  生成的stub client文件列表为:

  1.SayHello.java

  2.SayHelloService.java。

  3.SayHelloServiceLocator.java

  4.SayHelloSoapBindingStub.java

  6、编写客户端程序,编译并执行

public class SayHelloClient
{
    public static void main(String[] args)
 {
        try
  {
    SayHelloService service = new client.
       SayHelloServiceLocator();
          client.SayHello_PortType
    client = service.getSayHello();
            String retValue=client.getName("Your name");
            System.out.println(retValue);
}
catch (Exception e)
{
 System.err.println
 ("Execution failed. Exception: " + e);
        }
    }
}

 

 

 

Axis2  的安装配置以及简单例子  

一.安装配置 
    1. axis2 的主页  http://ws.apache.org/axis2/index.html 
       axis2 1.0 的下载地址  http://ws.apache.org/axis2/download/1_0/download.cgi
    2. servlet 容器安装 (以tomcat5.5 为例)
       从上面给出的下载地址下载 War Distribution (axis2.war)
       放到  tomcat/webapps 目录下,在浏览器中输入 http://localhost:8080/axis2 正常显示Welcome 的页面,(查看tomcat/webapps  可以看到生成一个名为axis2的文件夹) 点击 Validate 验证安装是否正常
       一切正常侯即可使用axis2发布web服务 
       axis2 web管理环境的用户名:admin 密码:axis2
 
    3. 配置开发相关环境变量
       需要添加 AXIS2_HOME = axis2解压目录
 
       为了随处可以使用axis2 提供的代码生成工具,可以在path 环境变量里添加  %AXIS2_HOME%/bin    
        
   
二.开发服务
    axis2 通过两种方式来开发一个web服务,一种方式通过使用axis2 primary APIs
    另一种方式使用wsdl文件来生成web服务的客户端和服务端框架 代码
    A.  通过 axis2 primary APIs 开发web service
        这种方式需要学习axis2 对象模型(叫AXIOM)的基础知识 ,而且可扩展性不如后一种方式。
        
    B. 通过wsdl文件开发和测试一个web服务 
       AXIS2_HOME/samples /wsdl下有wsdl文件的例子 ,以Axis2SampleDocLit.wsdl 为例,简单介绍一下生成框架代码的过程,
       1.  在命令行模式里,进入到AXIS2_HOME/samples /wsdl 目录  
 
           注意:这个Axis2SampleDocLit.wsdl 文件有点问题,需要将里边 style = "rpc"的地方全部改成 style = "document"
 
       2.  运行 wsdl2java -uri ./Axis2SampleDocLit.wsdl -ss -s d -d xmlbeans -g -o Axis2SampleDocLit -p org.apache.axis2.userguide
           这个命令在当前目录生成一个文件夹Axis2SampleDocL it 
       3.  添加服务: 编辑
               Axis2SampleDocLit/src/org /apache/axis2/userguide /Axis2SampleDocLitServiceSkelet on.java  文件
            编辑 echoString 方法为
       public org.apache.axis2.userguide.xsd .EchoStringReturnDocument echoString(          
                                                           org.apache.axis2.userguide.xsd .EchoStringParamDocument  param4)
 
       {
          String name = param4.getEchoStringParam();
          String retStr = "Hello " + name + "!";
          EchoStringReturnDocument esrd = EchoStringReturnDocument .Factory.newInstance();
          esrd.setEchoStringReturn(retStr);
          return esrd;
       }
 
       4 .  进入目录Axis2SampleDocLit,可以看到build.xml,运行ant(ant的安装相当简单 ,下载ant 1.6.5 将 "ant解压目录/bin" 添加到path 环境变量即可)
           ant 会告诉你build 成功或者失败 , 
           
       5.  build 成功后转到浏览器,进入 http://127.0.0.1:8080/axis2/axis2-admin/ 登陆, Upload Service ,选择           
                                                                           Axis2SampleDocLit/build/lib /Axis2SampleDocLitService.aar,
            然后upload ,服务就发布成功了
       6. 客户端代码 
 
           public static void main(String[] args) {
               try {
                   java.lang.String str = new java.lang.String(); 
                   Axis2SampleD ocLitServiceStub stub= new Axis2SampleDocLitServiceStub     
                                                                     (" http://localhost:8080/axis2/services/Axis2SampleDocLitService");
                   //Create the request document to be sent.
                   EchoStringParamDocument  reqDoc= EchoStringParamDocument .Factory.newInstance();
                   reqDoc.setEchoStringParam("Your name");
                   //invokes the Web service.
                   EchoStringReturnDocument resDoc = stub.echoString(reqDoc);
                   System.out.println(resDoc.getEchoStringReturn());
 
                  } catch (Exception e) {
                       e.printStackTrace();
                  }
             }
         编译运行,应该可以看到hello Your name 输出   
 
     C. 可以通过axis1.x 介绍 C.6.b的介绍 通过java 代码生成wsdl的原型文件
    
     D. 也可以通过Axis2_Codegen_Wizard_1 .2.0 eclipse 插件 来开发wsdl 和 框架文件 
        然后通过Axis_Service_Archiver_1.0.0 eclipse 插件 打包服务
        这两个插件的下载地址
      
        以Axis2_Codegen_Wizard_1.2.0 为例:
       下载后解压 ,解压后的文件夹是一个eclipse 插件工程,导入eclipse 开发环境 , 然后在package explorer 视图中 右键 export
       然后选择 deployable plug-ins and .... 然后指定输出目录,这样在输出目录将会生成 plugins 文件夹 ,将该文件夹拷贝到 eclipse 安装目录
       重启eclipse ,在new -->other  的列表里应该会出现axis2 wizard 的 项 ,说明安装插件成功,工具的使用请查看
       "Axis2_Codegen_Wizard_1.2 .0解压目录"/help/wsdl2java-plugin.html 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值