|
本文讲述了Apache Axis的安装及简单应用,作为Apache Axis的一个入门教程。虽然现在Apache Web Service项目已经推出了Apache Axis2,Axis2相对Axis是一个很大的更新,关于Apache Axis2的介绍,请参考http://ws.apache.org/axis2,目前的版本是1.3。既然已经有了Apache Axis2这个更加优秀的Web Service Engine,为什么还要介绍Apache Axis呢,原因在于系统的兼容性,从Apache Axis既存系统Migration到Apache Axis2有的时候并不是很容易,所以Axis还残留一些利用的价值。本文主要介绍安装下载、安装、运行Apache Axis及部署一个样例Web Service并使用客户端进行调用。关于Apache Axis的一些概念,摘录Apache Axis官方说明:Apache Axis是开源的SOAP服务器和客户端。SOAP是网络间不同语言的程序进行交互的方法。SOAP通常在HTTP上交换信息:客户端POST一个SOAP请求,然后接受HTTP响应,HTTP的响应可能为成功代码、SOAP响应或者错误代码。SOAP消息的格式是XML,在不同的SOAP系统之间使用这种消息格式来对信息进行结构化。消息在SOAP Envelope中包含一个或者多个SOAP元素,Header或者SOAP Body。Axis实现了JAX-RPC API。JAX-RPC API是Java服务编程的标准之一。Axis编译后的文件为axis.jar,它实现了在jaxrpc.jar和saaj.jar中声明的JAX-RPC API。它需要很多辅助类,例如日志、WSDL处理和内省。这些文件可以被打包成axis.war,然后将其部署到servlet容器中。Axis中附带了一些样例的SOAP服务程序。 前提条件:本部分内容讲述的是Java的服务器端编程,设计的内容较多,主要是以下各部分内容,读者应该掌握或者了解以下内容:[blockquote]1.         核心Java数据类型、类以及编程概念。[/blockquote][blockquote]2.         线程、线程安全以及同步的概念。[/blockquote][blockquote]3.         类加载器的概念以及层次化类加载器,"ClassNotFoundException"的常见原因。[/blockquote][blockquote]4.         如何从异常信息中分析问题,NullPointerException以及一些常见异常的原因及修正方法。[/blockquote][blockquote]5.         web应用程序、servlet的概念,以及类、类库和数据在web应用程序中的分布位置。[/blockquote][blockquote]6.         应用程序服务器的启动以及发布应用程序。[/blockquote][blockquote]7.         网络的概念,sockets API,尤其是TCP/IP。[/blockquote][blockquote]8.         HTTP的概念、核心协议以及错误代码,HTTP头信息以及基本认证的细节。[/blockquote][blockquote]9.         XML的概念。[/blockquote]以上9条是Apache Axis中的说明,笔者认为除此之外,还应该对WSDL(Web Service Description Language),SOAP(Simple Object Access Protocol)有一定的了解。另外,Apache Axis 1.4需要XML Parser的支持,如果Java的版本是Java 1.4的话,那么已经包含了XML Parser,如果使用以前的版本,需要下载XML Parser并设置到系统CLASSPATH中。或者如果使用Apache Tomcat 4.1版本以后的服务器,都已经包含了XML Parser。推荐使用的XML Parser是Xerces。Apache Axis要求jdk的版本为jdk 1.3+。 0.下载必要的软件及jar文件。本文需要下载一下软件及jar文件:tomcat(tomcat5.5)mail.jar(javamail)activation.jar(jaf)xmlsec.jar(xmlsec)axis-1_4(axis)1.设置环境变量将下载的axis-bin-1_4.zip解压缩,解压缩后的目录为AXIS_HOME,目录结构如下:假设AXIS_HOME为d:\axis-1_4,设置以下环境变量:AXIS_HOME=d:\axis-1_4AXIS_LIB=%AXIS_HOME%\libAXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;在windows系统中,可以将上述变量设置到环境属性中,避免每次执行set操作。通过查看”我的电脑”--->”属性”,设置以上三个环境变量,如下图所示:然后将AXISCLASSPATH添加到系统的CLASSPATH变量中,这样在执行需要用到AXISCLASSPATH中的类的时候,就不需要使用java –cp %AXISCLASSPATH%了。当然也可以不将其加入到系统CLASSPATH中,up to you。2.安装axis拷贝AXIS_HOME\webapps\axis目录到你的应用程序服务器,这个服务器需要支持Servlet 2.2以上的规范,推荐使用Tomcat 4.1版本以上的服务器。当然也可以使用其他的服务器。笔者使用的服务器为apache-tocmat-5.5.25,此时应该将AXIS_HOME\webapps\axis拷贝到TOMCAT_HOME\webapps目录下,即拷贝完成后axis的目录为TOMCAT_HOME\webapps\axis。在Java 1.4中修改了以java.*和javax.*类的加载顺序,他们只能从endorsed (认可的)目录。jaxrpc.jar和saaj.jar包含javax package,所以可能没有被加载。如果happyaxis.jsp不能找到相关的类,那么应该将这些类由TOMCAT_HOME\webapps\axis\WEB-INF\lib下拷贝到TOMCAT_HOME\common\lib目录下,然后重新启动Tomcat。Axis需要找到一个XML Parser,如果应用程序服务器或者Java运行时环境没有相应的解析器(并且axis web应用程序可以使用),那么就需要下载并添加。Java 1.4包含Crimson解析器,所以可以忽略这个步骤,虽然Apache Axis认为Xerces更好一些。添加的XML解析器需要兼容JAXP 1.1。建议使用Xerces jars,下载地址为xml-xerces distribution。除非JRE或者服务器有明确的要求,否则的话可以将解析器的jar文件放在axis\WEB-INF\lib目录下。本部分如果使用Xerces的话,需要将xml-apis.jar和xercesImpl.jar文件拷贝到AXISCLASSPATH中(如前所述),这样Axis就可以使用XML解析器。3.查看Axis信息启动Tomcat服务器,然后再地址栏输入http://localhost:8080/axis,根据需要修改主机名和端口号,应该可以看到如下页面:其中主要的菜单如下:Validation:确认本地的安装配置是否成功,在该页面会对系统的配置做一个汇总,如果存在问题会以警告的消息进行醒目提示。List:列出当前可用的Web Service。Call:调用本地终端节点。Visit:访问Apache Axis官方网站。Administrater Axis:管理员信息,默认情况下是禁用的,可以通过修改%TOMCAT_HOME%\webapps\axis\WEB-INF\web.xml添加servlet-mapping来启用。SOAPMonitor:SOAP监视器,默认情况下禁用,启用方法在后文介绍。 执行Validation操作,可以看到如下页面:这就是所谓的Axis Happiness页面了,这个页面包含了如下的内容:需要的组件[blockquote][blockquote]Ø         Found SAAJ API ( javax.xml.soap.SOAPMessage ) at D:\apache-tomcat-5.5.25\common\lib\saaj.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found JAX-RPC API ( javax.xml.rpc.Service ) at D:\apache-tomcat-5.5.25\common\lib\jaxrpc.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found Apache-Axis ( org.apache.axis.transport.http.AxisServlet ) at D:\apache-tomcat-5.5.25\webapps\axis\WEB-INF\lib\axis.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found Jakarta-Commons Discovery ( org.apache.commons.discovery.Resource ) at D:\apache-tomcat-5.5.25\webapps\axis\WEB-INF\lib\commons-discovery-0.2.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found Jakarta-Commons Logging ( org.apache.commons.logging.Log ) at D:\apache-tomcat-5.5.25\bin\commons-logging-api.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found Log4j ( org.apache.log4j.Layout ) at D:\apache-tomcat-5.5.25\webapps\axis\WEB-INF\lib\log4j-1.2.8.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found IBM's WSDL4Java ( com.ibm.wsdl.factory.WSDLFactoryImpl ) at D:\apache-tomcat-5.5.25\webapps\axis\WEB-INF\lib\wsdl4j-1.5.1.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found JAXP implementation ( javax.xml.parsers.SAXParserFactory ) at an unknown location[/blockquote][/blockquote][blockquote][blockquote]Ø         Found Activation API ( javax.activation.DataHandler ) at D:\apache-tomcat-5.5.25\webapps\axis\WEB-INF\lib\activation.jar[/blockquote][/blockquote]可选组件(用于附件、安全)[blockquote][blockquote]Ø         Found Mail API ( javax.mail.internet.MimeMessage ) at D:\apache-tomcat-5.5.25\webapps\axis\WEB-INF\lib\mail.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found XML Security API ( org.apache.xml.security.Init ) at D:\apache-tomcat-5.5.25\webapps\axis\WEB-INF\lib\xmlsec-1.4.0.jar[/blockquote][/blockquote][blockquote][blockquote]Ø         Found Java Secure Socket Extension ( javax.net.ssl.SSLSocketFactory ) at an unknown location[/blockquote][/blockquote]如果以上组件都存在,那么Axis将提示如下信息。The core axis libraries are present.The optional components are present.如果以上组件有缺少的,或者Apache Axis没有找到的,那么将会有警告信息。(笔者将mail.jar、activation.jar、xmlsec-1.4.0.jar都拷贝到了%TOMCAT_HOME%\webapps\axis\WB-INF\lib目录下,所以可以找到这三个软件包,实际上,这三个软件包并不是必须的,只是在一些例子程序中需要,但是如果缺少的话,在tomcat控制台会打印警告日志,提示找不到文件或者不能完成某些操作。)最后在该页面显示一些Apache Tomcat服务器的信息以及系统属性信息,诸如操作系统、浏览器、Java版本等等。4.测试Axis服务查找服务在开始页(http://localhost:8080/axis),选择List链接,查看已经注册的Web Services。在这个页面可以点击wsdl的链接来查看Web Service是否正在运行。注意,Axis支持的JWS Web Service并没有在这里列出。测试SOAP Endpoint下面来测试一个服务。虽然SOAP 1.1使用HTTP POST来提交一个XML请求到endpoint,但是Axis也支持强制的HTTP GET方法来访问,这对测试很有帮助。首先测试一下获取Axis的版本这个服务,需要调用getVersion方法:http://localhost:8080/axis/services/Version?method=getVersion这个例子返回的值应该与下面的结果类似: <?xml version="1.0" encoding="UTF-8" ?> 
 <soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
      <getVersionResponse 
          soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
          <getVersionReturn 
              xsi:type="xsd:string">
              Apache Axis version: 1.1 Built on Apr 04, 2003 (01:30:37 PST)
          </getVersionReturn> 
      </getVersionResponse>
      </soapenv:Body>
 </soapenv:Envelope>不同的Axis的版本显示也不同。测试JWS Endpoint现在测试一个JWS Web Service。Axis的JWS Web Service就是java文件,保存在Axis webapp的目录树中,但是不能保存在WEB-INF目录中,并且文件扩展名为.jws。当通过URL请求.jws文件的时候,它会被编译并执行。通过请求样例程序EchoHeaders.jws (这个文件保存在axis目录下)。在浏览器中访问http://localhost:8080/axis/EchoHeaders.jws?method=list这时会返回如下XML格式的消息,显示了应用程序Headers的信息:<?xml version="1.0" encoding="UTF-8" ?> 
