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

    千次阅读 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

    展开全文
  • 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应用服务器上运行,不需要对服务的实现代码做任何的改动。

     

     
    展开全文
  • 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主要是用来对坐标轴进行一定的缩放操作,其操作命令主要如下:

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

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

    4、axis auto 解除限制,恢复到默认状态
    比如,下面的一个例子:

    使用axis对坐标轴进行缩放,

    >> axis([2,5,-0.5,0.8])

    下面是axis相关的用法总结:

    1、axis( [xmin xmax ymin ymax] )   

     设置当前坐标轴 x轴 和 y轴的限制范围

    2、axis off;

     去掉坐标轴

    3、axistight;

     紧坐标轴

    4、axisequal;

     等比坐标轴

    5. V=axis;

    返回包含当前坐标范围的一个行向量

    6. axis auto;

    %将坐标轴刻度恢复为自动的默认设置

    7. axis manual

    冻结坐标轴刻度,此时如果hold被设定为on,那么后边的图形将使用与前面相同的坐标轴刻度范围

    8. axis tight

    将坐标范围设定为被绘制的数据范围

    9. axis fill

    这是坐标范围和屏幕的高宽比,使得坐标轴可以包含整个绘制的区域。该选项只有在PlotBoxaApectRatio或DataAspectRatioMode被设置为‘manual’模式才有效

    10. axis ij

    将坐标轴设置为矩阵模式。此时水平坐标轴从左到右取值,垂直坐标从上到下

    11. axis xy

    将坐标设置为笛卡尔模式。此时水平坐标从左到右取值,垂直坐标从下到上取值

    要区分axis ij和axis xy两种的区别----垂直坐标

    12. axis equal

    设置屏幕高宽比,使得每个坐标轴的具有均匀的刻度间隔

    13. axis square

    将坐标轴设置为正方形

    14. axis normal

    将当前的坐标轴框恢复为全尺寸,并将单位刻度的所有限制取消

    15. axis vis3d

    冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

    16. axis on

    打开所有的坐标轴标签、刻度、背景

     

     

    展开全文
  • 成功解决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)  
    
    
    #修改列表的内容使其不为空列表即可!

    大功告成!哈哈!

    展开全文
  • Matlab axis函数

    万次阅读 多人点赞 2018-06-28 15:52:41
    axis 用于操作普通的坐标属性,(轴的缩放和外观)。axis( [xmin xmax ymin ymax] ) 设置当前坐标轴 x轴 和 y轴的限制范围axis( [xmin xmax ymin ymax zmin zmax cmin cmax] ) 设置 x,y,z轴的限制范围和色差范围。...
  • 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,希望大家喜欢。
  • Axis2-1.6.2

    千次下载 热门讨论 2012-09-17 17:40:49
    Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。是开发web service强大是工具软件。安装方法可参照博客“Axis2下载与安装”。
  • matlab中axis square和axis equal的区别

    万次阅读 2018-06-28 11:09:06
    axissquare/将当前坐标系图形设置为方形。横轴及纵轴比例是1:1 axisequal/将横轴纵轴的定标系数设成相同值 也就是说axissquare刻度范围不一定一样,但是一定是方形的。 axisequal刻度是等长的,但也不一定是...
  • axis1.3 axis1.4jar包

    热门讨论 2009-11-07 13:46:07
    java webservice开发 axis开发webservice程序,axis1.3和axis1.4 jar包。
  • matplotlib axis

    千次阅读 2017-11-23 11:36:27
    http://matplotlib.org/api/_as_gen/matplotlib.pyplot.axis.html#matplotlib.pyplot.axisaxis('off') #关闭...axis('equal') #changes limits of x or y axis so that equal increments of x and y have the same len
  • python中axis=0 axis=1的理解

    万次阅读 多人点赞 2018-08-17 09:35:34
    而坐标轴是有方向的,所以千万不要用行和列的思维去想axis,因为行和列是没有方向的,这样想会在遇到不同的例子时感到困惑。   根据官方的说法,1表示横轴,方向从左到右;0表示纵轴,方向从上到下。当ax...
  • axis=1和axis=0的问题

    千次阅读 2017-11-17 18:30:12
    在科学计算中,经常会遇到在行或者列维度上进行计算的操作,axis=0表示列维度,axis=1表示行维度。 上面明显看出axis=0表示列,axis=1表示行的和。
  • axis square 当前坐标系图形设置为方形 axis equal 将横轴纵轴的定标系数设成相同值 ,即单位长度相同, 也就是说axis square刻度范围不一定一样,但是一定是方形的。 axis equal刻度是等长的,...
  • axis2的API,axis2 API,axis2帮助文档
  • 【numpy】argmax参数辨析(axis=0,axis=1,axis=-1)

    千次阅读 多人点赞 2020-04-30 10:47:21
    网上一般都是axis=0,axis=1,很少有axis=-1的博客,在这进行简单的小结,后续可能会增补。 说明: 代码在 jupyter notebook中实现。 1. 正文 1.1 简单介绍 argmax:一句话概括,返回最大值的索引。 当然这个索引是有...
  • axisaxis2客户端调用方式

    千次阅读 2018-07-17 12:17:19
    最近做接口对接,对接的服务端是.net平台的webservices,用他们的wsdl文件不能生成axis2客户端,只能用axis调用,代码用的是天气预报的公网接口,都可正常使用 /** * axis直接调用 */ public static void ...
  • Matlab undo axis tight axis image

    千次阅读 2015-07-08 00:33:31
    下面这句可以undo axis tight and axis image,因为axis normal设计上不会undo axis tight,下面三个属性是隐藏属性可以逆转axis tight: set(gca,'XLimSpec','stretch','YLimSpec','stretch', 'ZLimS
  • mu = np.mean(features,axis=0) features为M×N, 那么mu为(N,)或记1×N 例2 X_input = np.concatenate((features,intercept_feature),axis=1) features为M×N,那么X_input为M ×(N+1) 例3 &gt;&...
  • axis2 访问 axis 1.4

    千次阅读 2014-09-17 14:08:58
    axis2 与 axis1.4 的一个兼容性问题 这个问题是我在实际项目中使用 axis2 stub 访问一个 webservice 并发送一段二进制数据时遇到的。  webservice 是由德国人实现的,并部署在德国。 刚开始并不知道他们的 ...
  • axis函数

    千次阅读 2016-09-13 14:43:18
    axis off;% 去掉坐标轴 axistight;% 紧坐标轴 axisequal;% 等比坐标轴 axis([-0.1, 8.1, -1.1, 1.1]);% 坐标轴的显示范围 % gca: gca, h=figure(...); set(gca,'XLim',[3 40]);% X轴的数据显示...
  • 本篇文章主要目的是讲解axis的含义,所以默认都是用L1_norm范数,方便理解。** 首先,来看一下2维的情况 创建一个 2×3 的常量 a = tf.constant(range(6), shape = [2,3]) tf.norm(a,ord=1,axis=0) axis=0,可以...
  • 对于矩阵操作中axis的理解,以及axis=-1的解释

    万次阅读 多人点赞 2019-03-09 15:54:10
    1. axis的基本使用 axis常常用在numpy和tensorflow中用到,作为对矩阵(张量)进行操作时需要指定的重要参数之一。设定axis=-1,0,1...,用来指定执行操作的数据如何划分。 一句话解释:设axis=i,则沿着第i个下标...
  • 解决问题return tf.nn.softmax(x, axis=axis) TypeError: softmax() got an unexpected keyword argument 'axis'解决方法
  • numpy模块之axis

    万次阅读 多人点赞 2016-11-06 17:02:16
    numpy模块之axis的含义numpy是python进行科学计算必不可少的模块,随着深度学习越来越火,numpy也越来越流行。了解numpy的人知道,在numpy中,有很多的函数都涉及到axis,很多函数根据axis的取值不同,得到的结果也...
  • axis=0 与 axis=1 的区分

    千次阅读 2018-12-05 10:14:30
    官方帮助的解释: ...当axis=1时,数组的变化是横向的,体现出列的增加或者减少。反之,当axis=0时,数组的变化是纵向的,体现出行的增加或减少。 下图为dataframe中axis为0和1时的图示:  ...
  • \quad在看数据分析的时候,发现一个问题,之前对于axis的理解是0行1列。先看下面两个例子吧。 \quad从上述代码中,我们可以看到,data.mean(axis=1)是将data数据的行进行了求均值,而data.drop(“two”,axis=1)是...
  • AxisAxis2和CXF比较

    千次阅读 2016-03-20 11:22:02
    ³新一代的Web Services 框架如Axis2、CXF 都是由现有的项目中逐渐演化而来的,Axis2 是由大家熟悉的Axis 1.x 系列演化过来,而Apache CXF 则是由Celtix和 XFire 项目整合而生,并且刚刚发布了2.0.2 的最新版本,...
  • axis资料jar包

    热门讨论 2013-01-05 17:13:27
    axis资料jar包,共包括12个文件activation.jar axis.jar axis-ant.jar axis-schema.jar commons-discovery-0.2.jar commons-logging-1.0.4.jar jaxrpc.jar log4j-1.2.8.jar mailapi.jar saaj.jar wsdl4j-1.5.1.jar ...
  • python中axis=0和axis=1的理解

    千次阅读 2020-02-23 15:49:22
    axis的重点在于方向,而不是行和列。1表示横轴,方向从左到右;0表示纵轴,方向从上到下。 即axis=1为横向,axis=0为纵向,而不是行和列,具体到各种用法而言也是如此。 当axis=1时,如果是求平均,那么是从左到右...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,208
精华内容 20,883
关键字:

axis