axis2与 webService

 

webService的总结:

1、供其它客户端或服务端调用的服务。

2、这种服务可以跨平台、跨语言。

3、为了实现跨语言、跨平台,W3C就制定了SOAP、WSDL等标准。

4、SOAP:一种来用规范数据传输的协议(所有编程语言都可以根据这种规范来解析数据,所以就实现了跨语言)。

5、WSDL:用来描述一项web服务,能让调用这项服务的客户清楚这是一项什么服务,怎么调用这项服务。

6、SOAP、WSDL都是以XML文档,所以有XML的所有优势。

axis2:

  1. 采用名为 AXIOM(AXIs Object Model)的新核心XML标准通用标记语言的子集)处理模型,利用新的XML解析器提供的灵活性按需构造对象模型。
  2. 支持不同的消息交换模式。目前Axis2支持三种模式:In-Only、Robust-In和In-Out。In-Only消息交换模式只有SOAP请求,而不需要应答;Robust-In消息交换模式发送SOAP请求,只有在出错的情况下才返回应答;In-Out消息交换模式总是存在SOAP请求和应答。
  3. 提供阻塞和非阻塞客户端 API。
  4. 支持内置的 Web服务寻址 (WS-Addressing) 。
  5. 灵活的数据绑定,可以选择直接使用 AXIOM,使用与原来的 Axis 相似的简单数据绑定方法,或使用XMLBeans、JiBX 或 JAXB 2.0 等专用数据绑定框架。
  6. 新的部署模型,支持热部署
  7. 支持HTTP,SMTP,JMS,TCP传输协议
  8. 支持REST (Representational State Transfer)。

 

服务的发布

经过我的验证,发现 :目录层次必须是 services / 任意名称文件夹 / META-INF / services.xml ,否则 WebService发布会失败 ,也就是说上图的层次中 ,只有webservice这个文件夹的名字是可以自由指定,其它的文件、文件夹名字都是固定的! 

在WEB-INF下创建services文件夹然后创建------conf----META-INF----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>
 =========

服务的调用

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

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

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

第三步:书写测试类

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

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();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值