Axis篇
Axis简介
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
    1)、 一个独立运行的SOAP服务器
    2)、一个servlet引擎的插件,这个servlet引擎可以是Tomcat
    3)、对WSDL的扩展支持
    4)、一个将WSDL的描述生成JAVA类的工具
    5)、一些示例代码
    6)、还有一个监控TCP/IP包的工具
図 2
SOAP简介
SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
Axis使用
提供服务实现类
//包名
package zpf;
/**
  * 服务实现类的实现
  * @author caoxiang
*/
public class SSOWebservice
{
    /**
     登陆并得到用户信息
     */
    public boolean login(String loginid, String password) {
        //判断用户是否登陆成功的标记
        boolean ret = false;
        if (loginid.equals("caoxiang") && password.equals("caoxiang "))
            ret = true;
        else
            ret = false;
        //返回
        return ret;
    }
}

配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>XFireServlet</servlet-name>
        <servlet-class>
            org.codehaus.xfire.transport.http.XFireConfigurableServlet
        </servlet-class>

<load-on-startup>0</load-on-startup>
    </servlet>
<servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>
            org.apache.axis.transport.http.AxisServlet
        </servlet-class>
    </servlet>
<servlet>
        <servlet-name>AdminServlet</servlet-name>
        <servlet-class>
            org.apache.axis.transport.http.AdminServlet
        </servlet-class>
        <load-on-startup>100</load-on-startup>
    </servlet>
<servlet>
        <servlet-name>SOAPMonitorService</servlet-name>
        <servlet-class>
            org.apache.axis.monitor.SOAPMonitorService
        </servlet-class>
        <init-param>
            <param-name>SOAPMonitorPort</param-name>
            <param-value>5001</param-value>
        </init-param>
        <load-on-startup>100</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
<servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
<servlet-mapping>
        <servlet-name>SOAPMonitorService</servlet-name>
        <url-pattern>/SOAPMonitor</url-pattern>
    </servlet-mapping>

<mime-mapping>
        <extension>wsdl</extension>
        <mime-type>text/xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xsd</extension>
        <mime-type>text/xml</mime-type>
    </mime-mapping>
</web-app>

配置server-config.wsdd
    <?xml version="1.0" encoding="gb2312"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <globalConfiguration>
        <parameter name="adminPassword" value="admin" />
        <parameter name="enableNamespacePrefixOptimization"
            value="true" />
        <parameter name="attachments.Directory"
        value="D:/jakarta-tomcat-5.0.28/webapps/axis/WEB-INF/attachments" />
        <parameter name="disablePrettyXML" value="true" />
        <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" />
<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"     />
    <!-- 自定义服务开始 -->
    <!-- 单点登陆服务 add by Zhang.P.F -->
    <service name="SSOWebservice" provider="java:RPC">
        <parameter name="allowedMethods" value="*" />
        <parameter name="className" value="zpf.SSOWebservice" />
        <operation name="login" returnType="ns:boolean">
            <parameter name="loginid" type="ns:String" />
            <parameter name="password" type="ns:String" />
        </operation>
    </service>
    <!-- 自定义服务结束 -->
    <service name="AdminService" provider="java:MSG">
        <parameter name="allowedMethods" value="AdminService" />
        <parameter name="enableRemoteAdmin" value="false" />
   <parameter name="className" value="org.apache.axis.utils.Admin" />
        <namespace>http://xml.apache.org/axis/wsdd/</namespace>
        <namespace>http://xml.apache.org/axis/wsdd/</namespace>
    </service>
    <service name="Version" provider="java:RPC">
        <parameter name="allowedMethods" value="getVersion" />
        <parameter name="className" value="org.apache.axis.Version" />
    </service>
<transport name="http">
        <requestFlow>
            <handler type="URLMapper" />
            <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
        </requestFlow>
        <parameter name="qs:list"
            value="org.apache.axis.transport.http.QSListHandler" />
        <parameter name="qs:wsdl"
            value="org.apache.axis.transport.http.QSWSDLHandler" />
        <parameter name="qs.list"
            value="org.apache.axis.transport.http.QSListHandler" />
        <parameter name="qs.method"
            value="org.apache.axis.transport.http.QSMethodHandler" />
        <parameter name="qs:method"
            value="org.apache.axis.transport.http.QSMethodHandler" />
        <parameter name="qs.wsdl"
            value="org.apache.axis.transport.http.QSWSDLHandler" />
    </transport>
<transport name="local">

<responseFlow>
            <handler type="LocalResponder" />
        </responseFlow>
    </transport>
</deployment>

