javawebservices:用Axis 1.1 for Java进行Web Services开发(1)来源: 发布时间:星期三, 2008年12月17日 浏览:2次 评论:0
用Axis 1.1 for Java进行Web Services开发
下面所有几乎来自Axis1.1文档但不完全来自文档本人做了部分修改这些修改完全出自国内读者需要
什么是SOAP?
SOAP是个基于XML用于应用的间通信数据编码传输协议最初由微软和Userland Software提出随着不断地完善和改进SOAP很快被业界广泛应用目前完全发布版本是1.1在其发展过程中W3C XML标准工作小组积极促成SOAP成为个真正开放标准在写作此文档的时SOAP1.2草案已经发布1.2对1.1中相对混乱部分做了改进
SOAP被广泛作为新代跨平台、跨语言分布计算Web Services重要部分
这里太肤浅介绍说明请参阅我整理步步学习SOAP
什么是Axis?
Axis本质上就是个SOAP引擎提供创建服务器端、客户端和网关SOAP操作基本框架Axis目前版本是为Java编写不过为C版本正在开发中
但Axis并不完全是个SOAP引擎它还包括:
? 是个独立SOAP服务器
? 是个嵌入Servlet引擎(例如Tomcat)服务器
? 支持WSDL
? 提供转化WSDL为Java类工具
? 提供例子
? 提供TCP/IP数据包监视工具
Axis是第 3代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服务访问途经
? 基于ServletHTTP传输
? 基于JMS传输
? 独立服务器(但需要HTTP 服务器和Servlet容器支持)
? 提供客户端、服务器端相关应用样例
Axis运行需要如下组件包
? axis.jar
? jaxrpc.jar
? saaj.jar
? commons-logging.jar
? commons-discovery.jar
? wsdl4j.jar
? 符合JAXP-1.1XML处理器
步步开始用Axis进行Web Services操作
下面给出段简单Web Services思路方法客户端代码(由于原文档中直接用导入包方式初学者不易了解那个类在那个包中所以下面我做了些简单修改希望能给学习者清晰思路):
public TestClient {
public void (String args) {
try{
String endpo="http://localhost:8080/axis/SayHello.jws?wsdl";// web服务url地址这里是个http请求希望得到结果是wsdl文档
org.apache.axis.client.Service service= org.apache.axis.client.Service;//建立请求服务框架例子
/*
* org.apache.axis.client.Service实现JAX-RPCs javax.xml.rpc.Services接口
* 该接口充当产生下面提到org.apache.axis.client.Call例子
* 角色
*/
org.apache.axis.client.Call call=(org.apache.axis.client.Call)service.createCall;//从框架中生成个维护例子
/*
* org.apache.axis.client.Call实现了JAX-RPCs javax.xml.rpc.Call接口
*/
call.TargetEndpoAddress( java.net.URL(endpo));
call.OperationName( javax.xml..QName("http://www.edu-edu.com.cn/luopc/ws","echoString"));//设置需要名称
String result=(String)call.invoke( Object{"hello!"});
.out.prln(result);
}catch(Exception e){
.err.prln(e.toString);
}
}
}
上面代码可能和原文档中区别并且在名称空间、多态上会给用户造成糊涂不过别急我在翻译手册同时会加入很多解释代码如果哪位纯粹看不懂可以通过邮件获取帮助:[email protected] 邮件主题必须是我提供文档名称
通过上面代码最终生成向服务器请求SOAP信息包具体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:echoString xmlns:ns1="http://www.edu-edu.com.cn/luopc/ws">
<arg0 xsi:type="xsd:">Hello!</arg0>
</ns1:echoString>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这里我不再多少细心朋友请从代码中找相应对应信息来进行自己逻辑理解至于SOAP协议在我以后翻译文档中会加入进去
从上面代码中我们在时候输入了参数 Object{“hello!”}然后从生成SOAP请求包中可以看到自动序列化成<arg0 xsi:type="xsd:">Hello!</arg0>你可以看到参数名称为arg0类型为xsd:其实在Axis客户端我们可以直接通过具体思路方法来设置每个参数名称、类型以及返回值类型如下代码:
call.addParameter("testParam",
org.apache.axis.Constants.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.ReturnType(org.apache.axis.Constants.XSD_STRING);
加入上面代码的后生成如下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://www.edu-edu.com.cn/luopc/ws">
<testParam xsi:type="xsd:">Hello!</testParam>
</ns1:echoString>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
可以作简单对比
也许你会疑惑设置参数名称和不设置参数名称有什么区别疑问这里作简单解释:
1. 为什么要call.ReturnType(org.apache.axis.Constants.XSD_STRING)?
上面你可以或者可以不但当返回结果中没有标明数据类型时Axis就不知道如何进行数据类型转换当然如果返回类型你很清楚并且返回应答SOAP结果中表明了相应数据类型你便可以不进行上面
2. 为什么要设置参数名称和类型?
好了下在你知道了如何Web Services了下面告诉你如何写作和发布Web Services
通过Axis发布Web Services
这里写作个简单类然后步步进行发布希望用户能够从中理出些思路来我在其他有关Web Services文章中会专门针对Web Services通用发布思路方法虽然Web Services牵涉到很多复杂知识但请大家不要感觉到这些操作简单也许你已经有很多疑问没关系记下你疑问不断投试
public SayHello {
public String echoString(String hello){
hello;
}
}
哈哈这个类是不是太简单了
步步来
Axis提供两种将Java类发布成Web Services途径即即时快速自动发布和通过配置文件进行发布我们首先从最容易部署入手
JWS----即时部署
简单说就是将自己写Java类源文件按定规则Copy到特定目录下便可自行被Axis部署具体步骤如下:
? 将上面写SayHello.java复制到axis目录下
? 改名为SayHello.jws
注意:在你写类中不能有具体包信息这正是Axis即时部署不支持
运行我们前面写客户端进行测试运行结果是hello!
目前你是否有如下问题?
如果类中用多态将如何处理?
其实很简单我们知道在每次发出请求的前代理在后台会直接请求你给URL这里是http://localhost:8080/axis/SayHello.jws?wsdl其实这请求返回来是WSDL描述文件通过具体描述文件内容和你输入参数类型比较最终确定发送什么请求细节上解释需要用户阅读SOAP具体内容我也会提供相应权威文当翻译
Axis客户端默认就是通过HTTP协议传输吗?
如何将自己定义类型进行映射?
通过WSDD自定义部署
上面自动部署相当简单但当你需要
? 映射自己类型时
? 不需要暴露源代码时
? 需要自己路径和包管理时
? 对用户操作Web Services事件进行相应时
就需要通过WSDD来自定义部署
前面新特性中提到过Axis是个很灵活可配置系统但在配置的前你得懂得Axis Web Services描述文档(WSDD)格式和意义这里有个简单例子(deploy.wsdd):
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="SayHello2" provider="java:RPC">
<parameter name="Name" value="luopc.ws.SayHello"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
很简短描述就会自定义对特定类以Web Services形式发布上面每个service项都会意味着开通个相应可被WSDL文件引用服务其内部描述信息将会描述从请求-处理请求-应答需要所有核心信息这里provider=”java:RPC”对应着相应服务类为org.apache.axis.providers.java.RPCProvider其实你可以通过多种方式提供相应服务在有关Axis架构文章中将会详细解释这些内容
上面各个参数我不再解释我想大家看就明白
下面让我们在上面简单配置上开始步步进行各种高级配置:
服务存活范围
Axis提供Session、Request和Application 3种可选范围配置具体配置标记为:
<service name="MyService"...>
<parameter name="scope" value="value"/>
...
</service>
旦你完成上面文件可以写个脚本批处理文件来完成部署批处理文件如下:
java -path F:\resource\tools\axis-1_1\lib\axis.jar;F:\resource\tools\axis-1_1\lib\commons-discovery.jar;F:\resource\tools\axis-1_1\lib\jaxrpc.jar;F:\resource\tools\axis-1_1\lib\commons-logging.jar;F:\resource\tools\axis-1_1\lib\log4j-1.2.8.jar;F:\resource\tools\axis-1_1\lib\wsdl4j.jar;F:\resource\tools\axis-1_1\lib\j2ee.jar org.apache.axis.client.AdminClient sayHelloD.wsdd
上面些jar文件都是Axis运行需要组件所以必须添加到环境中上面目录是我机器里目录你可以按自己目录进行
如果部署成功会输出<Admin>Done processing</Admin>信息
但本人这里再强调几个:
? 你首先要将你编译好类放到axis/web-inf/es/下面
? 可以通过http://localhost:8080/axis/services/SayHello2来
? 你可以从我配置文件中发现了包概念
? 可以用相应xml文件进行卸载已部署服务
卸载思路方法如下:
编写如下XML文档
<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
<service name="MyService"/>
</undeployment>
把上面批处理文件中sayHelloD.wsdd换成该文件便可
继续关注高级部署
如果你想知道自己某个Web Services被多少次你应该如何做呢?
Axis提供了相应跟踪机制
? 首先你应该编写个满足定接口事件处理类
? 在配置文件中添加事件处理器信息
我们先看看配置文件中信息:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- the logging handler configuration -->
<handler name="track" type="java:samples.userguide.example4.LogHandler">
<parameter name="parameter1" value="访问该services"/>
</handler>
<!-- the service, using the log handler we just d -->
<service name="SayHello2" provider="java:RPC">
<requestFlow>
<handler type="track"/>
</requestFlow>
<parameter name="Name" value="luopc.ws.SayHello"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
上面绿色部分起到核心配置信息提供
下面提供个事件处理类同样来自原文档但为了更清晰我同样将所有类前面加上了包名称
package luopc.ws;
/**
* @author luopc
*/
public EventHandler extends org.apache.axis.handlers.BasicHandler{
public void invoke(org.apache.axis.MessageContext mtxt){
String param=(String)getOption("parameter1");
.out.prln(param);
}
public void (String args) {
}
}
就这样我们对请求跟踪了嘻嘻
可以远程进行管理(不推荐)
前面就提到服务类型问题在Axis有 4种类型服务分别为RPC、Document、Wrapped和Message
0
相关文章
读者评论
发表评论 |