- 浏览: 215829 次
- 性别:
- 来自: 辽宁
最新评论
-
bill200711022:
实测结果:就算把父类声明放在子类声明之后,也不会报错“Stri ...
PHP Strict Standards问题 -
congjl2002:
niuzk 写道我在office 2003下运行楼主的Exce ...
Java程序员的第一个VBA程序 -
Liv:
[i][/i]引用[img][/img][ ...
MyEclipse下部署Roller4.0 -
hyt5926:
神解决!!谢了.
Apache的443端口被占用解决方法 -
congjl2002:
ligongxiang 写道请问在JDK1.5上使用class ...
Oracle 10.2.0 最新的JDBC驱动ojdbc14.jar
本文是Apache Axis的用户指南的第一部分。
笔者在学习的过程中,作为记录,简单的翻译了一下。笔者已经翻译了Apache Axis的安装及应用文档,也谈不上翻译,只是笔者在学习的过程中,将笔者认为重要的部分作为记录,并加以笔者实践的结果。建议在阅读本文之前先阅读Apache Axis安装指南。
0.介绍
SOAP:SOAP是基于XML的通信协议和编码格式,它用于交互应用程序通信。现在的版本是SOAP 1.2,但是SOAP 1.1版本使用的更加广泛。SOAP由W3C的XML协议工作组管理。SOAP被广泛的认为是跨平台、跨语言的计算机应用和Web Service的核心。
AXIS:Axis是SOAP Engine----用来构造SOAP处理器,例如客户端,服务器端,网管等等。Axis是使用Java实现的,但是Axis提供一个C++的客户端实现。Axis不仅仅是一个SOAP Engine,它还包括以下内容:
·独立的服务器
·可以plug in到servlet engine中的服务器
·支持WSDL
·根据WSDL生成Java类
·样例程序
·SOAPMonitor
Axis 1.4的特性如下:
·兼容SOAP 1.1/1.2两个版本
·灵活的配置和发布
·支持JWS
·支持所有的基本类型,以及类型映射系统
·自动的Java Beans序列化/反序列化,包含自定义的Java属性-->XML元素/属性的映射
·自动的Java集合与SOAP数组的双向转换。
·提供RPC和基于消息的SOAP服务
·由发布的服务自动生成WSDL
·WSDL2Java工具
·Java2WSDL工具
·基本的安全扩展,可以集成到Servlet 2.2的安全/角色中
·支持面向绘画的服务,通过使用HTTP Cookie或者独立于传输的SOAP Headers
·对SOAP with Attachments规范的初步支持
·将EJB作为Web Service来访问
·基HTTP Servlet的传输
·基于JMS的支持
·独立的服务器版本
·大量的例子
根据Apache Axis安装指南,安装Apache Axis到Apache Tocmat服务器。运行本文所适用的例子之前,确保CLASSPATH包含以下类库:
· axis-1_2/lib/axis.jar
· axis-1_2/lib/jaxrpc.jar
· axis-1_2/lib/saaj.jar
· axis-1_2/lib/commons-logging.jar
· axis-1_2/lib/commons-discovery.jar
· axis-1_2/lib/wsdl4j.jar
· axis-1_2/ (for the sample code)
· 遵守JAXP-1.1的XML解析器,推荐使用Xerces,因为在Apache Axis测试的时候使用的就是这个解析器
1.使用Axis开发Web Service
Getting Started
首先来看一个例子Web Service客户端程序,它调用Apache提供的Axis服务器的echoString方法:
package samples.userguide.example1;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public class TestClient {
public static void main(String[] args) {
try {
String endpoint =
"http://nagoya.apache.org:5049/axis/services/echo";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new QName("http://soapinterop.org/",
"echoString"));
String ret = (String) call.invoke(new Object[] { "Hello!" });
System.out.println("Sent 'Hello!', got '" + ret + "'");
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
程序首先创建了Service和Call对象,他们是标准的JAX-RPC对象,用来存储关于调用服务的元数据,然后设置了SOAP消息目的地的终端节点的URL,接着定义了Web Service的操作名,最后激活服务,传递一个数组参数(一个字符串)。
可以查看SOAP请求消息的结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:echoString xmlns:ns1="http://soapinterop.org/">
<arg0 xsi:type="xsd:string">Hello!</arg0>
</ns1:echoString>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
字符串参数自动的序列化成XML,服务器响应就是一个String,我们将它反序列化后并打印出来。
可以使用tcpmon或者SOAP monitor来查看请求和响应信息。(笔者并没有网络连接,不能连接到Apache网站,所以这个例子没有运行成功。)
命名参数
在上面的例子中,可以看到Axis自动的将XML编码的参数命名为arg0,arg1,放在SOAP消息中。如果想改变这种命名,很简单,在调用invoke()方法之前,使用addParameter方法对每个参数命名,同时使用setReturnType对返回的参数命名,如下所示:
call.addParameter(“testParam”,
org.apache.axis.Constants.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
进行上述设置后,会将testParam这个参数名赋给并且只赋给第一个调用方法的第一个参数。同时还定义了参数的类型(org.apache.axis.Constants.XSD_STRING)和这个参数是输入还是输出或者输入输出参数。在本例中是一个输入参数。现在再运行这个程序时,消息如下:
<testParam xsi:type="xsd:string">Hello!</testParam>
与”untyped”服务器互操作
在上面的例子中,强制设置了invoke()方法的返回值类型,本来是一个Object类型,但是转换为适当的实际类型---例如,我们已经知道echoString方法返回一个字符串,那么我们希望调用client.invoke()返回一个字符串。我们先来看一下它是如何工作的:
下面是echoString的一个响应:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/">
<result xsi:type="xsd:string">Hello!</result>
</ns1:echoStringResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
其中红色的部分包含了一个类型声明,Axis使用它来决定将元素的内容反序列化成什么类型的Java对象,在本例中将其反序列化成一个Java String对象。很多工具将这种XML中的显示类型信息叫做自描述。另外,一些工具返回如下的响应:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/">
<result>Hello, I'm a string!</result>
</ns1:echoStringResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
它不包含类型的生命,那么Java如何将<result>中的内容进行反序列化呢?反序列化成什么类型的对象呢?答案就是metadata,关于数据的数据。在本例中,我们需要一个对服务的描述来告诉我们期望的返回类型。下面是在Axis客户端需要做的:
call.setReturnType( org.apache.axis.Constants.XSD_STRING );
这个方法会告诉Axis客户端,如果返回值类型没有被声明,那么就将返回值的xsi:type属性定义成预定义的SOAP String类型。
另外还可以通过下面的方法设置返回类型的Java类:
call.setReturnClass(String.class);
现在,使用Axis作为客户端访问SOAP服务就介绍完了。总结一下,利用Axis作为客户端访问SOAP服务的步骤如下:
创建服务终端节点
初始化Service,初始化方法:
Service()
Service(EngineConfiguration config)
Service(EngineConfiguration engineConfiguration, AxisClient axisClient)
Service(java.io.InputStream wsdlInputStream, QName serviceName)
Service(Parser parser, QName serviceName)
Service(QName serviceName)
Service(java.lang.String wsdlLocation, QName serviceName)
Service(java.net.URL wsdlDoc, QName serviceName)
初始化Call,初始化方法调用Service的如下方法:
Call createCall()
Creates a new Call object with no prefilled data.
Call createCall(QName portName)
Creates a new Call object - will prefill as much info from the WSDL as it can.
Call createCall(QName portName, QName operationName)
Creates a new Call object - will prefill as much info from the WSDL as it can.
Call createCall(QName portName, java.lang.String operationName)
Creates a new Call object - will prefill as much info from the WSDL as it can.
设置调用的一些参数:
void addParameter(java.lang.String paramName, QName xmlType, java.lang.Class javaType, ParameterMode parameterMode)
void addParameter(java.lang.String paramName, QName xmlType, ParameterMode parameterMode)
void setOperationName(QName operationName)
void setPortTypeName(QName portType)
void setProperty(java.lang.String name, java.lang.Object value)
void setReturnType(QName xmlType)
void setReturnType(QName xmlType, java.lang.Class javaType)
void setTargetEndpointAddress(java.lang.String address)
.......(org.apache.axis.client.Call、org.apache.axis.Call、javax.xml.rpc.Call的方法)
调用invoke方法,调用SOAP服务
2.使用Axis发布Web Service
首先看一下下面这个非常简单的类:
public class Calculator {
public int add(int i1, int i2) {
return i1 + i2;
}
public int subtract(int i1, int i2) {
return i1 – i2;
}
}
如何将这个类可以通过SOAP访问呢?方法有很多种,我们通过Axis提供的最简单办法来完成:
JWS(Java Web Service)文件---瞬时部署
将Calculator.java文件拷贝到<your-webapp-root>/axis/目录下,并修改扩展名为jws,即拷贝后的文件为Calculator.jws,例如笔者拷贝的目录及文件名为TOMCAT_HOME\webapps\axis\Calulator.jws
接下来就可以通过下面的URL访问Web Service了
Axis将自动的查找文件,编译java类,转换成SOAP调用。使用下面的客户端程序:
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package samples.userguide.example2;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import javax.xml.rpc.ParameterMode;
public class CalcClient
{
public static void main(String [] args) throws Exception {
Options options = new Options(args);
String endpoint = "http://localhost:" + options.getPort() +
"/axis/Calculator.jws";
args = options.getRemainingArgs();
if (args == null || args.length != 3) {
System.err.println("Usage: CalcClient <add|subtract> arg1 arg2");
return;
}
String method = args[0];
if (!(method.equals("add") || method.equals("subtract"))) {
System.err.println("Usage: CalcClient <add|subtract> arg1 arg2");
return;
}
Integer i1 = new Integer(args[1]);
Integer i2 = new Integer(args[2]);
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName( method );
call.addParameter( "op1", XMLType.XSD_INT, ParameterMode.IN );
call.addParameter( "op2", XMLType.XSD_INT, ParameterMode.IN );
call.setReturnType( XMLType.XSD_INT );
Integer ret = (Integer) call.invoke( new Object [] { i1, i2 });
System.out.println("Got result : " + ret);
}
}
使用下面的调用来调用Calculator.jws:
G:\jee\eclipse\workspace\AxisUserGuide>java samples.userguide.example2.CalcClien
t -p8080 add 2 5
Got result : 7
G:\jee\eclipse\workspace\AxisUserGuide>java samples.userguide.example2.CalcClien
t -p8080 subtract 10 9
Got result : 1
G:\jee\eclipse\workspace\AxisUserGuide>java samples.userguide.example2.CalcClien
t -p8080 unknown 1 2
Usage: CalcClient <add|subtract> arg1 arg2
当端口不是8080的时候,需要改成自定义的端口。
由于JWS web服务是目的在于实现简单的web服务。不能使用package。当使用package的时候,将出现如下的错误:
G:\jee\eclipse\workspace\AxisUserGuide>java samples.userguide.example2.CalcClien
t -p8080 subtract 10 9
Exception in thread "main" AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.FileNotFoundException: G:\eclipse\workspace\apache-tomcat-
5.5.25\webapps\axis\WEB-INF\jwsClasses\samples\userguide\example2\Calculator.cla
ss (指定されたファイルが見つかりません。)
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:neusoft-dc6b5f1
3.自定义部署—介绍WSDD
使用JWS的唯一有点就是简单,但是灵活性很差,不可以进行配置,不能指定自定义类型,不能使用Handlers,所以很少使用。
使用部署描述符
为了灵活的使用Axis,主要使用其配置的功能,首先应该属性Axis Web Service Deployment Descriptor(WSDD)格式。部署描述符包含了需要部署到Axis中的内容,也就是说,Axis Engine需要使用的内容。通常部署一个Web Service,那么我们就从基本的服务开始开始了解wsdd。首先看下面这个wsdd文件:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="MyService" provider="java:RPC">
<parameter name="className" value="samples.userguide.example3.MyService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
比较简单,最外层的元素告诉engine这是一个WSDD部署,同时定义了java这个名称空间。接着service元素进行实际的Web Service的定义。service是一个目标链,也就是说它可能包含以下内容中的部分或者全部:请求流、核心处理器(对于服务来说叫做provider)、响应流。在本例中,provider是java:RPC,建立在Axis中,提示了这是个Java RPC服务。实际上处理这个的类是org.apache.axis.providers.java.RPCProvider。一些其他的providers包括如下:
通过使用一系列的参数来告诉RPCProvider它需要实例化的类以及调用的类(例如samples.userguide.example3.MyService)。上面例子中的参数分别为指定服务的类、允许通过SOAP访问的方法,”*”表示所有的方法都可以访问。也可以通过空白或者都好分割的方面名来限制SOAP可以访问的方法列表。
4.高级WSDD—指定更多的选项
WSDD描述符可以包含关于服务的更多的信息,以及其他的部分,例如Axis中的Handlers,我们将在后面进行介绍。
服务范围
Axis支持三种范围的服务对象,”Request”、”Session”、”Application”,其中Request Scope是默认的,为每个SOAP请求创建一个新的对象,Session Scope针对每个允许使用session的客户端创建一个新的对象,Application scope为所有的请求创建一个单例的共享对象。可以通过<parameter>指定,例如:
<service name=”MyService” ...>
<parameter name=”scope” value=”value”>
...
</service>
使用AdminClient
使用AdminClient,或者说org.apache.axis.client.AdminClient类来将wsdd文件发送到Axis服务器,以便真正的部署服务。如果将Axis部署到不是tomcat的服务器上的话,需要使用-p<port>参数,默认的是8080,一个典型的调用AdminClient的方式是:
java org.apache.axis.client.AdminClient deploy.wsdd
<Admin>Done processing</Admin>
这个命令使服务可以通过SOAP进行访问,通过运行Client类来检查一下:
java samples.userguide.example3.Client –lhttp://localhost:8080/axis/services/MyService “test me!”
You typed : test me!
整个运行过程如下:
发表评论
-
将oracle用户密码设置为永不过期
2016-02-28 20:40 945修改oracle用户密码永不过期。为了测试 ... -
SQL Server 因为正在使用 无法还原解决方法
2016-02-26 12:00 870有时候我们需要还原数据库,但是由于程序或者其他人正在操作数据 ... -
SQL Server Management Studio连接服务器时指定端口号
2016-02-25 15:40 1233今天想连接SQL Server服务器,需要指定端口号。 各 ... -
Fixing SVN Edge Database after failed upgrade to 5.x
2015-08-08 22:55 2407问题:Cannot login to console aft ... -
Oracle管理员代理普通用户操作
2014-10-15 16:11 843-- 1. 以DBA身份连接至数据库,创建一个代 ... -
Linux tar压缩时排除某个目录或文件的参数
2012-05-03 08:58 1288在对某个目录进行压缩的时候,有时候想排除掉某个目录,例如: ... -
ubuntu 11.10 安装 java环境
2012-04-07 15:07 1042声明:一下内容主要来自网络,本来在此基础上根据自己的成功经验做 ... -
Xml转CSV的小工具
2012-02-09 17:59 2953这个挺好用,而且不需要预定义模板 -
Oracle好文章
2012-02-09 16:18 770Oracle IO http://blog.163.com/ ... -
c# sqlite好文章
2011-11-15 23:28 811http://www.dreamincode.net/foru ... -
eclipse或者myeclipse的Help菜单下找不到SoftWare Updates菜单的解决
2011-10-25 13:34 1711In some situations you may not ... -
VirtualBox问题汇总
2011-10-25 10:12 8171.windows共享文件夹 映射网络驱动\\vboxsvr ... -
Word页眉插入章节名
2011-09-20 10:29 1673一篇长的Word文档中保存了多篇文章,通过域功能,可以把文章的 ... -
Access restriction: The type FtpClient is not accessible due to restriction on r
2011-06-27 15:31 2798在做ftp,代码中引用import sun.net.ftp.F ... -
iTunes备份目录
2011-06-16 23:26 1440iTunes 将备份文件存放在以下位置:Windows XP: ... -
bash中获得文件名和文件路径
2011-06-10 17:15 920[root@mail /]# dirname /root/ ... -
VirtualBox3.2.12在CentOS中共享Windows文件夹
2011-05-01 23:04 3980http://www.51testing.com/?uid-1 ... -
java中判断字符串是否为数字的三种方法
2010-09-27 11:06 10791用JAVA自带的函数public static ... -
win7右键新建为空解决办法
2010-06-27 20:53 3660环境:win7 Ultimate 问题:右键的新建菜单为空 ... -
gbk, gb2312,big5,unicode,utf-8,utf-16的区别
2010-05-05 23:52 1360以前收藏的一篇 标题 谈谈Unicode编码,简要解释UCS、 ...
相关推荐
本部分的用户指南主要关注如何在Axis中利用WSDL(Web Service Description Language)文件来操作Web服务。 WSDL是一种XML格式的语言,由IBM和Microsoft共同开发,并得到了广泛的行业支持。它定义了Web服务的接口、...
6. **开源社区支持**:作为Apache项目的一部分,Axis2拥有一个活跃的开发者和用户社区,可以提供技术支持和资源。 ### 三、创建安全可靠的Web服务 #### 1. 安全性实现 - **身份验证**:通过用户名/密码、证书等...
`docs`目录则包含了相关的用户指南和技术文档,方便查阅。 8. **Web应用程序部署**:`webapps`目录包含了一个预配置的Axis Web应用,可以直接在Servlet容器如Tomcat中部署,以提供Web服务。 9. **XML配置**:Axis ...
Axis2快速指南,一本不错的小书,英文,解压缩之后是PDF格式。
总而言之,《使用Apache Axis开发Web服务》不仅是一本实用性极强的技术手册,更是一部引导初学者快速掌握Web服务开发技能的指南。无论是对于刚接触Web服务的新手还是寻求提升技术水平的开发者来说,这本书都是...
Apache Axis的快速启动指南是初学者进入Web服务开发领域的理想起点。 在本文中,我们将深入探讨Apache Axis的关键特性、安装过程、配置方法以及如何创建和部署Web服务。首先,让我们理解Web服务的基本概念。 **Web...
本书《Packt - Quickstart Apache Axis2》是一本专为初学者设计的指南,旨在帮助读者快速掌握Apache Axis2的核心概念和技术。 在Web服务的世界中,Apache Axis2扮演着至关重要的角色,它提供了一个高效的执行引擎,...
1. **Apache Axis2**:Apache Axis2是Apache软件基金会的Web服务项目,它是第二代Axis的升级版,提供了更高效、更灵活的架构。它支持多种协议,包括SOAP 1.1、SOAP 1.2、REST、MTOM(Message Transmission ...
`Apache Axis初级教程---安装、应用.doc`是一个详细指南,涵盖了从安装到实际操作的所有步骤。它会指导你如何配置Axis,如何创建和发布Web服务,以及如何测试服务的有效性。这份文档对于初学者来说是非常宝贵的资源...
### 开发Web服务使用Apache Axis2的...通过上述总结,我们可以看出《使用Apache Axis2开发Web服务》这本书是一本非常实用的指南,不仅提供了详细的步骤指导,还涵盖了多项高级技术的应用,适合不同层次的开发者阅读。
- 文档:包含API参考、用户指南和安装说明,帮助开发者理解和使用该框架。 - 配置文件:用于设置服务的行为和日志记录级别。 - 工具:可能包括编译和部署Web服务的辅助脚本或程序。 **使用Apache Axis的流程** 1. *...
由于Apache官方网站已不再提供Axis1.3的下载,用户可能需要从镜像站点或第三方仓库获取这些资源。虽然较新的版本如Axis2提供了更多的功能和改进,但许多现有系统可能仍依赖于Axis1.3,因此理解和使用这个版本仍然是...
本书《Quickstart Apache Axis2》由Deepal Jayasinghe撰写,旨在为读者提供一个实用的指南,帮助读者快速掌握如何使用Apache Axis2创建高质量的Web服务。 #### 二、核心概念与术语 - **SOAP (Simple Object Access...
《Quickstart Apache Axis2》是一本非常实用的指南,适合希望了解并掌握Apache Axis2的开发者阅读。通过学习本书,读者不仅可以了解到Apache Axis2的核心特性和使用方法,还能深入理解如何利用该框架构建高效稳定的...
Apache Axis1.4是Apache软件基金会的一个开源项目,旨在提供一个完整的SOAP协议实现,它支持Web服务的创建、部署和使用。Axis项目最早是作为Apache SOAP项目的后继者出现的,用于解决在旧版本中遇到的问题和限制。...
【AXIS入门指南-webservice】 本指南旨在为初学者提供AXIS框架下开发WebService的详细步骤,涵盖了从获取开发资源、生成 stub、编写服务器端代码到客户端测试的全过程。AXIS是一个开源的Java库,它提供了创建、部署...