客户端访问代码
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
/**
  * 客户端登陆类的实现
  * @author caoxiang
*/
public class CallC
{
/**
    * 测试主程序
    * @param args
   * @throws Exception
*/
   public static void main(String [] args) throws Exception {
       try{
         //服务路径
           String endpoint = "http://localhost:5200/axis_sample/services/SSOWebservice";
         //用户名
           String user= new String("1");
         //密 码
           String password=new String("2");
         //服务对象
           Service service = new Service();
         //调用服务的对象
           Call call = (Call) service.createCall();
           //设置目标服务
           call.setTargetEndpointAddress(new java.net.URL(endpoint));
         //设置调用的方法
           call.setOperationName("login");
          //设置参数
           call.addParameter("loginid", XMLType.XSD_STRING, ParameterMode.IN);
         //设置参数
           call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
           call.setReturnType(XMLType.XSD_BOOLEAN);
           //用于判断用户是否登陆的成功的标记
           Boolean bv = false;
         //判断服务对象是否为空
           if(call!=null) {
                //调用服务端程序,并接收服务端的返回值
                  bv = (Boolean)call.invoke(new Object[] {user, password});
           }
         //如果登陆成功
           if(bv) {
                System.out.println("用户登陆成功了" );
           } else {
                System.out.println("用户登陆失败了" );
           }
       }
       //异常处理
       catch(Exception e){
         //显示错误
           e.printStackTrace();
       }
   }
}  
文件上传与下载
因为项目中可能会用到web service提供的文件下载与上传功能,下面就简单举例介绍Axis中是如何实现文件上传与下载的。
● 创建服务类
package zpf;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import org.apache.log4j.Logger;
public class FileService {
static Logger logger = Logger.getLogger(FileService.class.getName());
        public static String Repository = "C://uploads";
        public String putFile(DataHandler dh, String name) {
           if (name == null)
             name = "test.tmp";
              logger.debug("文件名为空,设置文件名");
           try {
             File dir = new File(Repository);
               if (!dir.exists()) {
                 dir.mkdir();
                 logger.debug("附件存放目录为空,创建 uploads 目录");
                }
                InputStream input = dh.getInputStream();
                FileOutputStream fos = new FileOutputStream(new File(dir, "aa.txt"));
                byte[] buffer = new byte[1024 * 4];
                int n = 0;
                while ((n = input.read(buffer)) != -1) {
                   fos.write(buffer, 0, n);
                }
                input.close();
                fos.close();
             } catch (IOException e) {
                e.printStackTrace();
             }
             return name + "send OK";
          }
        public DataHandler[] getFile(String name) throws IOException {
        // File dir=new File(Repository);
        // if(!dir.exists())
        // dir.mkdir();
        // File data=new File(dir,name);
        // if(data.exists())
        //         return new DataHandler(new FileDataSource(data));
        // else
        //         return null;
        // }
        DataHandler ret[] = new DataHandler[1];
        java.io.File myFile = new java.io.File("C://00.txt");
        if (myFile.isFile() && myFile.canRead()) {
            String fname = myFile.getAbsoluteFile().getCanonicalPath();
            ret[0] = new DataHandler(new FileDataSource(fname));
        }
        return ret;
     }
}
●     部署描叙文件
<service name="FileService" provider="java:RPC">
         <parameter name="className" value="zpf.FileService"/>
         <parameter name="allowedMethods" value="*"/>
 <operation name="getFile" returnQName="returnqname" returnType="ns1:DataHandler" xmlns:SchemaNS="http://www.w3.org/2001/XMlSchema">
          <parameter name="name" type="SchemaNS:string"/>
          </operation>
          <operation name="putFile" returnQName="returnqname" returnType="ns1:DataHandler" xmlns:SchemaNS="http://www.w3.org/2001/XMlSchema">
          <parameter name="dh" type="ns1:DataHandler"/>
          <parameter name="name" type="SchemaNS:string"/>
          </operation>
