axis 订阅
axis全称Apache Extensible Interaction System 即阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。但Axis并不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎(例如Tomcat)的服务器。 展开全文
axis全称Apache Extensible Interaction System 即阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。但Axis并不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎(例如Tomcat)的服务器。
信息
简    称
axis
本    质
SOAP引擎
软件领域
支持WSDL
中文名
阿帕奇可扩展交互系统
属    性
提供转化WSDL为Java类的工具
外文名
Apache EXtensible Interaction System
axis简介
支持WSDL。1提供转化WSDL为Java类的工具。2提供例子程序。3提供TCP/IP数据包监视工具。 Axis是第三代Apache SOAP,从2000年起,SOAP v2开发小组开始讨论如何让Axis更加灵活、可配置,以及能够处理SOAP和来自W3C的各种XML标准。通过不断地讨论和代码编写,Axis目前取得了如下成果:速度提高。 Axis通过基于事件的SAX对XML文档进行处理,从而在速度和效率上比Apache SOAP有所提高。灵活性提高。稳定性提高。提供面向组件的部署。提供一个简洁的传输抽象框架。其核心引擎完全与传输方式独立。从而使基于何种协议传输的选择更加灵活。支持WSDL。包括导出WSDL和客户代理生成等。在目前发行1.1版本中有什么东西?SOAP1.1/1.2引擎。灵活的配置和部署系统。支持及时自动生成SOAP服务(JWS)。支持所有的基本数据类型,为自定义序列化操作提供类型映射系统。JavaBean的序列化操作,包括将自定义属性类型映射到XML的属性和元素。RPC和基于消息的SOAP服务提供者。为部署好的服务自动生成WSDL。WSDL2Java工具可以从WSDL描述文件中产生相应的客户和服务器端SOAP操作框架。初步提供安全扩展,能够与Servlet2.2安全集成。通过HTTP Cookie和与传输无关的SOAP头信息提供会话跟踪。初步支持带附件的SOAP消息。在EJB方面提供把EJB作为Web服务的访问途经。基于Servlet的HTTP传输。基于JMS的传输。独立的服务器(但需要HTTP 服务器和Servlet容器支持)。提供客户端、服务器端相关应用程序的样例。
收起全文
精华内容
参与话题
问答
  • AXIS

    千次阅读 2007-04-11 09:56:00
    WebService开发工具AXIS指南 本文档是开源文档,你可以自由使用和传播! 1 介绍 Axis(Apache eXtensible Interaction System)是一款开源的WebService运行引擎,它是SOAP协议的一个实现,其本身来源于Apache的另...

     

     

    WebService开发工具AXIS指南

     

     

    本文档是开源文档,你可以自由使用和传播!

     

     1       介绍

     

    AxisApache eXtensible Interaction System)是一款开源的WebService运行引擎,它是SOAP协议的一个实现,其本身来源于Apache的另一个项目Apache SOAP Axis分为1.x系列和Axis 2系列,两个系列体系结构和使用上有较大的区别,相对而言,Axis1.x更加稳定,文档也比较齐全,因此本文内容以Axis 1.x系列最新版本1.4为基础,AxisC++Java两个版本的实现,本文描述Java版的Axis

     

    采用Axis实现WebService时,只需要POJO即可,不要求实现特定的接口或继承特定的父类,不必为提高效率而购买专门的开发工具,在Eclipse中开发不需要添加任何插件。

     

    Axis对运行环境的要求是只要支持Servlet2.3或以上即可,目前主要的应用服务器都可运行Axis,如TomcatJBossWebsphereWebLogicJetty。并且Axis可以很容易和应用程序整合在一个Web应用中,将应用程序的功能展示为 WebService

     

    此外,Axis的另一个好处就是不用和某个应用服务器绑定在一起,具有很好的可移植性,除配置文件可能要作小的修改外,服务的实现代码不需要做任何修改。

     

    Axis官方网站为 http://ws.apache.org/axis

     

     

    2       环境配置

    本文例子代码运行环境要求如下:

    Windows XP SP2 中文版,JDK1.4或以上,Apache Axis1.4Tomcat 4.1或其他任何支持Servlet2.3的应用服务器,本文以Tomcat 4.1为例,Java开发工具为 Eclipse3.1

     

    如果还没有安装JDK http://java.sun.com/javase下载并安装到本地硬盘,以下用JAVA_HOME表示JDK安装在本地的路径。

     

    http://ws.apache.org/axis 下载Axis1.4,安装包是一个压缩文件,不用安装程序,直接解压到本地硬盘即可。以下用AXIS_HOME表示axis解压到本地的路径。

     

    http://tomcat.apache.org下载 Tomcat 4.1安装包,按Tomcat安装指南安装到本地,以下用TOMCAT_HOME表示Tomcat安装在本地的路径。安装完成后验证安装正确,缺省情况下输入http://localhost:8080可进入Tomcat页面。

     

    下面在Tomcat中增加一个Web应用,并为其增对Axis支持:

    TOMCAT_HOME/webapps下创建一个新目录myservices,然后将AXIS_HOME/webapps/axis目录下的文件和子目录都复制到myservices目录下。并将AXIS_HOME/lib/axis-ant.jar 也复制到myservices/WEB-INF/lib目录下,该jar文件提供对ant脚本的支持。

     

    启动Tomcat,然后在浏览器中输入http://localhost:8080/myservices,如果能显示下面的页面,则表示axis已成功安装到myservices应用中,下面创建的WebService都在该应用中运行。

     

     

    进一步点击 Validation 可以显示运行环境信息,点击 List 可以列出Axis自带的两个WebService 以后增加的WebService也显示在这里。

     

    以下代码在Eclipse中开发,为此在 Eclipse创建一个java项目,名称为axis-guide,并将Axis的包加到项目的java build path中,如下图所示:Axis这些包位于Web引用myservicesWEB-INF/lib目录下。


     

    3       第一个WebService

    3.1    服务端

    准备好运行环境后,下面就开始开发WebService,该WebService名为EchoService,有一个方法echo,获得一个输入信息后,加入附加信息返回给调用者。原代码如下:

    EchoService.java

     

    package chen.axisguide.ch3;

     

    public class EchoService {

          

           public String echo(String msg) {

     

                  return "your input message is " + msg;

           }

    }

     

     

    可以看到该类是一个POJO,不需要其他任何附加说明来表明其是一个WebService实现。

     

    为了让 Axis能识别服务,需要为服务提供一个描述文件,通常文件名为deploy.wsdd,因为该文件用于将服务部署到Axis引擎所在的Web应用中。deploy.wsdd文件格式为xml格式,EchoServicedeploy.wsdd内容如下:

     

     

    <deployment xmlns="http://xml.apache.org/axis/wsdd/"

                xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

               

        <service name="EchoService" provider="java:RPC" >

           <parameter name="className" value="chen.axisguide.ch3.EchoService" />

           <parameter name="allowedMethods" value="*" />

        </service>

     

    </deployment>

     

     

    service节点的name属性定义服务的名字,在客户端访问时会用到该名字,provider中定义WebService的提供方式为RPC

    第一个parameter用来描述服务实现类的类名,包括包名。第二个parameter参数描述类中哪些方法可以暴露为WebService方法,这里用*表示全部方法。

     

    如果要卸载一个已部署的WebService,需要提供一个卸载描述文件,用Axis提供的工具读取该文件来卸载已部署的WebService 上述deploy.wsdd对应的卸载文件为undeploy.wsdd,内容如下:

     

     

    <undeployment xmlns="http://xml.apache.org/axis/wsdd/"

                xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

               

        <service name="EchoService"/>

       

    </undeployment>

     

     

    deploy.wsddundeploy.wsdd和原代码EchoService.java位于同一个目录中。

     

    在项目axis-guide的根目录下创建一个Antbuild.xml来执行编译和部署任务。目录结构如下图所示:

     

     

    build.xml内容如下:

     

    <?xml version="1.0" encoding="utf-8"?>

    <project name="myservice" default="deployws">

           <!-- If your Tomcat installation folder is another , replace below with yourself -->

           <property name="web.home" location="C:/Tomcat4.1/webapps/myservices" />

           <property name="webclass.dir" location="${web.home}/WEB-INF/classes" />

           <property name="weblib.dir" location="${web.home}/WEB-INF/lib" />

           <property name="src.dir" location="src" />

          

           <path id="lib.class.path">

                         <fileset dir="${weblib.dir}">

                                <include name="**/*.jar"/>

                         </fileset>

                 

           </path>

          

           <taskdef name="axis-admin" classname="org.apache.axis.tools.ant.axis.AdminClientTask">

                          <classpath refid="lib.class.path"/>

           </taskdef>

          

          

           <target name="compile">

                  <javac srcdir="${src.dir}" destdir="${webclass.dir}" source="1.4" compiler="javac1.4" debug="on">

                         <classpath>

                                 <path refid="lib.class.path"/>

                         </classpath>

                         <exclude name="**/*Test.java" />

                  </javac>

           </target>

          

           <target name="deployws" depends="compile">

                  <axis-admin url="http://localhost:8080/myservices/servlet/AxisServlet"

                         xmlfile="${src.dir}/chen/axisguide/ch3/deploy.wsdd"/>

                 

           </target>

          

           <target name="undeployws">

                  <axis-admin url="http://localhost:8080/myservices/servlet/AxisServlet"

                         xmlfile="${src.dir}/chen/axisguide/ch3/undeploy.wsdd"/>

           </target>

          

    </project>

     

     

    task-def定义了一个名为axis-admin的任务,该任务负责根据deploy.wsddundeploy.wsdd来部署或卸载WebService。此任务的实现类org.apache.axis.tools.ant.axis.AdminClientTask位于axis-ant.jar文件中。

     

    服务实现类原代码编译后的.class文件放在myservices/WEB-INF/classes目录下,在build.xmlcompile任务中实现。

     

    Eclipse环境中用Ant运行该build.xml,执行成功后在浏览器中输入http://localhost:8080/myservices/servlet/AxisServlet,可以看到如下的页面,表示EchoService已部署成功。

     

     

     

    3.2    客户端

    WebService部署成功后,下面开发客户端去调用WebService的方法,打印返回结果。

     

    Client.java

     

    package chen.axisguide.ch3;

     

    import java.rmi.RemoteException;

     

    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;

     

     

    /**

     * 访问EchoService的客户端

     *

     *

     */

    public class Client {

     

           /**

            * @param args

            * @throws ServiceException

            * @throws RemoteException

            */

           public static void main(String[] args) throws ServiceException, RemoteException {

                  // wsdladdress 节点的location属性

                  String endpoint = "http://localhost:8080/myservices/services/EchoService";

                  // 要调用的方法名

                  String method = "echo";

                 

                  Service service = new Service();

                  Call call = (Call) service.createCall();

                  // 设置客户端访问的远程端点

                  call.setTargetEndpointAddress(endpoint);

                  // 设置输入参数类型

                  call.addParameter("p1",XMLType.XSD_STRING,ParameterMode.IN);

                  // 设置返回值类型

                  call.setReturnType(XMLType.XSD_STRING);

                 

                  // 输入参数值

                  String msg = "call from java";

                  // 调用远程方法

                  String result = (String)call.invoke(method,new Object[]{msg});

                 

                  System.out.println(result);

     

           }

          

    }

     

    确认Tomcat已启动,在Eclipse环境中运行Client,如果没有错误,在控制台将会打印从EchoServiceecho方法获得的结果。

     

    客户端访问WebService的主要步骤包括:

    l         创建Call对象,设置WebService的访问端点;

    l         注册序列化和反序列对象,详见下节;

    l         设置访问方法的参数类型以及返回值类型;

    l         初始化参数值;

    l         调用WebService的方法,获得返回结果。

     

    JAX-RPC规范中定义了三种访问服务端的方法:

    1.         在客户端生成远程服务端的静态代理文件,编译后提供给客户端访问服务使用,Axis提供了工具可根据服务的wsdl生成静态代理文件。但这种方法会在客户端增加若干附加文件,服务端接口发生变化时需要重新在客户端生成文件。

    2.         根据服务端接口文件访问服务。这种方法要求服务实现一个接口,并且该接口要从java.rmi.Remote扩展,客户端通过获得该接口的代理来访问服务。这种方法需要在客户端保存一个服务的接口文件。

    3.         动态调用接口。客户端只须通过服务端口、访问方法名和参数类型即可访问服务的方法。访问方式类似于用反射来调用类方法。这种方法的客户端和服务端的耦合度比前两种要低,上面Cilent.java用的就是这种方法。 后面的例子也都采用这种方式访问服务端。

     

    4       序列化

    Axis中客户端和服务器端之间的消息使用SOAP封装,java程序中的数据需要序列化后保存在XML文档中通过网络传输到接收方,接收方从XML文档中反序列化为java虚拟机可识别的数据对象。对java基本类型,Axis提供了默认的序列化和反序列化功能,不需要特别申明即可使用。对自定义类型,如果是JavaBean,则可用beanMappingwsdd文件中申明该类型所需要的序列化和反序列化器即可。Axis已自带JavaBean的序列化和反序列化功能。 如果Axis自带的序列化和反序列化器不能对自定义对象进行序列化处理,你可以自定义序列化和反序列化器,然后用typeMapppingwsdd文件中申明即可。

    Axis中, xml数据类型和java类型之间的映射关系如下:

    XML类型

    java类型

    xsd:base64Binary

    byte[]

    xsd:boolean

    boolean

    xsd:byte

    byte

    xsd:date

    java.util.Date

    xsd:dateTime

    java.util.Calendar

    xsd:decimal

    java.math.BigDecimal

    xsd:double

    double

    xsd:float

    float

    xsd:hexBinary

    byte[]

    xsd:int

    int

    xsd:integer

    java.math.BigInteger

    xsd:long

    long

    xsd:QName

    javax.xml.namespace.QName

    xsd:short

    short

    xsd:string

    java.lang.String

     

    下面的例子中服务器端向客户端返回一个列表,列表中包含自定义的Book对象。

    服务实现代码如下:因为只是说明对象的序列化方式,因此就直接创建对象放入列表对象中,没有从数据库中搜索数据。

    LibraryService.java :对象序列化服务端代码

     

    package chen.axisguide.ch4;

     

    import java.util.ArrayList;

    import java.util.List;

     

    public class LibraryService {

          

           // 返回一个包含Book对象的列表

           public List query(String keyword) {

     

                 

                  Book book1 = new Book();

                  book1.setAuthor("Jack Johnson");

                  book1.setContent("about java development.");

                  book1.setIsbn("123-456-789");

                  book1.setName("Java deplopment handbook");

                 

                  Book book2 = new Book();

                  book2.setAuthor("Kim Kent");

                  book2.setContent("about ruby development.");

                  book2.setIsbn("123-654-897");

                  book2.setName("ruby deplopment handbook");

                 

                  List res = new ArrayList();

                  res.add(book1);

                  res.add(book2);

                 

                  return res;

                 

           }

    }

     

    服务端代码中不需要对序列化做特殊处理。

     

    Book的定义如下:

    Book.java

     

    package chen.axisguide.ch4;

     

    public class Book {

           private String isbn;

           private String name;

           private String author;

           private String content;

          

           public String getAuthor() {

                  return author;

           }

           public void setAuthor(String author) {

                  this.author = author;

           }

           public String getContent() {

                  return content;

           }

           public void setContent(String content) {

                  this.content = content;

           }

           public String getIsbn() {

                  return isbn;

           }

           public void setIsbn(String isbn) {

                  this.isbn = isbn;

           }

           public String getName() {

                  return name;

           }

           public void setName(String name) {

                  this.name = name;

           }

          

          

    }

     

     

     

    序列化的处理在服务部署文件中定义:

    deploy.wsdd LibraryService描述文件

     

    <deployment xmlns="http://xml.apache.org/axis/wsdd/"

                xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

               

        <service name="LibraryService" provider="java:RPC" >

           <parameter name="className" value="chen.axisguide.ch4.LibraryService" />

           <parameter name="allowedMethods" value="*" />

                     

           <beanMapping qname="myNS:Book" xmlns:myNS="LibraryService" languageSpecificType="java:chen.axisguide.ch4.Book"/>

        </service>

     

    </deployment>

     

     

    beanMapping节点定义了Book对象的序列化和反序列化使用Axis自带的针对JavaBean的序列化和反序列化器来实现。

    其中,xmlns定义命名空间为LibraryService,和服务同名,qname定义为命名空间myNS中的Book,与被序列化的类名相同,这种命名方式可使处理的对象一目了然。当然也可命名为其他名字。

     

    下面看一下客户端代码中对序列化的处理。

    Cilent.java :访问LibraryService客户端代码。

     

    package chen.axisguide.ch4;

     

    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;

     

    /**

     * 访问LibraryService的客户端

     *

     *

     */

    public class Client {

     

           /**

            * @param args

            * @throws ServiceException

            * @throws RemoteException

            */

           public static void main(String[] args) throws ServiceException, RemoteException {

                  // wsdladdress 节点的location属性

                  String endpoint = "http://localhost:8080/myservices/services/LibraryService";

                  // 要调用的方法名

                  String method = "query";

                 

                  Service service = new Service();

                  Call call = (Call) service.createCall();

                  // 设置客户端访问的远程端点

                  call.setTargetEndpointAddress(endpoint);

                 

                  QName qn = new QName("LibraryService","Book");

               call.registerTypeMapping(Book.class, qn,

                                 new org.apache.axis.encoding.ser.BeanSerializerFactory(Book.class, qn),       

                                 new org.apache.axis.encoding.ser.BeanDeserializerFactory(Book.class, qn));

                  

                 

                  // 设置输入参数类型

                  call.addParameter("p1",XMLType.XSD_STRING,ParameterMode.IN);

                  // 设置返回值类型

                  call.setReturnType(XMLType.XSD_ANYTYPE);

                 

                  // 输入参数值

                  String msg = "key word";

                  // 调用远程方法

                  Object[] result = (Object[])call.invoke(method,new Object[]{msg});

                 

                  for(int i = 0; i < result.length; i++) {

                         Book bk = (Book)result[i];

                         System.out.println("ISBN: " + bk.getIsbn() + " Book Name: " + bk.getName());

                  }

     

           }

          

    }

     

    在客户端,首先为Book定义一个QName对象,构造函数中的第一个参数值要和wsddbeanMapping节点的xmlns:myNS属性值相同,第二个参数值要和beanMappingqname属性值相同。然后在Call对象中注册自定义类型所用的序列化和反序列化器。通过以下语句来实现:

    call.registerTypeMapping(Book.class, qn,

                                 new org.apache.axis.encoding.ser.BeanSerializerFactory(Book.class, qn),       

                                 new org.apache.axis.encoding.ser.BeanDeserializerFactory(Book.class, qn));

     

     

    最后在build.xml中增加对deploy.wsdd文件的部署。内容如下:

     

     

    <target name="deployws" depends="compile">

                  <axis-admin url="http://localhost:8080/myservices/servlet/AxisServlet"

                                       xmlfile="${src.dir}/chen/axisguide/ch4/deploy.wsdd"/>

                 

    </target>

     

     

    5       处理器(Handler)

    Axis引擎在处理消息过程中,可以自定义处理器对请求或响应的消息进行拦截处理,处理器的动作对服务的实现部分透明。这种机制可以将日志、安全检查、加密解密等与业务无关的操作抽取出来单独处理,降低模块间的依赖关系。

     

    自定义处理器时从org.apache.axis.handlers.BasicHandler继承,在方法invoke(MessageContext msgContext)进行拦截处理。消息等运行环境信息可以从msgContext得到。

     

    自定义处理器要发挥作用,需要在wsdd文件中进行说明,方法如下:

    1-    <handler name=”handlername” type=”java:classname”> 定义处理器,如果要给处理器传递参数,可在<handler>下用<parameter name=”name” value=”value” />进行说明。 之后在自定义处理器类代码中用getOption(“name”)可得到value的值。

    2-    <service>中用<requestFlow><responseFlow>定义在请求消息流或返回消息流中要调用的处理器。如果有多个处理器,则按其在 <requestFlow><responseFlow>中排列顺序依次调用。格式如下:

    <service>

           <requestFlow>

                  <handler type=”handlername” />

           </requestFlow>

    </service>

     

     

    下面的例子中服务器端和客户端代码使用第3节的代码,在请求消息流中增加两个处理器,第一个处理器在控制台打印出SOAP包的body内容,然后在MessageContext中设置一个属性值;第二个处理器从MessageContext中取出第一个处理器设置的属性值,在控制台打印出来。

     

    第一个处理器原代码如下:

    FirstHandler.java

    package chen.axisguide.ch5;

     

    import javax.xml.soap.SOAPException;

     

    import org.apache.axis.AxisFault;

    import org.apache.axis.Message;

    import org.apache.axis.MessageContext;

    import org.apache.axis.handlers.BasicHandler;

    import org.apache.axis.message.SOAPBody;

     

    public class FirstHandler extends BasicHandler {

     

           public void invoke(MessageContext msgContext) throws AxisFault {

                 

                  Message reqMsg = msgContext.getRequestMessage();

                 

                  try {

                         SOAPBody reqBody = (SOAPBody) reqMsg.getSOAPBody();

                         System.out.println("===================================");

                         System.out.println("request SOAP body " + reqBody.getAsString());

                         System.out.println("===================================");

                         // 设置属性传递到下一个handler

                         msgContext.setProperty("handler1","handler1 processed");

                        

                  } catch (SOAPException e) {

                        

                         e.printStackTrace();

                  } catch (Exception e) {

                        

                         e.printStackTrace();

                  }

                 

           }

     

    }

     

     

     

    第二个处理器原代码:

    SecondHandler.java

     

    package chen.axisguide.ch5;

     

    import org.apache.axis.AxisFault;

    import org.apache.axis.MessageContext;

    import org.apache.axis.handlers.BasicHandler;

     

    public class SecondHandler extends BasicHandler {

     

           public void invoke(MessageContext msgContext) throws AxisFault {

                 

                  System.out.println("Get data from previous handler : " + msgContext.getProperty("handler1"));

     

           }

     

    }

     

     

     

    wsdd文件内容如下:

    deploy.wsdd

     

    <deployment xmlns="http://xml.apache.org/axis/wsdd/"

                xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

        <handler name="handler1" type="java:chen.axisguide.ch5.FirstHandler" />

        <handler name="handler2" type="java:chen.axisguide.ch5.SecondHandler" />

              

        <service name="EchoService" provider="java:RPC" >

           <parameter name="className" value="chen.axisguide.ch5.EchoService" />

           <parameter name="allowedMethods" value="*" />

           <requestFlow>

               <handler type="handler1" />

               <handler type="handler2" />

           </requestFlow>

        </service>

       

    </deployment>

     

     

    build.xml中增加对deploy.wsdd文件的部署处理。内容如下:

     

    <target name="deployws" depends="compile">

                  <axis-admin url="http://localhost:8080/myservices/servlet/AxisServlet"

                                                     xmlfile="${src.dir}/chen/axisguide/ch5/deploy.wsdd"/>

    </target>

     

     

    服务端和客户端原代码和第3节相同,不再列出。

    Eclipse中用Ant运行build.xml,在Tomcat中重新载入Web应用,然后在Eclipse中运行Client.java,在Tomcat的控制台将会打印出SOAP body信息以及handler1属性值。


     

    6       访问控制

    开发好WebService并向外暴露服务后,由于WebService访问协议都是公开的,客户端只要知道服务的wsdl,就可以访问WebService中的方法。为防止非法的访问,可以要求客户端访问WebService时提供用户名和口令,只有在服务端通过身份认证后才可继续访问方法,否则请求被拒绝。

    下面看一下Axis中如何使用用户名、口令来控制对WebService 的访问。

    myservices/WEB-INF下创建一个名为users.lst的文本文件,一行表示一对用户名、口令,之间用空格分隔,内容如下:

    user1 password1

    user2 password2

     

    实现一个WebService,它有一个foo()方法,该方法打印出通过身份认证的用户的用户名,代码如下:

    SecurityService.java

     

    package chen.axisguide.ch6;

     

    import org.apache.axis.MessageContext;

     

    public class SecurityService {

           public void foo() {

                 

                  MessageContext msgContext = MessageContext.getCurrentContext();

                  System.out.println("你已通过身份认证!");

                  System.out.println("你的用户名: " + msgContext.getUsername());

                 

           }

    }

     

     

    为了让 Axis知晓要对该服务的访问验证用户名和口令,需要在wsdd文件中增加一个Axis自带的处理器SimpleAuthenticationHandler,该处理器会从MessageContext中取出用户名和口令,并与users.lst中的用户名和口令进行比对,如果匹配,则通过验证,继续后面的处理,否则抛出(401)Unauthorized异常。

    deploy.wsdd

     

    <deployment xmlns="http://xml.apache.org/axis/wsdd/"

                xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

               

        <service name="SecurityService" provider="java:RPC" >

           <parameter name="className" value="chen.axisguide.ch6.SecurityService" />

           <parameter name="allowedMethods" value="*" />

           <requestFlow>

               <handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />

           </requestFlow>

        </service>

    </deployment>

     

     

     

    客户端在访问WebService时,需要在 Call对象中设置在users.lst文件中已有的用户名和对应的口令。客户端代码如下:

     

     

    package chen.axisguide.ch6;

     

    import java.rmi.RemoteException;

     

    import javax.xml.rpc.ServiceException;

     

    import org.apache.axis.AxisFault;

    import org.apache.axis.client.Call;

    import org.apache.axis.client.Service;

     

     

    /**

     * 访问SecurityService的客户端

     *

     *

     */

    public class Client {

     

           /**

            * @param args

            * @throws ServiceException

            * @throws RemoteException

            */

           public static void main(String[] args) throws ServiceException, RemoteException {

                  // wsdladdress 节点的location属性

                  String endpoint = "http://localhost:8080/myservices/services/SecurityService";

                  // 要调用的方法名

                  String method = "foo";

                 

                  Service service = new Service();

                  Call call = (Call) service.createCall();

                  // 设置客户端访问的远程端点

                  call.setTargetEndpointAddress(endpoint);

                  // 设置用户名和口令

                  call.setUsername("user1");

                  call.setPassword("password1");

          

                 

                  // 调用远程方法

                  try{

                         call.invoke(method,new Object[]{});

                  }catch(AxisFault e) {

                         System.err.println(e.getFaultString());

                  }

           }

     

    }

    Call对象用setUserName()setPassword()来设置用户名和口令。

    Axis自带的身份认证功能比较简单,如果其安全性不能满足应用系统的要求,可以自定义一个处理器替代SimpleAuthenticationHandler,在自定义处理器中采用其他的安全框架(如Acegi http://www.acegisecurity.org/)来保护你的WebService

     

    7       总结

    从上面的实例可以看出,Axis在开发WebService方面具有如下优势:

    l         轻量级:Axis本身只需要Servlet容器就可运行,因此能够在大多数轻量级的Web应用服务器上运行;另外在Axis中服务的实现类只要求是一个POJO,没有强制要求实现特定接口或从特定父类继承,这使得开发和测试非常容易,不需要为提高开发效率而购置重量级的IDE

     

    l         扩展性好:在Axis中,可以通过加入自定义处理器(Handler)方式来扩展Axis的功能,并且这种功能的增加对业务部分可以做到透明,即业务代码中不需要为使用增加的功能而修改代码。

     

    l         可移植性强:Axis可以在支持Servlet的容器中运行,运行于其中的WebService也就可以在现有的大多数的Web应用服务器上运行,不需要对服务的实现代码做任何的改动。

     

     
    展开全文
  • axis

    千次阅读 2012-04-26 16:11:28
     为了更多喜爱开发的程序员也能迅速了解Web Service的开发,我这里整理了一些通过Axis开发Web Service的一些要点,希望能让不熟悉Web Service的开发人员能够迅速掌握Web Service。  一、Ax

    原来以前的Web Service都是可以自动生成代码的,而且也不难,试了一个下午客户端和服务器端的Web Service代码就都调试通过了,真不错。

      为了更多喜爱开发的程序员也能迅速了解Web Service的开发,我这里整理了一些通过Axis开发Web Service的一些要点,希望能让不熟悉Web Service的开发人员能够迅速掌握Web Service。

      一、Axis环境的安装

      1、安装环境 J2SE SDK 1.4,Tomcat 5.0,eclipse 3.2。

      2、到 http://xml.apache.org 网站下载Axis安装包。

      3、将Axis相关包文件放在WEB-INF\lib目录下。

      4、Axis可选的包:activation.jar; mail.jar; xmlsec-1.4.Beta1.jar拷贝到WEB-INF目录下,生成客户端时候需要使用。

      Axis支持三种web service的部署和开发,分别为:

      1、Dynamic Invocation Interface (DII)

      2、Dynamic Proxy方式

      3、Stubs方式

      前两种方式我就不介绍了,同事告诉我他们自己都不使用前两种方式,他们建议我们使用Stubs方式,因此我就主要就介绍一下第三种方式。注意,我自己的Java源代码是放在D:\workspace\test\目录下,Axis相关包文件放在D:\workspace\test\WEB-INF目录下。

      二、编写wsdd发布web服务,编写stub client访问web服务

      1、编写服务端程序server,SayHello.java,编译server.SayHello.java

    package server;
    public class SayHello
    {
        public String getName(String name)
        {
            return "hello "+name;
        }
    }

      2、编写wsdd文件

      deploy.wsdd文件内容如下:

    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="SayHello" provider="java:RPC">
      <parameter name="className" value="server.SayHello.getName"/>
      <parameter name="allowedMethods" value="*"/>
    </service>
    </deployment>

      3、发布服务:

      编辑一个deploy.bat,Axis_Lib为axis.jar路径。内容如下:

    set Axis_Lib=D:\workspace\test\WEB-INF\lib
    set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
    set Axis_Servlet=http://localhost:8080/test/servlet/AxisServlet
    %Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% deploy.wsdd

      执行这个批处理文件,这时候,如果提示成功的话,访问http://localhost:8080/test/services 就会显示服务列表。

      4、生成客户端client stub文件

      在浏览器上访问服务器端的服务,可以下载到WSDL文件,通过Axis的相关工具,可以自动从WSDL文件中生成Web Service的客户端代码。

      编写一个WSDL2Java.bat文件,其内容如下:

    set Axis_Lib=D:\workspace\test\WEB-INF\lib
    set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
    set Output_Path=D:\workspace\test\src
    set Package=server.SayHello
    %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% SayHello.wsdl

      执行这个批处理文件就可以生成client stub.

      生成的stub client文件列表为:SayHello.java,SayHelloService.java,SayHelloServiceLocator.java,SayHelloSoapBindingStub.java .

      5、编写客户端程序,编译并执行

      下面是一段junit测试客户端代码。

    import java.net.URL;
    import junit.framework.Test;
    import junit.framework.TestCase;
    import junit.framework.TestSuite;

    public class TestWSClient extends TestCase {

        public TestWSClient(String string) {
            super(string);
        }

        public void SayHelloClient() throws Exception {

            SayHelloService service = new SayHelloServiceLocator();
            SayHello_PortType client = service.getSayHello() ;
            String retValue = client.getName("clientname");
            System.out.println(retValue);

        }

        public static Test suite() {
            TestSuite suite = new TestSuite();
            suite.addTest(new TestWSClient("SayHelloClient"));
            return suite;
        }
    }

      至此,整个服务器端和客户端的Web Service框架代码就完成了,剩下的就是在里面加入你的业务代码了,怎么样,Web Service并不难开发吧。

     

    转自:http://zheyiw.iteye.com/blog/712698

    展开全文
  • axis2所有的jar

    千次下载 热门讨论 2013-10-17 12:44:27
    axis.jar, axis2-adb-1.6.2.jar, axis2-kernel-1.6.2.jar, axis2-transport-http-1.6.1.jar, axis2-transport-local-1.6.1.jar, commons-codec-1.3.jar, commons-discovery.jar, commons-...
  • 成功解决IndexError: index 0 is out of bounds for axis 1 with size 0 目录 解决问题 解决思路 解决方法 解决问题 IndexError: index 0 is out of bounds for axis 1 with size 0 解决思路 ...

    成功解决IndexError: index 0 is out of bounds for axis 1 with size 0

     

    目录

    解决问题

    解决思路

    解决方法


     

     

    解决问题

    IndexError: index 0 is out of bounds for axis 1 with size 0

     

     

     

    解决思路

    查看列表,输出列表内容,查看列表的形状,发现列表的确是空值,所以修改列表内容即可!

    print(list.shape)

     

     

     

    解决方法

    y = train_np[:, 0]
    
    print(train_np)  
    
    
    #修改列表的内容使其不为空列表即可!

    大功告成!哈哈!

    展开全文
  • 我的项目现在是用的AXIS1的环境但是想调用AXIS2的服务端.我用的RPC的方式.每次调用都会报出org.apache.axis2.AxisFault: String index out of range: -12的错误.在纯AXIS2的环境下是可以的.我的代码如下 import ...
  • Matlab axis函数应用简介

    千次阅读 2019-04-26 19:13:51
    axis 用于操作普通的坐标属性,(轴的缩放和外观)。 axis( [xmin xmax ymin ymax] ) 设置当前坐标轴 x轴 和 y轴的限制范围 axis( [xmin xmax ymin ymax zmin zmax cmin cmax] ) 设置 x,y,z轴的限制范围和色差范围...

     

    axis    用于操作普通的坐标属性,(轴的缩放和外观)。

    axis( [xmin xmax ymin ymax] )    设置当前坐标轴 x轴 和 y轴的限制范围

    axis( [xmin xmax ymin ymax zmin zmax cmin cmax] ) 设置 x,y,z轴的限制范围和色差范围。
    v = axis 返回一个行向量,记录了坐标范围

    axis auto 解除限制,恢复到默认状态

    例程:画一个tan函数从0到2π。
    >> x=0:0.01:pi/2;
    >> y=tan(x);
    >> figure
    >> plot(x,y,'-o')


    >> axis([0,pi/2,0,5])    % 改变坐标轴范围


    >> v = axis    % 返回坐标轴的范围
    v =    0    1.5708         0    5.0000

     

    例程:画坐标 (需要使用arrow3函数,上网下载即可)
     

    close all
    figure
    axis([0 4 0 5 0 6])    % 画出三维图
    hold on
    addpath(genpath(pwd))    % 用于扫描子目录
    arrow3([0 0 0],[4 0 0],'g')
    %警告: Stretch-to-fill scaling not supported;
    %use DASPECT or PBASPECT before calling ARROW3. 
    In arrow3 at 397 
    arrow3([0 0 0],[0 5 0],'r')
    arrow3([0 0 0],[0 0 6],'e')
    hold on 
    arrow3([0 0 0],[3 2 4], 'b')  % 画出向量线
    hold on
    text(0.2,0.2,0,'O')    % 添加坐标原点名称
    text(3,0,0,'X')
    text(0,3,0,'Y')
    text(0,0,3,'Z')
    hold on
    arrow3([3 2 4],[3.8 2 4])    % 方向轴
    text(4,2,4,'x1')
    arrow3([3 2 4],[3 2.8 4])
    text(3,3,4,'y1')
    arrow3([3 2 4],[3 2 4.8])
    text(3,2,5,'z1')
    hold on
    set(gca,'XDir','reverse')  %  对 X 轴方向反转


                                                

    扫码关注本人微信公众号,有惊喜奥!公众号每天定时发送精致文章!回复关键词可获得海量各类编程开发学习资料!

    例如:想获得Python入门至精通学习资料,请回复关键词Python即可。

     

    展开全文
  • pthon代码出现如下问题,不知道是何原因?谢谢!!! runfile('D:/Python project/3Olive-lda2vec-master/examples/twenty_newsgroups/data/...AxisError: axis -1 is out of bounds for array of dimension 0
  • Axis2-1.6.2

    千次下载 热门讨论 2012-09-17 17:40:49
    Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。是开发web service强大是工具软件。安装方法可参照博客“Axis2下载与安装”。
  • at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache....
  • 我实现别人的一个ws接口,用axis2实现的,报一个这个错! org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement result at org.apache.axis2.AxisFault.makeFault...
  • axis2在调用的时候报这个错,本地环境没问题,发布到linux时就出问题了 Exception in thread "main" org.apache.axis2.AxisFault: Dangling meta character '?' near index 0 ? ^ at org.apache.axis2.util.Utils....
  • at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache....
  • java org.apache.axis.wsdl.WSDL2Java -u http://xxxxxx?wsdl -p com.webservice.wsdl -t -u 要访问的webservice的地址标准的wsdl文件 -p 生成java文件的包名 -t 生成的java文件中包含junit的测试代码。 详见...
  • axis1.3 axis1.4jar包

    热门讨论 2009-11-07 13:46:07
    java webservice开发 axis开发webservice程序,axis1.3和axis1.4 jar包。
  • Matlab中axis函数用法总结

    万次阅读 多人点赞 2019-02-22 10:58:18
    axis主要是用来对坐标轴进行一定的缩放操作,其操作命令主要如下: 1、axis( [xmin xmax ymin ymax] )设置当前坐标轴 x轴 和 y轴的限制范围 2、axis( [xmin xmax ymin ymax zmin zmax cmin cmax] ) 设置 x,y,z轴的...
  • axis初步

    千次阅读 2008-06-11 20:08:00
    developerWorks 中国 > SOA and Web services > 应用 AXIS 开始 Web 服务之旅
  • at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:95) at org.apache.axis2.transport.http.AxisServlet.initConfigContext(AxisServlet....
  • MyEclipse 8.5 Axis2 插件完整jar包

    热门讨论 2012-07-27 13:02:27
    MyEclipse 8.5 安装 Axis2 插件所需的完整JAR包 两个axis2插件,以及三个javax.xml jar包 将jar包拷贝到{%myEclipse8.5安装目录%}\dropins文件夹下即可 --org.apache.axis2.eclipse.codegen.plugin_1.6.2.jar --...
  • at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035) at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165) at org.apache.axis....
  • axis2包含axis2-1.4.1-war.zip和axis2-1.4.1-bin.zip

    千次下载 热门讨论 2014-04-11 20:14:41
    axis2包含axis2-1.4.1-war.zip和axis2-1.4.1-bin.zip,希望大家喜欢。
  • [GCOA_SERVICE]2015-05-21 15:30:00 [org.apache.axis2.engine.AxisEngine]-[ERROR] The endpoint reference (EPR) for the Operation not found is ...org.apache.axis2.AxisFault: The endpoint reference (EPR) for ...
  • Axis2部署的时候出现了以下异常,哪位大神能帮忙看一下,到底是什么问题呢? Error: org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: 1 at org.apache...
  • 我用axis2 1.6.2版本访问axis2 1.4.1发布的服务器端,成功连接两次后,第三次连接超时失败,重启linux下的tomcat之后,还是只能访问两次,第三次失败。 viceClient serviceClient; serviceClient = new ...
  • axis2客户端调用的时候需要设置用户名密码,在网上搜了下,发现了3种方式,其中方法1我调用成功了,2、3都认证失败,有没有高手帮忙解释下3面3种写法: 1、 HttpTransportProperties.Authenticator auth = new...
  • <Call Stack = DEBUG_FRAME = org.apache.axis2.util.JavaUtils.callStackToString(JavaUtils.java:564) DEBUG_FRAME = org.apache.axis2.description.ParameterIncludeImpl.debugParameterAdd(ParameterIncludeImpl...
  • 楼主小白,有一个Drools项目想要部署到webservice上 ,于是照着网上用Axis2部署。 其实之前好像发布成功了?就是访问axis2那个service list有我的服务名称,虽然能不能用还没有测试 但后来突然就出现问题了,就是...
  • at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache....
  • at org.apache.axis.AxisFault.makeFault(AxisFault.java:101) at org.apache.axis.client.Call.invoke(Call.java:1828) at com.ffcs.zteintf.SendRunnable.run(SendRunnable.java:122) at java.lang.Thread....
  • at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:343) at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:389) at ...

空空如也

1 2 3 4 5 ... 20
收藏数 34,235
精华内容 13,694
关键字:

axis