- 浏览: 371029 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
jiangli19192:
...
自己写的一个启动JBoss服务器的bat批处理 -
56553655:
最好这样:java -Xms3700M -Xmx3700M - ...
测试本机JVM支持的最大内存 -
lizhiy05:
学习一哈……
Web Services体系结构及相关概念 -
ghy200692162:
System.out.println("开始注册Js ...
基于OSGi的JSF Web组件开发问题求解 -
xiao888lin:
你的头像看起来很像我们宿舍老四。。。
测试本机JVM支持的最大内存
在Axis2对Web Services的众多实现方式中,POJOs方式很明显是最简单的一种了。对于Axis2的相关配置,由于我在此前专题(http://danlley.iteye.com/blog/101975)中已经进行过相关的说明,因此,这里我就不再重复阐述了。
为了能够很快进入状态,我们立即开始一个简单的工程,用来说明POJOs的发布和使用,该例子程序用于完成一个简单的更新和查询操作。
定义服务类
xml 代码
- package samples.quickstart.service.pojo;
- import java.util.HashMap;
- public class StockQuoteService {
- private HashMap map = new HashMap();
- public double getPrice(String symbol) {
- Double price = (Double) map.get(symbol);
- if(price != null){
- return price.doubleValue();
- }
- return 42.00;
- }
- public void update(String symbol, double price) {
- map.put(symbol, new Double(price));
- }
- }
给工程编写Ant脚本:
xml 代码
- <project basedir="." default="generate.service">
- <property name="build.dir" value="build" />
- <target name="compile.service">
- <mkdir dir="${build.dir}" />
- <mkdir dir="${build.dir}/classes" />
- <javac debug="on" fork="true" destdir="${build.dir}/classes" srcdir="${basedir}/src/main/java">
- javac>
- target>
- <target name="generate.service" depends="compile.service">
- <copy toDir="${build.dir}/classes" failonerror="false">
- <fileset dir="${basedir}/src/main/resources">
- <include name="**/*.xml" />
- fileset>
- copy>
- <jar destfile="${build.dir}/StockQuoteService.aar">
- <fileset excludes="**/Test.class" dir="${build.dir}/classes" />
- jar>
- target>
- project>
从Ant脚本的配置可以看出我们的工程相关配置:
工程源代码路径:src/main/java
资源文件路径:src/main/resources
编译路径:build
在src/main/resources路径下新建一个META-INF路径,在该路径下定义services.xml,内容如下:
xml 代码
- <service name="StockQuoteService" scope="application" targetNamespace="http://quickstart.samples/">
- <description>Stock Quote Servicedescription>
- <messageReceivers>
- <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
- class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
- <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
- class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
- messageReceivers>
- <schema schemaNamespace="http://quickstart.samples/xsd"/>
- <parameter name="ServiceClass">samples.quickstart.service.pojo.StockQuoteServiceparameter>
- service>
这样所有的事情都已经准备好了,好像没有引用AXIS2的资源文件呀!?需要吗!呵呵呵呵,当然不需要!谁让我是POJOs呢。
从上面的配置可以看出,工程中除了多出一个services.xml文件外,工程几乎与普通工程没什么两样。这也是POJOs中很值得称道的一点——简单!services.xml中对MEP(Message Exchange Pattern)的声明中也是格外的粗粒度。它笼统的告诉Web Services容器,我这里的方法需要支持in模式和in-out模式两种方式,至于是哪个方法支持哪一种模式,我不告诉你,自己去猜吧。呵呵呵呵。我只告诉你,我的ServiceClass是samples.quickstart.service.pojo.StockQuoteService
我需要在这里做一点申明:services.xml的粗粒度声明,纯粹属于我个人的“偷懒”行为,而实际上在实际的应用当中,为了明确期间,一般是不会采取我这种处理方式的。通常都需要对每个方法说明MEP方式
很明显Axis2最后需要的发布文件是一个aar包。但是我要说明的一点就是,我们这里的aar包的包名必须与ServiceClass的名称(在我们这个工程当中,也就是StockQuoteService)完全一致(包括大小写)。
在工程根目录下打开命令行运行ant脚本(前提是你已经配置了Ant环境变量),执行结果如下:
D:\eclipse\workspace\axis2pojoslab>ant
Buildfile: build.xml
Buildfile: build.xml
compile.service:
[mkdir] Created dir: D:\eclipse\workspace\axis2pojoslab\build
[mkdir] Created dir: D:\eclipse\workspace\axis2pojoslab\build\classes
[javac] Compiling 1 source file to D:\eclipse\workspace\axis2pojoslab\build\
classes
[javac] 注意: D:\eclipse\workspace\axis2pojoslab\src\main\java\samples\quic
kstart\service\pojo\StockQuoteService.java 使用了未经检查或不安全的操作。
[javac] 注意: 要了解详细信息,请使用 -Xlint:unchecked 重新编译。
[mkdir] Created dir: D:\eclipse\workspace\axis2pojoslab\build
[mkdir] Created dir: D:\eclipse\workspace\axis2pojoslab\build\classes
[javac] Compiling 1 source file to D:\eclipse\workspace\axis2pojoslab\build\
classes
[javac] 注意: D:\eclipse\workspace\axis2pojoslab\src\main\java\samples\quic
kstart\service\pojo\StockQuoteService.java 使用了未经检查或不安全的操作。
[javac] 注意: 要了解详细信息,请使用 -Xlint:unchecked 重新编译。
generate.service:
[copy] Copying 1 file to D:\eclipse\workspace\axis2pojoslab\build\classes
[jar] Building jar: D:\eclipse\workspace\axis2pojoslab\build\StockQuoteSer
vice.aar
[copy] Copying 1 file to D:\eclipse\workspace\axis2pojoslab\build\classes
[jar] Building jar: D:\eclipse\workspace\axis2pojoslab\build\StockQuoteSer
vice.aar
BUILD SUCCESSFUL
Total time: 2 seconds
Total time: 2 seconds
这时,在工程的build路径下就会出现已经打包成功的aar包:StockQuoteService.aar。打开此aar包,看看META-INF路径,是否在该路径存在services.xml。确定存在后将其copy到服务器中,本人用的是tomcat6:D:\tomcat6\webapps\axis2\WEB-INF\services启动服务!在IE中访问以下地址:http://localhost/axis2/services/StockQuoteService?wsdl
我们得到以下内容:
xml 代码
- <wsdl:definitions xmlns:axis2="http://quickstart.samples/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns0="http://quickstart.samples/xsd" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://quickstart.samples/">
- <wsdl:documentation>Stock Quote Servicewsdl:documentation>
- - <wsdl:types>
- - <xs:schema xmlns:ns="http://quickstart.samples/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://quickstart.samples/xsd">
- - <xs:element name="getPrice">
- - <xs:complexType>
- - <xs:sequence>
- <xs:element name="symbol" nillable="true" type="xs:string" />
- xs:sequence>
- xs:complexType>
- xs:element>
- - <xs:element name="getPriceResponse">
- - <xs:complexType>
- - <xs:sequence>
- <xs:element name="return" nillable="true" type="xs:double" />
- xs:sequence>
- xs:complexType>
- xs:element>
- - <xs:element name="update">
- - <xs:complexType>
- - <xs:sequence>
- <xs:element name="symbol" nillable="true" type="xs:string" />
- <xs:element name="price" nillable="true" type="xs:double" />
- xs:sequence>
- xs:complexType>
- xs:element>
- xs:schema>
- wsdl:types>
- - <wsdl:message name="updateMessage">
- <wsdl:part name="part1" element="ns0:update" />
- wsdl:message>
- - <wsdl:message name="getPriceMessage">
- <wsdl:part name="part1" element="ns0:getPrice" />
- wsdl:message>
- - <wsdl:message name="getPriceResponse">
- <wsdl:part name="part1" element="ns0:getPriceResponse" />
- wsdl:message>
- - <wsdl:portType name="StockQuoteServicePortType">
- - <wsdl:operation name="update">
- <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:updateMessage" wsaw:Action="urn:update" />
- wsdl:operation>
- - <wsdl:operation name="getPrice">
- <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getPriceMessage" wsaw:Action="urn:getPrice" />
- <wsdl:output message="axis2:getPriceResponse" />
- wsdl:operation>
- wsdl:portType>
- - <wsdl:binding name="StockQuoteServiceSOAP11Binding" type="axis2:StockQuoteServicePortType">
- <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
- - <wsdl:operation name="update">
- <soap:operation soapAction="urn:update" style="document" />
- - <wsdl:input>
- <soap:body use="literal" />
- wsdl:input>
- wsdl:operation>
- - <wsdl:operation name="getPrice">
- <soap:operation soapAction="urn:getPrice" style="document" />
- - <wsdl:input>
- <soap:body use="literal" />
- wsdl:input>
- - <wsdl:output>
- <soap:body use="literal" />
- wsdl:output>
- wsdl:operation>
- wsdl:binding>
- - <wsdl:binding name="StockQuoteServiceSOAP12Binding" type="axis2:StockQuoteServicePortType">
- <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
- - <wsdl:operation name="update">
- <soap12:operation soapAction="urn:update" style="document" />
- - <wsdl:input>
- <soap12:body use="literal" />
- wsdl:input>
- wsdl:operation>
- - <wsdl:operation name="getPrice">
- <soap12:operation soapAction="urn:getPrice" style="document" />
- - <wsdl:input>
- <soap12:body use="literal" />
- wsdl:input>
- - <wsdl:output>
- <soap12:body use="literal" />
- wsdl:output>
- wsdl:operation>
- wsdl:binding>
- - <wsdl:binding name="StockQuoteServiceHttpBinding" type="axis2:StockQuoteServicePortType">
- <http:binding verb="POST" />
- - <wsdl:operation name="update">
- <http:operation location="update" />
- - <wsdl:input>
- <mime:content type="text/xml" />
- wsdl:input>
- wsdl:operation>
- - <wsdl:operation name="getPrice">
- <http:operation location="getPrice" />
- - <wsdl:input>
- <mime:content type="text/xml" />
- wsdl:input>
- - <wsdl:output>
- <mime:content type="text/xml" />
- wsdl:output>
- wsdl:operation>
- wsdl:binding>
- - <wsdl:service name="StockQuoteService">
- - <wsdl:port name="StockQuoteServiceSOAP11port_http" binding="axis2:StockQuoteServiceSOAP11Binding">
- <soap:address location="http://localhost:80/axis2/services/StockQuoteService" />
- wsdl:port>
- - <wsdl:port name="StockQuoteServiceSOAP12port_http" binding="axis2:StockQuoteServiceSOAP12Binding">
- <soap12:address location="http://localhost:80/axis2/services/StockQuoteService" />
- wsdl:port>
- - <wsdl:port name="StockQuoteServiceHttpport1" binding="axis2:StockQuoteServiceHttpBinding">
- <http:address location="http://localhost:80/axis2/rest/StockQuoteService" />
- wsdl:port>
- wsdl:service>
- wsdl:definitions>
这就是大名鼎鼎的WSDL了,我们当初没有定义这个文件的原因就是容器在运行过程中会自动根据你的services.xml中的配置信息生成我们所必需的WSDL。
任何信息人们总会要求他详细点,然后可以了解更多,但是有时候详细也会带来很多不便,到目前为止,我看到WSDL的时候还是有点晕,呵呵呵呵,尤其是当其中的方法较多的情况下,简直能够让人崩溃。怎么办?访问这个地址吧:http://localhost/axis2/services/StockQuoteService?xsd
(tomcat在默认情况下的端口为8080,本人一向比较懒惰为了访问时少输入点东西在地址栏,我把端口改成了80)
xml 代码
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:axis2="http://quickstart.samples/" xmlns:ns="http://quickstart.samples/xsd" xmlns:ns0="http://quickstart.samples/xsd" xmlns:ns1="http://org.apache.axis2/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://quickstart.samples/xsd">
- <xs:element name="getPrice">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="symbol" nillable="true" type="xs:string" />
- xs:sequence>
- xs:complexType>
- xs:element>
- <xs:element name="getPriceResponse">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="return" nillable="true" type="xs:double" />
- xs:sequence>
- xs:complexType>
- xs:element>
- <xs:element name="update">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="symbol" nillable="true" type="xs:string" />
- <xs:element name="price" nillable="true" type="xs:double" />
- xs:sequence>
- xs:complexType>
- xs:element>
- xs:schema>
这些信息已经足够满足我们编写客户端程序的需要了。其中的symbol是我们在调用getPrice过程中需要传入的参数,而return是返回的参数。由于update方法不需要返回值,因此只有传入的参数symbol和price。这些信息是我们在下面的操作中都需要用到的。
不过在这个例子中,我们甚至根本就不需要编写客户端程序。仅仅通过访问就可以执行服务提供的接口。
xml 代码
- <ns:getPriceResponse xmlns:ns="http://quickstart.samples/xsd">
- <ns:return>42.0ns:return>
- ns:getPriceResponse>
这个是我们的程序在没有任何数据的情况下返回的默认值。
接下来让我们来更新数据:
你会发现执行完后没有任何反应,没关系让我们继续回过来在访问地址http://localhost/axis2/rest/StockQuoteService/getPrice?symbol=danlley
xml 代码
- <ns:getPriceResponse xmlns:ns="http://quickstart.samples/xsd">
- <ns:return>100.0ns:return>
- ns:getPriceResponse>
是不是数据已经成功得到修改了?!
评论
2 楼
baicker
2007-12-19
webservice实现方式的疑问:
通过Axis2实现Web Services有很多方式(POJO,AXIOM...),
那么客户端掉用时候的方式是不是必须和Services实现的方式一样呢?(比如说Services是通过AXIOM实现的,调用的时候就必须用AXIOM来实现客户端;用ADB方式实现的客户端就无法调用AXIOM实现的Services)
如果是的话是不是有些违背web services的原则呢?
恳请作者赐教。
(baicker@163.com)
通过Axis2实现Web Services有很多方式(POJO,AXIOM...),
那么客户端掉用时候的方式是不是必须和Services实现的方式一样呢?(比如说Services是通过AXIOM实现的,调用的时候就必须用AXIOM来实现客户端;用ADB方式实现的客户端就无法调用AXIOM实现的Services)
如果是的话是不是有些违背web services的原则呢?
恳请作者赐教。
(baicker@163.com)
1 楼
zhgzhang
2007-08-09
POJO的方式确实简单,问题是如果选用POJO的这种方式来发布我的Web Service是不是有什么限制?比如我的Service需要接收文件(文件流作为参数)或者比较复杂的数据对象,POJO也可以吗.
既然POJO的方式这么简单,为什么还会有其他的方式呢?其他方式存在的必要性是什么?
恳请作者赐教。
既然POJO的方式这么简单,为什么还会有其他的方式呢?其他方式存在的必要性是什么?
恳请作者赐教。
发表评论
-
让mybatis支持管理和操作多个不同的业务数据库实例
2017-05-07 21:25 6402在微服务大行其道的今天,一个工程中同时操作多个不同的业务数 ... -
Spring Acegi鉴权管理之基础模式(BASIC)
2017-05-01 01:25 1102Acegi久负盛名,这个家伙是一个spring中广泛使用的认 ... -
Restful架构服务构建指南
2017-04-17 01:19 543REST定位为“分布式超媒体应用(Distributed H ... -
集成ibatis的spring工程升级到spring4.0实操手册
2017-04-03 21:57 3296Spring4及已经的版本放弃了对ibatis的集成支持, ... -
Docker使用之Java web应用部署
2017-03-26 13:50 4046此篇博客一部分内容 ... -
Java设计设计模式之桥接模式(Bridge)
2017-03-11 19:19 0... -
Java设计设计模式之组合模式(Composition)
2017-03-11 17:32 1089那王麻子自从做了肉夹馍生意后,真是风生水起,分店开的跟下饺 ... -
Java设计设计模式之适配器模式(Adaptor)
2017-03-05 15:29 1555我的博客自从2008年以 ... -
RBAC原理介绍及开源框架kasai使用分析
2008-08-13 16:20 10572RBAC 模型作为目前 ... -
用Maven Plug-In来构建Corba开发环境
2008-03-21 10:49 3072这两天研究Corba,总是感觉需要在Java的命令行执行“id ... -
LDAP介绍
2008-03-18 09:57 16731.1. LDAP是什么 LDAP是轻量目录访问协议,英文全称 ... -
Java与CORBA技术结合的前景展望
2008-03-13 11:09 1946随着Internet、Intranet及Extranet在全球 ... -
Drools规则引擎应用总结
2008-02-01 10:07 0package com.playphone.qc.workfl ... -
详解Axis2实现Web Services之ADB篇
2007-07-17 22:35 10045构建一个新的Web Services服务,会有很多种不同的方法 ... -
详解Axis2实现Web Services之AXIOM篇
2007-07-17 22:30 7001AXIOM——AXis 对象模型(AXis Object M ... -
Web Services体系结构及相关概念
2007-07-17 22:20 3914Web Services体系结构是面向对象分析与设计(OOA ... -
Spring包结构以及各个包之间引用关系说明
2007-07-17 22:02 5168Spring 包结构说明: spring.jar 包含 ... -
从Hello World开始深入Ajax
2007-07-17 21:11 16471. 初始化XMLHttpRequest对象 ... -
在Javascript中用来获取页面焦点信息
2007-07-17 16:59 4222在Javascript中用来获取页 ... -
详解Hibernate与WebService结合使用
2007-07-17 16:58 2502以前一直在研究EJB和Struts,最近开始研究Hiber ...
相关推荐
Java 中,使用axis来实现webServices 里面包含Word详细说明使用webservices的步骤, 看了就会啦, 使用webServicers里面jar ,和工具都包含在里面。。。 如果你要实现webservies的话, 不看后悔死你。。。。
### Axis2 开发 Web Services 入门 #### 知识点概述 本文旨在介绍如何使用 Axis2 开发 Web Services 的全过程,包括环境搭建、插件安装等基础准备工作,以及具体的开发流程与实例演示。 #### 1. 环境搭建 ##### ...
Chapter 1, Apache Web Services and Axis2 - Gives you an introduction to web services and the web service stack at Apache. Chapter 2, Looking inside Axis2 - Learn about Axis2 architecture and the ...
Java和Axis2是开发Web服务客户端的重要工具,用于调用基于SOAP协议的Web服务。本文将深入探讨如何利用Java和Axis2库来实现这一功能,同时结合提供的代码示例进行详细解析。 首先,Web服务是一种通过网络进行通信的...
2. **生成服务描述文件(WSDL)**:基于服务类,使用Axis2工具生成WSDL(Web Services Description Language)文件,描述服务的接口、操作和绑定。 3. **创建服务 Archive (AAR) 文件**:将服务类、依赖库和WSDL打包...
Extensive and detailed coverage of the enterprise ready Apache Axis2 Web Services / SOAP / WSDL engine. Attain a more flexible and extensible framework with the world class Axis2 architecture. Learn ...
包括3本Axis2的书(英文),實為2本(第1本有...1.Developing Web Services with Apache CXF and Axis2, 3rd Edition 2.Packt.Publishing.Quickstart.Apache.Axis2 3.Develop Web Services With Apache Axis2 PDF格式
Axis2是Apache的一个项目,它提供了一种高效的Web服务实现框架,支持SOAP和RESTful风格的服务。以下是如何在Eclipse环境中利用Axis2来创建Web服务的详细步骤: 首先,确保你已经安装了Eclipse IDE,并且安装了相关...
9. **axis2-jaxws.jar**:支持JAX-WS(Java API for XML Web Services)规范,使得Axis2能够与Java SE和EE环境无缝集成。 10. **log4j.jar, slf4j-api.jar, slf4j-log4j12.jar**:日志框架,用于记录开发和运行时的...
axis 实现 web services java 实例 webservices 参考:http://blog.csdn.net/chinarenzhou/article/details/7609953
### 使用Axis1开发Web Services入门知识点详解 #### 一、实验背景与目标 在学习如何使用Axis1开发Web Services之前,我们首先需要了解几个基本概念:Web Services是一种平台独立的服务形式,它允许不同应用程序...
【Web Services Axis实现】 Web Services是一种基于互联网的、平台无关的分布式计算模型,它允许不同系统间的应用程序通过网络进行通信和交互。Axis是Apache软件基金会开发的一个开源工具,专门用于实现Web ...
通过上述步骤,我们可以成功地将Axis2与Spring框架集成在一起,实现WebServices服务的发布。这种方式不仅充分利用了Axis2在Web服务领域的优势,同时也发挥了Spring框架在管理Bean和服务实现方面的强大功能。对于企业...
本示例将详细介绍如何使用JAX-WS(Java API for XML Web Services)发布Web服务,并利用Axis2作为客户端获取Web服务的数据。 首先,让我们深入理解JAX-WS。JAX-WS是Java平台的标准组件,它简化了创建和消费Web服务...
也可以自行去 apache官网下载 ,另外还包含一个已经集成了axis2的web工程源码 使用的jdk1.6开发,可以直接把web工程导入到myeclipse,部署到tomcat可运行后,浏览器输入 http://localhost:端口号/Axis2Web/services/...
标题中的“Axis2之使用services.xml发布带包的Webservice”指的是在Apache Axis2框架下,通过services.xml配置文件来发布包含多个类或包的Web服务。Apache Axis2是Java平台上的一个开源Web服务框架,它允许开发人员...