当前位置: 代码迷 >> Web前端 >> 传智播客-web service(五)-利用axis开发WS应用
  详细解决方案

传智播客-web service(五)-利用axis开发WS应用

热度:197   发布时间:2012-11-06 14:07:00.0
传智播客-web service(5)-利用axis开发WS应用
Axis 1、再说soap。 前文说过,soap是基于xml的通信协议和编码格式以便用于应用程序间通信。最初是由微软和userland构思,已经历了几代的发展,当前是soap1.2,尽管版本1.1很普遍。W3C的xml协议工作组负责这一规范。 soap被广泛认为是跨平台、跨语言分布式计算应用的新一代支撑. web services是一种技术方案,而在这个方案中用得最广泛的技术实现就是soap。 2、什么是axis呢? axis本质上是soap引擎,是soap第三代产品(始于ibm的soap4j),是web service方案中解析xml的引擎,一个用于构建soap处理器比如客户端、服务器端、网关等等的框架。当前的版本是用java写的,axis客户端的c++实现正在开发中。Axis不只是soap引擎,它还包括: (1)简单的独立服务器; (2)可以插入到servlet引擎(比如tomcat)中的服务器; (3)Wsdl的扩展支持; (4)从wsdl生成java类; (5)一些样例程序; (6)监控tcp/ip包的工具; 通常xml解析有两种机制:SAX和DOM。SAX的xml解析方式基于事件,一次加载--加载过程依次触发节点事件、元素事件,在事件处理中可以加入业务逻辑代码;DOM则是基于(DOM)对象,两次加载--第一次加载xml文件,第二次遍历文件生成DOM树。axis的底层xml解析机制采用的是SAX,所以灵活高效。 虽然可以自行开发解析xml的代码,但是很麻烦,而且要关注细节,所以一般面向对象的开发很少会自行开发xml解析代码,而都是利用诸如axis这样的框架。譬如有些开发会用到dom4j这样的xml解析工具包。 采用Axis方式开发WS客户端 1、既然axis是框架,所以第一步是下载该框架包。然后可以将该包webapps目录下的axis项目拷到tomcat的webapps目录下,可以从IE中访问,先睹为快,具体操作步骤请参见前文。 2、将该项目lib包内的jar文件拷到新建的axisclient项目lib目录下,设为类路径。这里新建的项目为一般的java项目即可。然后编写如下示例代码: public class App { public static void main(String[] args) throws Exception { Service service = new Service(); Call call = (Call) service.createCall(); //设置调用的目标终端地址 String url = "http://localhost:8888/axis/EchoHeaders.jws"; call.setTargetEndpointAddress(new URL(url)); //设置调用的操作名称 call.setOperationName("echo"); //调用服务(参数是对象数组) Object o = call.invoke(new Object[]{"tom"}); System.out.println(o);//打印的结果即"tom" } } 上述代码表示一个客户端访问axis服务,服务的请求地址为url--当然是部署好axis项目后才能有这个地址,在java中,echo可视为EchoHeaders服务对外开放的一个方法,这个方法的定义是返回传入的参数。再通过web service explorer或TCP/IP Monitor查看请求响应的数据。 参数在上述代码运行后的xml数据中为<arg0 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:string">tom</arg0>,很显然参数名“arg0”的可读性很差。可以在调用invoke方法之前加入下列代码更改: //设置xml文档中的消息的元素名称 call.addParameter("name", Constants.XSD_STRING, ParameterMode.IN); xml文档中的参数即表示为<name xsi:type="xsd:string">tom</name>。里面的“XSD”表明采用的schema方式规定xml结构,因为XSD比DTD表达更丰富--最起码它可以定义数据类型,DTD就不可以。 也可以设置返回类型(还是在invoke方法调用前):call.setReturnType(Constants.XSD_STRING)。 3、所有远程调用的最底层机制肯定都是socket。可以通过org.apache.axis.transport.http.HTTPSender类的源码看到axis是如何运用socket机制创建连接,发送和接收输入(InputStream)输出(OutputStream)流以及如何生成请求响应数据信息的具体过程。
  相关解决方案