zoukankan      html  css  js  c++  java
  • Web Service之Axis(二)

    AXIS和AXIS2很类似,只是一些文件名和配置不一样,在客户端调用基本一样。

    WebService一共有四种,在抉择上:

     1、如果应用程序需要多语言的支持,Axis2 应当是首选了;

     2、如果应用程序是遵循 Spring 哲学路线的话,Apache CXF 是一种更好的选择,特别对嵌入式的 Web

        Services 来说;

     3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如 Axis1,XFire,Celtrix或

        BEA 等等厂家自己的 Web Services 实现,就别劳民伤财了。

     相互之间的对比可参考:http://www.cnblogs.com/growup/archive/2011/03/06/1972464.html

    接下来我们看下AXIS实例。

    一:首先创建一个Maven项目,并在pom.xml中引入AXIS依赖的jar包。

         

    二:修改web.xml文件

      <!-- 加载Axis -->  
        <servlet>
            <servlet-name>AxisServlet</servlet-name>
            <servlet-class>
                org.apache.axis.transport.http.AxisServlet
            </servlet-class>
          </servlet>
          <servlet-mapping>
            <servlet-name>AxisServlet</servlet-name>
            <url-pattern>/services/*</url-pattern>
          </servlet-mapping>

    三:创建实体类和实现类:

    package com;
    
    public class User {
        
        private String name;
        private Integer age;
        
        public User(){}
    
        //get/set方法...      
    }
    package com;
    
    public class AxisMethod {
        public String HelloWorld(String name){
            return "Hello World:" + name;
        }
        
        public String getUserInfo(User user){
            return "name:" + user.getName() +",age:" + user.getAge();
        }
    }

    四:创建配置文件,在WEB-INF中新建文件名为server-config.wsdd,必须为这个文件名

    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
             xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
     <!-- globalConfiguration 标签内容为系统默认 无需更改-->
     <globalConfiguration>
      <parameter name="adminPassword" value="admin"/>
      <parameter name="attachments.Directory" value="./attachments"/>
      <parameter name="attachments.implementation"
                 value="org.apache.axis.attachments.AttachmentsImpl"/>
      <parameter name="sendXsiTypes" value="true"/>
      <parameter name="sendMultiRefs" value="true"/>
      <parameter name="sendXMLDeclaration" value="true"/>
      <parameter name="axis.sendMinimizedElements" value="true"/>
      <requestFlow>
           <handler type="java:org.apache.axis.handlers.JWSHandler">
            <parameter name="scope" value="session"/>
           </handler>
           <handler type="java:org.apache.axis.handlers.JWSHandler">
            <parameter name="scope" value="request"/>
            <parameter name="extension" value=".jwr"/>
           </handler>
      </requestFlow>
    </globalConfiguration>
    <handler name="LocalResponder"
              type="java:org.apache.axis.transport.local.LocalResponder"/>
    <handler name="URLMapper"
              type="java:org.apache.axis.handlers.http.URLMapper"/>
    <handler name="Authenticate"
       type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
     
    <!--  下面才是重点,是需要自己配置的内容-->
    <!--name 是url中需要的参数 -->
    <service name="axisDemo" provider="java:RPC">
        <!-- allowedMethods的value值是方法名,可以写成* -->
        <parameter  name="allowedMethods" value="*"/>
        <!-- className的value值是类路径 -->
        <parameter name="className" value="com.AxisMethod"/>
        <!-- wsdlTargetNamespace的wsdl文件中TargetNamespace的值 -->
        <parameter name="wsdlTargetNamespace" value="http://axistest.com"/>
        
        <!-- 这里很重要,如果方法需要传实体类,需要配置此处,其中qname="myNs+类名",
       languageSpecificType="java:类名全路径"
    --> <beanMapping qname="myNS:User" xmlns:myNS="urn:BeanService" languageSpecificType="java:com.User"/> </service> <!-- 默认配置 --> <transport name="http"> <requestFlow> <handler type="URLMapper"/> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder"/> </responseFlow> </transport> </deployment>

    五:部署后访问:http:// localhost:80/AXISDemo/services/axisDemo?wsdl结果报错!

        

    说明还存在某些依赖的jar包为引入,LZ就按照报错的日志,去Maven中央库中找到相应的jar包引入,最后发现少了三个:

        <dependency>
            <groupId>commons-discovery</groupId>
            <artifactId>commons-discovery</artifactId>
            <version>0.2</version>
        </dependency>
        
        <dependency>
            <groupId>org.eclipse.birt.runtime.3_7_1</groupId>
            <artifactId>javax.wsdl</artifactId>
            <version>1.5.1</version>
        </dependency>
        
        <dependency>
            <groupId>javax.xml.rpc</groupId>
            <artifactId>javax.xml.rpc-api</artifactId>
            <version>1.1</version>
        </dependency>

    最后引入完进行测试,出现下面图像说明配置成功。

         

    六:现在来测试下客户端能否获取,为了方便,就在AXISDemo中新建了一个Client类

    package com;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.rmi.RemoteException;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.ParameterMode;
    import javax.xml.rpc.ServiceException;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.XMLType;
    import org.apache.axis.encoding.ser.BeanDeserializerFactory;
    import org.apache.axis.encoding.ser.BeanSerializerFactory;
    
    public class Client {
        public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
            
            Service service = new Service();
            Call  call =(Call)service.createCall();
            
            //wsdl的地址
            call.setTargetEndpointAddress(new URL("http://127.0.0.1/AXISDemo/services/axisDemo"));
            
            //设定调用3分钟不返回则超时
            call.setTimeout(new Integer(180000));
    
            //QName和AXIS2一样,第一个参数是wsdl的targetNameSpace名称,第二个参数是方法名称
            call.setOperationName(new QName("http://axistest.com","HelloWorld"));
            
            //参数类型,第一个参数是参数的名称与HelloWorld类中的参数名称相同。第二个参数是参数的类型
         //也必须与HelloWorld类中参数类型相同。
    第三个参数是参数模式,IN or OUT,多个参数就继续addParameter call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN); //返回值类型 call.setReturnType(XMLType.XSD_STRING); //参数值 String getReturnStr = (String)call.invoke(new Object[]{"JAVA"}); System.out.println(getReturnStr); //测试参数是实体类的方式,其中客户端也需要建立相应的User类,
         //这里因为放在了同一个项目中,所以不需要在创建一个User类了。
    User user = new User(); user.setName("小明"); user.setAge(21); //要重新建一个call,不容后面addParamter意思就是第二个参数类型了 call =(Call)service.createCall(); call.setTargetEndpointAddress(new URL("http://127.0.0.1/AXISDemo/services/axisDemo")); call.setTimeout(new Integer(180000)); call.setOperationName(new QName("http://axistest.com","getUserInfo")); //注册SimpleObject的序列化类型 QName qName = new QName("urn:BeanService","User"); call.registerTypeMapping(User.class, qName,
    new BeanSerializerFactory(User.class, qName),
    new BeanDeserializerFactory(User.class, qName)
                       );
    //参数类型,可省略 call.addParameter("user", XMLType.XSD_ANYTYPE, ParameterMode.IN); //返回值类型 call.setReturnType(XMLType.XSD_STRING); System.out.println((String)call.invoke(new Object[]{user})); } }

    运行结果是:

         

    作者:哀&RT
    出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    NVelocity语法
    Linux C socket 编程之UDP
    MFC之Radio Button按钮学习 转载
    动态加载DLL
    JS中 判断一个整数是偶数还是奇数,并输出判断结果。
    JS中判断一个整数,属于哪个范围:大于0;小于0;等于0
    JS输入分数,判定成绩等级(if和switch两种写法)
    JS中根据输入的三个数字,判断是这一年的第几天。
    JS中开发一款软件,根据公式(身高108)*2=体重,可以有10斤左右的浮动。来观察测试者体重是否合适。
    php 多语言(UTF8编码)导出Excel、CSV乱码解决办法之导出UTF8编码的Excel、CSV
  • 原文地址:https://www.cnblogs.com/Tony-Anne/p/6423856.html
Copyright © 2011-2022 走看看