<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <listResponse 
            soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <listReturn xsi:type="soapenc:Array" 
                soapenc:arrayType="xsd:string[6]" 
                xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
                <item>accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*</item> 
                <item>accept-language:en-us</item> 
                <item>accept-encoding:gzip, deflate</item> 
                <item>user-agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)</item> 
                <item>host:localhost:8080</item> 
                <item>connection:Keep-Alive</item> 
            </listReturn>
        </listResponse>
    </soapenv:Body>
</soapenv:Envelope>到目前为止,Apache Axis安装完成,并正常工作。5.安装新的Web Service安装新的Web Service的过程主要分以下两个步骤:[blockquote](1)     将新的Web Service的类和类库放到Axis WAR目录树中[/blockquote][blockquote](2)     将新的文件通知AxisEngine[/blockquote]后者是通过Admin web服务来提交一个XML部署描述符给Axis来完成的,通常是通过AdminClient来完成或者<axis-admin>这个Ant任务来完成。两者实现的功能是一致的:执行Axis SOAP客户端来和Axis管理服务通信(Axis web service是一个SOAP service。)。同时它也是一个特殊的SOAP service,因为只能在本地调用,并且是密码保护的,这样可以阻止远程调用和防止任何人使用管理程序。客户端知道一个默认的密码。当修改这个密码时,需要告诉客户端。第一步是将代码添加到服务器。在WEB-INF目录中,查找(或者创建)classes目录。在这个目录中,将编译后的Java类文件拷贝到这里,注意Java包层次结构。如果类文件已经打包成JAR文件,那么可以将其放在WEB-INF/lib目录中。其他的第三方类库(jar)也放在这个目录中。当添加完类文件或者类库文件后,需要重新启动axis web应用程序,使用Tomcat管理控制台重启webapp或者重启Tomcat服务器。6.发布Web Service在(5)中已经完成安装Web Service,现在需要做的就是告诉Axis如何发布这个Web Service。Axis使用Web服务部署描述符(WSDD)文件(XML格式的文件)来描述Web服务:服务方法和SOAP endpoint的其他内容。在Apache Axis的用户指南中详细描述了WSDD文件,现在来运行一个Axis样例:Stock Quote服务。根据前面的内容,已经设置AXIS_HOME、AXIS_LIB、AXISCLASSPATH环境变量,并将其添加到CLASSPATH中。(在Apache Axis的安装指南中没有将其添加到CLASSPATH中,而是使用java –cp %AXISCLASSPATH% JavaClass的形式来使用)。在AXIS_HOME\sampes\stock目录下,包含了deploy.wsdd文件,这就是需要告诉给axis的部署描述符。如下图所示文件位置:         不是描述符是Axis-specific的XML文件,用于告诉Axis发布或者卸载一个Web Service,以及如何配置Axis自身的文件。Axis Administration Web Service允许AdminClient程序或者它对应的Ant任务提交一个用于说明的WSDD文件。Axis “engine”会更新配置信息,并保存状态。         默认情况下,Axis将状态保存到一个全局的配置文件TOMCAT_HOME\webapps\axis\WEB-INF\server-config.wsdd。有的时候在服务器启动的时候会看到一个警告信息,说server-config.wsdd文件不存在,没有关系,因为Axis在部署任意服务后就会自动的创建这个文件。部署完成后可以查看这个文件的内容。         进入AXIS_HOME\samples\stock目录,执行以下命令:         java org.apache.axis.client.AdminClient –lhttp://localhost:8080/axis/services/AdminService deploy.wsdd         运行结果如下:(由于笔者先前已经部署过这个web service,所以先undeploy一下,然后再进行deploy)(如果在执行的时候发生java客户端异常,比如ClassNotFoundException,需要检查AXISCLASSPATH及CLASSPATH是否设置正确,是否写错了类名或者其他的一些错误。)         执行后,在TOMCAT_HOME\axis\WEB-INF\目录下生成了server-config.wsdd文件,其内容的说明,在用户指南有详细的介绍,这里不做介绍。         测试客户端访问:         返回到AXIS_HOME目录,执行下面的命令:         java –cp .;%AXISCLASSPATH% samples.stock.GetQuote –lhttp://localhost:8080/axis/servlet/AxisServlet –uuser1 –wpass1 XXX         运行结果如下: 7.高级安装:将Axis添加到应用程序中如果对于Web应用程序开发很熟悉的话,那么可能需要将web services添加到一个已经存在的web应用程序中,可以通过这种办法来运行Axis。与安装web service到Axis不同,需要将Axis添加到Web应用程序。[blockquote][blockquote]¨         将axis.jar、wsdl.jar、saaj.jar、jaxrpc.jar以及其他依赖的jar文件添加到自定义的WAR文件中。[/blockquote][/blockquote][blockquote][blockquote]¨         将Axis Servlet的声明从TOMCAT_HOME\webapps\axis\WEB-INF\web.xml文件中拷贝到自定义的web.xml文件中。[/blockquote][/blockquote][blockquote][blockquote]¨         构建并部署webapp。[/blockquote][/blockquote][blockquote][blockquote]¨         运行Axis AdminClient来访问webapp,而不是Axis,这时需要修改访问的URL。[/blockquote][/blockquote]8.启用SOAPMonitorSOAPMonitor允许通过Web浏览器来监视SOAP请求和响应。关于SOAPMonitor的使用,可以参考用户指南中的相关部分。默认情况下,SOAPMonitor是禁用的。启用它的基本步骤如下:编译SOAP Monitor java applet、发布SOAP Monitor web service、在需要监视的web service中添加请求和响应的处理流。(1)进入到AXIS_HOME\webapps\axis目录,然后编译SOAPMonitorApplet.java程序:javac –classpath %AXIS_HOME%\lib\axis.jar SOAPMonitorApplet.java运行结果如下:D:\axis-1_4\webapps\axis>javac -classpath %AXIS_HOME%\lib\axis.jar SOAPMonitorApplet.java         将编译后的SOAPMonitorApplet*.class文件拷贝到TOMCAT_HOME\webapps\axis目录下。[blockquote](2)发布SOAPMonitorService[/blockquote][blockquote]将下面的内容拷贝到一个文件中,并保存为deploy-monitor.wsdd文件,作为SOAPMonitorService的部署描述符,将其保存在AXIS_HOME\webapps\axis目录下(文件名和目录任意)[/blockquote][blockquote]<deployment xmlns="http://xml.apache.org/axis/wsdd/"[/blockquote][blockquote]    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">[/blockquote][blockquote] <handler name="soapmonitor"[/blockquote][blockquote]      type="java rg.apache.axis.handlers.SOAPMonitorHandler">[/blockquote][blockquote]    <parameter name="wsdlURL"[/blockquote][blockquote]      value="/axis/SOAPMonitorService-impl.wsdl"/>[/blockquote][blockquote]    <parameter name="namespace"[/blockquote][blockquote]      value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>[/blockquote][blockquote]    <parameter name="serviceName" value="SOAPMonitorService"/>[/blockquote][blockquote]    <parameter name="portName" value="Demo"/>[/blockquote][blockquote] </handler>[/blockquote][blockquote] <service name="SOAPMonitorService" provider="java:RPC">[/blockquote][blockquote]    <parameter name="allowedMethods" value="publishMessage"/>[/blockquote][blockquote]    <parameter name="className"[/blockquote][blockquote]      value="org.apache.axis.monitor.SOAPMonitorService"/>[/blockquote][blockquote]    <parameter name="scope" value="Application"/>[/blockquote][blockquote] </service>[/blockquote][blockquote]</deployment>[/blockquote][blockquote]进入到deploy-monitor.wsdd保存的目录,执行如下程序:[/blockquote][blockquote]java –cp %AXISCLASSPATH% org.apache.axis.client.AdminClient –lhttp://localhost:8080/axis/services/AdminService deploy-monitor.wsdd[/blockquote][blockquote]运行结果如下:[/blockquote][blockquote][/blockquote][blockquote](3)对于每个要监视的服务,在服务部署描述符中添加请求和响应的flow定义并部署(或者重新部署)服务。requestFlow和responseFlow定义在<service>元素后面,如果一个服务已经发布了,那么首先undeploy,之后使用修改后的部署描述符deploy。下面是一个例子:[/blockquote][blockquote]...[/blockquote][blockquote]<service name="xmltoday-delayed-quotes" provider="java:RPC">[/blockquote][blockquote]    <requestFlow>[/blockquote][blockquote]      <handler type="soapmonitor"/>[/blockquote][blockquote]    </requestFlow>[/blockquote][blockquote]    <responseFlow>[/blockquote][blockquote]      <handler type="soapmonitor"/>[/blockquote][blockquote]    </responseFlow>[/blockquote][blockquote]    ...[/blockquote][blockquote](4)使用Web浏览器输入http://host:port/webapp/SOAPMonitor就可以SOAP请求和响应消息了。
例如,重新访问stock这个样例服务时,可以看到如下消息:
SOAP Reuqest:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ns1:getQuote soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:xmltoday-delayed-quotes">
      <symbol xsi:type="xsd:string">XXX</symbol>
    </ns1:getQuote>
  </soapenv:Body>
</soapenv:Envelope>
SOAP Response:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ns1:getQuoteResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:xmltoday-delayed-quotes">
      <getQuoteReturn xsi:type="xsd:float">55.25</getQuoteReturn>
    </ns1:getQuoteResponse>
  </soapenv:Body>
</soapenv:Envelope>[/blockquote] 总结:Axis是SOAP的一个简单实现,可以添加到可以操作web服务的应用程序中。 |
评分
-
查看全部评分
|