zoukankan      html  css  js  c++  java
  • #AXIS2 发布webservice#

    使用axis2构建webservice(转载)

     

    axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice

    1:可以使用这个插件来发布webservice,可以看网址:http://clq9761.iteye.com/blog/976029/======个人感觉一般不太适合我们做项目时候使用

    2:我们这里将axis2的夹包引入到一个web工程里,运行这个web工程来发布webservice=====

           这是我们常用的,比如要你写一个webservice客户端,你要怎么做呢?创建一个web工程,然后引入axis2的夹包,使用axis2来实现一个webservice,这是一个最基本的想法

    想使用axis2实现webservice要做几件事如下:

      1:创建一个web工程,====还可以说是创建一个web服务===这都是行内人说的名词====其实就是创建一个web项目

      2:要引入需要的夹包到web工程的lib文件夹内

      3:创建service.xml文件  =====axis2发布webservice需要配置的xml文件

      4:配置web工程的web.xml,扫描axis2的service.xml文件 

      5:书写对应的类来实现

    然后运行写好的web项目,在网页上执行路径就可以了,其实按着步骤走挺简单的,下面是每一步的详细介绍

    第一步:创建一个web项目

    第二步:引入需要的夹包

    有个问题夹包从哪里来呢,不能百度一个一个下吧,去axis的官网下载
    插件的下载网址:http://axis.apache.org/axis2/java/core/download.html

     这里需要注意的是夹包的版本,在官网上下载的可能与本章中图片显示的不同,这个不用管,名字一样就行

    如果不行再换,先试试 ===============这样我们就可以把所有需要的夹包复制到web项目的lib下

    第三步:创建service.xml文件,看下图吧

    在WEB-INF下创建services文件夹然后创建------conf----META-INF----services.xml

    services.xml的内容如下:

    =================services.xml内容开始=========================

    <?xml version="1.0" encoding="UTF-8"?>
    <service name="Testservice">  <!-- 指定服务名,随便定义 -->
        <description>测试axis2webservices</description><!-- 服务的作用说明,可写可不写 -->
         <!-- 指定要发布的类路径 -->
        <parameter name="ServiceClass">  <!-- 自定义    name-->
               com.axiswevservice.test.TestService      <!-- 写的类路径 -->
        </parameter>  
       <!-- 类里面的方法,有其他方法就在写个operation标签 -->
        <operation name="test">  <!-- 类里面的方法名 -->
            <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
        </operation>   
    </service>
    <!-- http://localhost:8080/testaxis2webservice/services/Testservice?wsdl -->

     =================services.xml内容结束=========================

    http://localhost:8080/testaxis2webservice/services/Testservice?wsdl

    注释:上面的路径是搭建好web项目后要运行的wsdl路径   
    1: 指定服务名 =====就是要运行的wsdl路径的?和/之间的那一部分===可以说指定的服务名是wsdl路径的一部分

    2:服务的作用说明====这个不用管===就相当于一个注释,说说你要发布的webservice是干啥的

    3:指定要发布的类路径======就是你要把那个类做成webservice

    4:类里面的方法,有其他方法就在写个operation标签=======配置你写的类里面的方法

    第四步:配置web.xml
     =================web.xml内容开始=========================

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>testaxis2webservice</display-name><!-- 项目名,创建项目时候自动生成的 -->
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      
        <servlet>  
            <servlet-name>AxisServlet</servlet-name>  
            <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>  
            <load-on-startup>1</load-on-startup>  
        </servlet>  
        <servlet-mapping>  
            <servlet-name>AxisServlet</servlet-name>  
            <url-pattern>/services/*</url-pattern>  
        </servlet-mapping>  
      
    </web-app>

     =================web.xml内容结束=========================

    第五步:书写发布类

    ============================书写的类开始======================

    package com.axiswevservice.test;

    public class TestService {
        
        public String test(String test){
            return "测试axis2webservice:"+test;
        }
        
    }

    ==========================书写的类结束=========================

    类写的简单点,现在只是测试没必要写复杂,就写一个类,类里写一个方法
    写完这里之后,就要和上面的service.xml对应起来了,service.xml里面的类路径,方法名要和这里写的一样

    写完之后就可以了,这是项目的结构图如下

    在eclipce中运行项目

    然后在网页上输入http://localhost:8080/testaxis2webservice/services/Testservice?wsdl

    路径的组成:tomcate里配置的ip和端口号 + 项目名 + web.xml里配置的<url-pattern> + service.xml里面指定的服务名

     运行结果如下:

     这样就成功了,使用axis2来实现webservice服务端,这样在写个客户端调用就可以了

    =====================================================================================

    开始写客户端调用服务端写的接口通不通,

    我们可以使用soupui这个软件来测试服务端,也可以自己写代码测试

    这里我们自己写:要怎么做呢?很简单,需要做如下:

    1:建个java工程  ------创建一个java工程

    2:引入夹包

    3:写个测试类

    ===========================开始==================================

    第一步:创建一个java工程======就是创建一个java项目,我们的项目一般分为java项目,web项目,maven项目。。。。。。

    第二步:引入夹包,夹包引入的方法和上面写服务端引入的一样,但是多了两夹包httpcore-4.4.4.jar,commons-codec-1.3.jar

             这两个夹包在axis2的插件的lib下也可以找到

    第三步:书写测试类

     其实就是建个java项目,把写的web工程的夹包复制到java项目下,在从解了压的axis2插件的lib下把少的两个夹包加进来,写个类测一下就行了

    ======================测试类开始=======================

    package testwebserver;

    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 test {

        public static void main(String[] args) {
        
            try {
                //本机tomcat端口默认为8081,参数是wsdl网址的一部分
                EndpointReference targetEPR = new EndpointReference("http://localhost:8081/testaxis2webservice/services/Testservice");  
                RPCServiceClient sender = new RPCServiceClient();  
                Options options = sender.getOptions();  
                options.setTimeOutInMilliSeconds(2*20000L);//超时时间20s  
                options.setTo(targetEPR);  
                /**
                 * 参数:
                 * 1:在网页上执行 wsdl后xs:schema标签的targetNamespace路径
                 * <xs:schema  targetNamespace="http://test.axiswevservice.com">
                 * 2:<xs:element name="test"> ======这个标签中name的值
                 * 
                 */
                QName qname = new QName("http://test.axiswevservice.com", "test"); 
                String str = "客户端调用成功";  //方法的入参
                Object[] param = new Object[]{str};  
                Class<?>[] types = new Class[]{String.class};  //这是针对返值类型的  
                /** 
                 * RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。 
                 * invokeBlocking方法有三个参数 
                 * 第一个参数的类型是QName对象,表示要调用的方法名; 
                 * 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[]; 
                 * 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。 
                 *  
                 * 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。 
                 */  
                Object[] response1 = sender.invokeBlocking(qname, param, types);  
                System.out.println(response1[0]);
            } catch (AxisFault e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }

    ======================测试类结束=========================

    这是个java项目,直接写在main方法内,直接运行main方法就可以了,

    注意:你这里写好的服务端得一直起着,这里写的测试调用才能调通,看下图:

     总结:如果都测通了,我们要明白一下几点

    1:axis2要实现webservice需要哪些夹包,夹包是哪里来的

       需要哪些夹包看截图,夹包是从axis2的官网下的,官网有个.....bin.zip的文件,解压这个文件,里面有个lib文件夹,那里面有所有的夹包

    2:怎么才能使用axis2发布一个webservice,

        需要axis2的一个service.xml配置文件,我们要确保项目启动时要扫描到这个配置文件,并且要和写的类/方法等一致

        那么程序就会将service.xml里面配置的类和方法做成一个webserce发布,

        我们这里是将service.xml引入到了一个web工程里,使用web工程的web.xml来扫描service.xml文件,当运行这个web工程的时候    程序就将service.xml里面的配置的做成一个webservce服务发布了,只要这个web工程一直起着,我们就可以调用发布的服务

    3:要发布的类,中的方法怎么写

         方法有个返回值和入参就行,不管写方法在复杂,格式就是那样的

    4:客户端怎么写的?

        客户端就是写个java工程写个类测试下就行,夹包看上面截图,调用的代码要好好看看

  • 相关阅读:
    API之绘图(转)
    API之子窗口创建 (转)
    函数调用规范__cdecl和__stdcall的区别一目了然(表格形式)(二)
    _cdecl 和_stdcall及其他调用方式 (一)
    sizeof的深入理解
    VC++中2进制,10进制,16进制相互转换
    传说中的数据结构
    字符串扩展
    数据结构实验之链表七:单链表中重复元素的删除
    数据结构实验之栈一:进制转换
  • 原文地址:https://www.cnblogs.com/tnt-33/p/8483616.html
Copyright © 2011-2022 走看看