• 使用Axis2方式发布webService实例说明


    1、简单的pojo方式:

      不需要写配置文件,直接把class文件拷贝到axis2的WEB-INF目录下的poji文件夹下即可。但其局限性表现在,实现类不能有包声明,这在实际开发过程中使用较少,这里不做说明。

    2、打jar包的方式:

      将接口实现放到axis2中。首先下载所需要的jar包,解压axis2-1.5.4-war.zip,将里面的axis2.war直接拷贝到tomcat里webapps中,启动tomcat后,会自动生成axis2文件夹。在浏览器中访问http://127.0.0.1:8080/axis2/,能看到以下界面说明axis2启动成功。

      点击Services链接,可以看到available services只有Version,这个是Axis2自带的接口。

      然后开始新建一个我们自己的webService。在myEclipse中新建项目:webServiceTest。

      新建类com.sdjxd.SayHelloImpl.java 

    Java代码  
    1. package com.sdjxd;   
    2. /**  
    3.  * @description 简单接口方法实现  
    4.  * @author lizhen  
    5.  */  
    6. public class SayHelloImpl {   
    7.     public void sayHello() {   
    8.         System.out.println("Hello WebService");   
    9.     }   
    10.     public void sayHelloToSomeOne(String name) {   
    11.         System.out.println("Hello " + name);   
    12.     }    
    13. }  
    package com.sdjxd;
    /**
     * @description 简单接口方法实现
     * @author lizhen
     */
    public class SayHelloImpl {
    	public void sayHello() {
    		System.out.println("Hello WebService");
    	}
    	public void sayHelloToSomeOne(String name) {
    		System.out.println("Hello " + name);
    	} 
    }

      在项目的src目录下建立文件夹META-INF,在META-INF中创建services.xml

    Xml代码  
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!-- webService发布名称,命名空间 -->  
    3. <service name="myService" targetNamespace="http://ws.apache.org/ax2">  
    4. <!-- 更改schemaNamespace,也可使用默认值,客户端调用时会使用 -->  
    5. <schema schemaNamespace="http://sdjxd.com.cn"/>  
    6. <!-- webService描述 -->  
    7. <description>Web Service实例一</description>  
    8. <!-- webService的实现类 -->  
    9. <parameter name="ServiceClass">com.sdjxd.SayHelloImpl</parameter>  
    10. <messageReceivers>  
    11. <!-- 配置消息接收器,Axis2会自动选择 -->  
    12. <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"  
    13.     class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
    14. <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"  
    15.     class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>  
    16. </messageReceivers>  
    17. </service>  
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- webService发布名称,命名空间 -->
    <service name="myService" targetNamespace="http://ws.apache.org/ax2">
    <!-- 更改schemaNamespace,也可使用默认值,客户端调用时会使用 -->
    <schema schemaNamespace="http://sdjxd.com.cn"/>
    <!-- webService描述 -->
    <description>Web Service实例一</description>
    <!-- webService的实现类 -->
    <parameter name="ServiceClass">com.sdjxd.SayHelloImpl</parameter>
    <messageReceivers>
    <!-- 配置消息接收器,Axis2会自动选择 -->
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
    	class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
    	class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
    </messageReceivers>
    </service>
    

      在控制台上找到当前项目的src目录。
      输入打jar包的命令:jar cvf webServiceTest.aar . 最后面是空格+小数点。

      执行完成后,目录下会出现webServiceTest.aar文件。

      然后将webServiceTest.aar文件拷贝到D: omcat-6.0webappsaxis2WEB-INFservices中

      重新启动tomcat,访问http://127.0.0.1:8080/axis2/,然后再点击Services,可以看到此时有两个Available Services,其中myService就是我们刚才定义的。

      点击myService,可以看到生成的wsdl配置文件:其中命名空间是我们自定义的那个。

      至此,webService的服务器端开发就完成了,由于客户端的访问方式都是相同的,这个放到最后。

    3、不打jar包的方式:(重点)

      将axis2整合到接口所在系统中。同样如第二种方法,编写一个名为webServiceAxis2的项目。实现com.sdjxd.SayHelloImpl。

      由于要将Axis2添加到项目中,所以需要在web.xml中添加如下配置:

    Xml代码  
    1. <!--Axis2 config start-->  
    2. <servlet>  
    3.     <servlet-name>AxisServlet</servlet-name>  
    4. <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>  
    5.     <load-on-startup>1</load-on-startup>  
    6. </servlet>  
    7. <servlet-mapping>    
    8.     <servlet-name>AxisServlet</servlet-name>     
    9.     <url-pattern>/services/*</url-pattern>     
    10. </servlet-mapping>  
    11. <!--Axis2  end-->  
    <!--Axis2 config start-->
    <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>
    <!--Axis2  end-->

      然后找到部署在tomcat中的axis2目录下的WEB-INF里的一下三个文件夹conf、modules、services。将他们拷贝到项目webServiceAxis2中的WEB-INF目录下。
      将axis2中lib下的jar包全部拷贝到webServiceAxis2里的lib中。然后再services目录下建立目录:webService/META-INF,在这个目录下建立services.xml配置文件。配置方法同上。目录webService/META-INF中webService名字是任意的,这里取webService。

      最后,将下载的项目中的axis2-web文件夹拷贝到webroot下,这个文件夹控制显示axis2的服务器列表等信息。
      完成后,重启tomcat,访问http://127.0.0.1:8080/ webServiceAxis2/services/listServices可以看到接口列表。访问地址http://127.0.0.1:8080/ webServiceAxis2/services/myService?wsdl可以看到wsdl配置。

    4、客户端访问webService的方法

      两个方法分别调用webService中的两个接口方法。

    Java代码  
      1. package com.sdjxd;   
      2. import javax.xml.namespace.QName;   
      3. import org.apache.axis2.AxisFault;   
      4. import org.apache.axis2.addressing.EndpointReference;   
      5. import org.apache.axis2.client.Options;   
      6. import org.apache.axis2.rpc.client.RPCServiceClient;   
      7. public class ComeToSayHi {   
      8.     /**  
      9.      * @method comeToSay  
      10.      * @description 调用接口方法sayHello(),接口方法无参,无返回值  
      11.      * @author lizhen  
      12.      */  
      13.     public static String comeToSay() {   
      14.         //接口访问地址,最后要有“?wsdl”   
      15.         String url = "http://127.0.0.1:8080/webServiceAxis2/services/myService?wsdl";   
      16.         //访问接口方法   
      17.         String method = "sayHello";   
      18.         RPCServiceClient serviceClient = null;   
      19.         try {   
      20.             serviceClient = new RPCServiceClient();   
      21.             Options options = serviceClient.getOptions();   
      22.             EndpointReference targetEPR = new EndpointReference(url);   
      23.             options.setTo(targetEPR);   
      24.             //连接服务器段的超时时间   
      25.             options.setTimeOutInMilliSeconds(100000L);   
      26.             //不加的话容易出现异常。   
      27.             options.setAction(method);   
      28.             //初始化参数,无参时,不能使用null,必须使用new Object[] {}。   
      29.             //有参数,使用new Object[] {param}   
      30.             //有多个参数,不用指定参数的名称new Object[] {param1,param2,...}   
      31.             Object[] opAddEntryArgs = (Object[]) null;   
      32.             opAddEntryArgs = new Object[] {};   
      33. //在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值   
      34.             QName opAddEntry = new QName("http://sdjxd.com.cn", method);   
      35. //要调用的方法没有返回值,使用方法invokeRobust(QName, new Object[]{..});   
      36. //第一个参数的类型是QName对象,表示要调用的方法名;   
      37. //第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];   
      38. //如果有返回值则要使用invokeBlocking(QName, new Object[]{..},new Class[]{..})   
      39. //第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。   
      40.             serviceClient.invokeRobust(opAddEntry,opAddEntryArgs);   
      41.             //清空缓存,否则容易出错。   
      42.             serviceClient.cleanupTransport();   
      43.             return "Hi";   
      44.         } catch (AxisFault e) {   
      45.             e.printStackTrace();   
      46.         }   
      47.         return "Hi";   
      48.     }   
      49.     /**  
      50.      * @method comeToSayHelloToSomeone  
      51.      * @description 调用接口方法sayHelloToSomeone(),接口方法有参,有返回值  
      52.      * @author lizhen  
      53.      */  
      54.     public static String comeToSayHelloToSomeone() {   
      55.         String url = "http://127.0.0.1:8080/webServiceAxis2/services/myService?wsdl";   
      56.         String method = "sayHelloToSomeone";   
      57.         String str = "li";   
      58.         String result = "";   
      59.         RPCServiceClient serviceClient;   
      60.         try {   
      61.             serviceClient = new RPCServiceClient();   
      62.             Options options = serviceClient.getOptions();   
      63.             EndpointReference targetEPR = new EndpointReference(url);   
      64.              options.setTimeOutInMilliSeconds(100000L);   
      65.             options.setAction(method);   
      66.             options.setTo(targetEPR);   
      67.             QName opAddEntry = new QName("http://sdjxd.com.cn", method);   
      68.             Object[] opAddEntryArgs = new Object[] {str};   
      69.             Class[] classes = new Class[] { String.class };   
      70.             //webService方法有参数,使用invokeBlocking方法调用   
      71.             result = (String) serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0];   
      72.         } catch (AxisFault e) {   
      73.             e.printStackTrace();   
      74.         }   
      75.         return result;   
      76.     }   
      77.     public static void main(String[] args) {   
      78.         String a = comeToSay();   
      79.         String b = comeToSayHelloToSomeone();   
      80.         System.out.print(a + "-----" + b);   
      81.     }   
      82. }  
  • 相关阅读:
    2019西湖论剑网络安全技能大赛(大学生组)部分WriteUp
    C++学习(四十)(C语言部分)之 学生管理系统设计
    C++学习(三十九)(C语言部分)之 游戏项目(2048游戏)
    C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
    C++学习(三十七)(C语言部分)之 链式栈(推箱子实现)
    C++学习(三十六)(C语言部分)之 链表2
    C++学习(三十五)(C语言部分)之 单链表
    C++学习(三十四)(C语言部分)之 链表
    C++学习(三十三)(C语言部分)之 队列
    C++学习(三十二)(C语言部分)之 栈
  • 原文地址:https://www.cnblogs.com/firstdream/p/6394036.html
Copyright © 2020-2023  润新知