</service>
服务端代码
package zpf;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory;
import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
public class CallFileService {
            private String fileName;
            public static void main(String[] args) {
                CallFileService.doPut("C://00.txt");
            }
        //文件上传
        public void PutFile(String fileName) {
            this.fileName = fileName;
        }
        public boolean doPut() {
            return doPut(fileName);
        }
        public static boolean doPut(String fileName) {
            String name = fileName;
            try {
String endpoint = "http://localhost:5200/axis_sample/services/FileService";
            Service service = new Service();
            Call call = (Call) service.createCall();
            DataHandler dh = new DataHandler(new FileDataSource(fileName));
            call.setTargetEndpointAddress(new java.net.URL(endpoint));
            call.setOperationName(new QName(endpoint, "putFile"));
            QName qnameattachment = new QName("FileService", "DataHandler");
            call.registerTypeMapping(dh.getClass(), qnameattachment,
                    JAFDataHandlerSerializerFactory.class,
                    JAFDataHandlerDeserializerFactory.class);
            call.addParameter("s1", qnameattachment, ParameterMode.IN);
            call.addParameter("s2", XMLType.XSD_STRING, ParameterMode.IN);
            call.setReturnType(XMLType.XSD_STRING);
            String uploadedFN = (String) call.invoke(new Object[] { dh, name });
            if (uploadedFN != null && uploadedFN.trim().length() > 0) {
                return true;
            }
            } catch (Exception e) {
//logger.error("调用文件上传Web服务出错:" + e.getMessage());
            return false;
            }
            return false;
        }
        //文件下载:
        public void GetFile(String fileName) {
            this.fileName = fileName;
        }
        public boolean doGet() {
            return doGet(fileName);
        }
        public static boolean doGet(String fileName) {
            InputStreamReader ins = null;
            BufferedReader br = null;
            FileWriter fw = null;
            try {
String endpoint = "http://localhost:5200/axis_sample/services/FileService";
                Service service = new Service();
                Call call = (Call) service.createCall();
                DataHandler dh = new DataHandler(new FileDataSource(fileName));
call.setTargetEndpointAddress(new java.net.URL(endpoint));
                call.setOperationName(new QName(endpoint, "getFile"));
                QName qnameattachment = new QName("FileService", "DataHandler");
call.registerTypeMapping(dh.getClass(), qnameattachment,
                    JAFDataHandlerSerializerFactory.class,
                    JAFDataHandlerDeserializerFactory.class);
                    call.addParameter("s1", qnameattachment, ParameterMode.IN);
call.setReturnType(new QName("FileService", "DataHandler"),
                    DataHandler.class);
                DataHandler ret = (DataHandler) call
                    .invoke(new Object[] { fileName });
                ins = new InputStreamReader(ret.getInputStream());
                br = new BufferedReader(ins);
                File dir = new File("DownLoadFile");
                if (!dir.exists()) {
                    dir.mkdir();
                    // logger.debug("下载文件存放目录不存在,创建 【"+dir.getAbsolutePath()+" 】目录");
                }
                File f = new File(dir, fileName + "_reply");
                fw = new FileWriter(f);
                String tmp = br.readLine();
                while (tmp != null) {
                    fw.write(tmp + "/n");
                    tmp = br.readLine();
                }
            } catch (Exception e) {
// logger.error("调用文件下载Web服务出错:" + e.getMessage());
                return false;
            } finally {
                try {
                    br.close();
                    ins.close();
                    fw.close();
                    } catch (Exception ee) {
                }
            }
            return false;
            }
            /*
         public   static   void   main(String[]   args)  
         {  
         try  
         {  
         Service   service   =   new   Service();  
         Call   call   =   (Call)   service.createCall();  
     call.setTargetEndpointAddress(   "http://localhost:5200/axis_sample/services/FileService"   );  
        call.setOperationName(   "getFile"   );  
            QName   qnameAttachment   =   new   QName("TransFile","DataHandler");  
       call.registerTypeMapping(DataHandler.class,   qnameAttachment,                                                                    
     
          JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class);    
     call.addParameter("a",   XMLType.XSD_STRING   ,ParameterMode.IN);  
     call.setReturnType(XMLType.SOAP_ARRAY);  
     javax.activation.DataHandler[]   ret   =   (javax.activation.DataHandler[])call.invoke(new    
     
     Object[]{"lishu"});      
     for   (int   i   =   0;   i   <   ret.length;   i++)  
     {  
     DataHandler   recDH   =   ret[i];  
     System.out.println(recDH.getName());
     java.io.File   receivedFile   =   new   java.io.File("D://"+recDH.getName());//文件生成  
     }  
     }    
     catch   (Exception   ex)  
     {  
     ex.printStackTrace();  
     }  
     }   */
}
Axis总结
    Axis做为soap4j的下一代开源框架,它提供了支持java SOAP服务器的API,但是Axis在配置文件和部署服务上都是比较繁琐的,在服务器性能方面Axis的性能没有用XFire部署的服务性能要高,但是Axis在发布客户端代码时比XFire要方便,因为Axis可以不需要服务端生成的接口和类便可以调用服务端程序,但是XFire需要服务端的程序或者服务端生成的客户端程序。虽然Axis没有比较全面的文档,但是Axis的接口还是比较简单的,可以进行简单的一次开发,对于部署,Axis配置文件虽然繁琐,但是都是XML文件的形式表达的,所以对于修改Axis文件还是比较简单的,之所以Axis的用户比XFire的用户要多,可能是Axis都是面向XML进行部署的,而其他的web service开源软件都是面向类和接口去部署,这点是Axis的部署和其他不同点,对于服务的兼容性Axis的支持性远远比其他的开源框架要多,在性能方面虽然Axis不足于XFire,但是Axis的性能还是比较可靠的。在兼容性方面Axis可以很好的和其他的web开发语言融合,而XFire只能支持有jdk1.5的环境,对于这点Axis无需jdk1.5的要求,所以说在这点,Axis领先于XFire。对于任何一个开发者不管你是开发web service还是开发web project,Axis都比较适用。

