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

运行结果是:

     

 

posted @ 2017-02-21 14:04  哀&RT  阅读(231)  评论(0编辑  收藏  举报