阿翔编程学-Axis相关推荐

  1. 阿翔编程学-Axis日志服务类

    阿翔编程学-Axis日志服务类 //=========================================================== //日志服务类程序 author:曹翔 // ...

  2. 阿翔编程学-Axis传递Pojo对象

    Axis传递Pojo对象 (1)编写服务器端Java程序 //=========================================================== //传递Java对 ...

  3. 阿翔编程学-Java杂文

    Java基础:类,对象,注释,数据类型,成员变量,成员函数,运算符,控制语句,继承,多态,父类,子类,方法重载,方法覆盖,访问控制,包,静态变量,静态方法,抽象类,接口,线程.     J2EE开发: ...

  4. 阿翔编程学-Lucene入门与使用

    Lucene入门与使用 本文主要面向具体使用,适用于已熟悉java编程的lucene初学者. 1. Lucene的简介 1.1 Lucene 历史 org.apache.lucene包是纯java语言 ...

  5. 阿翔编程学-XFire

    XFire篇 XFire简介     它拥有一个轻量级的信息处理模块,通过STAX来与SOAP信息相结合.提供了一个工作在web services下的简单API,支持POJO和schema开发.XFi ...

  6. 阿翔编程学-WebService介绍及使用

    Web Service详细解析及使用方法 XFire篇 XFire简介 XFire 是 codehaus推出的下一代的 java SOAP框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是 ...

  7. 阿翔编程学-计算机网络安全知识摘要

    1.什么是计算机网络? 简单地说,计算机网络是由两台以上计算机连在一起组成的"计算机群",再加上相应"通信设施"而组成的综合系统. 2.资源共享 我们都已经知道 ...

  8. 阿翔编程学-整理一些Javascript代码

    1.  οncοntextmenu="window.event.returnValue=false"      将彻底屏蔽鼠标右键      <table border οn ...

  9. 阿翔编程学-Castor

    代码如下: package com.windtec.offline.server.service.gongan; import java.io.File; import java.io.FileNot ...

最新文章

  1. sas数据集怎么导出_利用SAS中的ODS导出程序结果数据集
  2. ngix莫名挂掉 signal process started
  3. jackson/fastJson boolean类型问题
  4. JavaScript-操作BOM对象
  5. Web.config中创建自定义配置节
  6. 国内市场上 Android 手机屏幕分辨率的比例情况如何?
  7. r矢量球坐标系旋度_6矢量分析:旋度、散度、梯度.ppt
  8. tp6 使用workerman
  9. 基于百度AI开放平台及图灵机器人搭建的聊天机器人
  10. messagebox 确认 取消
  11. Golang中log日志包的使用
  12. 蓝绿部署、滚动部署、灰度部署、金丝雀部署
  13. 第05章 Go语言函数(Go语言func)
  14. 系统降级熔断限流和排队
  15. 网络故障诊断的原则[转自www.cnitblog.com/wildon]
  16. 张栋博士计算机,计算机科学与技术学院
  17. 头歌--Java入门 - 方法的使用
  18. Effective C++读书摘要--Accustoming Youself to C++
  19. ansible填坑记一,UNREACHABLE
  20. 真的能月入过万,长期稳定操作-steam搬砖项目

热门文章

  1. 【MPP数据库Doris】docker容器编译doris数据库 sh build.sh指令 报Fatal错误
  2. Remove special file to special folder
  3. TIOBE 8 月编程语言排行榜:没有一门语言能比得上 Python
  4. lnnoDB:Attempted to open a previously opened tablespace. Previous tablespace mysql/innodb_index_stat
  5. Android实战简易教程-第五十枪(工具类的测试)
  6. vue+elementUi+dialog封装自定dialog部分属性,并打包成插件、npm install mj-dialog --save、display、justify、between
  7. 机器学习-白板推导系列笔记(二十八)-BM
  8. Pytorch之Bert文本分类(一)
  9. java生成db文件
  10. c++调用偏僻数据库db2