1. 基本概念
SOA :面向服务的体系结构(Service-Oriented Architecture,SOA)
SOAP:(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的轻量级协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上, 以任何一种语言相互通信。
SOAP包括四个部分:
SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;
SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;
SOAP绑定(binding),使用底层协议交换信息。
2. WebService体系结构
Web Services 服务提供方通过WSDL(Web Services Description Language) 描述所提供的服务,并将这一描述告知Web Services 注册服务器。注册服务器依据WSDL 的描述,依照UDDI (Universal Description Discovery and Integration) 的协定更新服务目录并在Internet 上发布。用户在使用Web Services 前先向注册服务器发出请求,获得Web Services 提供者的地址和服务接口信息,之后使用SOAP 协议(Simple Object Access Protocol) 与Web Services 提供者建立连接,进行通信。Web Services 的技术主要建立在XML 的规范之上,这保证了这一体系结构的平台无关性、语言无关性和人机交互性能。
3. WebService原理
客户端通过get请求可以得到wsdl文件,也就知道服务器提供的方法和参数了,然后客户端会通过webservice提供的工具类(通常为wsdl to java生成相应的类)。 接下来,客户端会向webservice发送一个soap请求,这个soap请求实际上就是一段xml代码,然后server接收到soap请求,然后进行相应的处理,并将响应结果以soap 方式发送回客户端。
4.Axis
Axis本质上就是一个SOAP引擎(Apache Axis is an implementation of the SOAP),提供创建服务器端、客户端和网关SOAP操作的基本框架。
但Axis并不完全是一个SOAP引擎,它还包括:
是一个独立的SOAP服务器。
是一个嵌入Servlet引擎(例如Tomcat)的服务器。
支持WSDL。
提供转化WSDL为Java类的工具。
提供例子程序。
提供TCP/IP数据包监视工具。
WSDL(Web Service Description Language)Web服务器描述语言是用XML文档来描述Web服务的标准,是Web服务的接口定义语言
WSDD就是WEB服务分布描述(Web Service Deployment Descriptor), 它定义了WEB服务的接口,如服务名、提供的方法、方法的参数等信息。
UDDI就是统一描述、发现和集成(Universal Description, Discovery, and Integration)。
UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。
AXIS有四种service styles,分别是:RPC, Document, Wrapped, 和Message。最常用的就是RPC和Message。
RPC:
在AXIS中是一个默认选项。当你部署的时候使用下列两种方式: 或则 ,它遵循SOAP RPC和编码规则。
每个RPC都包括一个表示名称的外部接点和一些表示参数的内部接点。AXIS会根据规则将一个XML(WSDL文件)
文件转化成一个JAVA对象,并对对想赋上在文件中描述的值。也可以根据规则将一个JAVA对象转化成XML文件。
Message:
以这种方式部署的话,会使AXIS失去意义,它使你的代码真正的用XML形式,而不需要转化成JAVA对象。
基于RPC(远程过程调用)方式,这也是Web服务最常用的方式。面向消息/文档的的类型跟RPC不同的是它提供了一个更底层的抽象,要求更多的编程工作。客户端可以传入任何的XML文档,得到的响应不一定是SOAPEnvelope,可以返回任何它所需要的东西,甚至不返回。
虽然这对开发者来说非常的灵活,但是这种通讯类型在实际的应用中并不常见。面向消息/文档的Web服务主要适合于下面几种情况,
比如批量处理,基于表单的数据导入,有需要返回非XML数据时,Web服务器实现中要求直接访问传输层等等
Webservice的工作方式一般包括:远程方法调用和消息发送
远程方法调用:比较简单,两端可以直接使用对方返回来的对象,不用关系他们是怎么解析的。
消息发送: (style="message") 一般直接传送xml数据格式。适合传递的数据已经是xml类型的。
Webservice返回对象一般要配置beanMapping , typeMapping
beanMapping 一般指简单的javaBean,只包括Getter和Setter方法。
typeMapping可以处理比较复杂的类型。比如附件的DataHandler ,当然也包括简单类型。所以只用TypeMapping即可。
注:
wsdd -Web Service Deployment Descriptor,部署文件
wsdl -Web Service Deployment Language,WebService描述
wsdd和wsdl的区别在于前者只描述Web服务和操作方法以及传输方式,它相对于wsdl要简单的多,更易被人读懂。
Axis支持三种web service的部署和开发,分别为:
1、Dynamic Invocation Interface ( DII) 如.jws
2、Stubs方式 如:.wsdd
3、Dynamic Proxy方式
axis 配置:
1. axis所需要的包配置在环境变量path中,因为生成service-config.wsdd文件要用到。
用Eclipse开发时,要把axis包放到项目的web-inf/lib 目录下,链接的话好像有问题,会报找不到所需要的包。
axis 返回一个自定义对象。我自己在做的时候遇到的一些问题。
服务器端配置:
自定义对象 User.java
package com.gui.webservice;
import java.util.Date;
public class User {
private String name = "qin";
private int age = 25;
private Date date;
public String toString() {
return "name " + name + " age " + age + " date " + date;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
主程序,向外提供接口
package com.gui.webservice;
public class ServiceServer {
public String getName(String name) {
if (name == null) {
name = "";
}
return "你好" + name + ",欢迎来到Web服务的世界!";
}
public User getUser(User user) {
System.out.println(" 传来对象的用户名====" + user.getName());
return user;
}
public User[] getUserList(User[] user) {
System.out.println("从客户端传过来对象的个数======" + user.length);
return user;
}
public String getUserName(User user) {
return user.getName();
}
public User getUser(String name, String password) {
return new User();
}
}
2. 在项目的web-inf目录下建一个deploy.wsdd 文件夹,输入如下内容。
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="User" provider="java:RPC">
<parameter name="scope" value="Request" /><!-- 要发布的类-->
<parameter name="className"
value="com.gui.webservice.ServiceServer" /><!-- *表示所有的public方法都发布,如果不是public就不发布,或者把想发布的发放名字列出,方法名之间用空格隔开-->
<parameter name="allowedMethods" value="*" /><!-- 和typeMapping差不多,-->
<beanMapping languageSpecificType="java:com.gui.webservice.User"
qname="ns1:User" xmlns:ns1="com.gui.webservice" /><!-- 返回一个自定义对象的配置-->
<typeMapping languageSpecificType="java:com.gui.webservice.User"
qname="ns2:User" xmlns:ns2="com.gui.webservice"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" />
<!-- 返回数组列表的配置 ,encodeStyle是固定的-->
<typeMapping xmlns:ns="http://localhost:8888/services/User"
qname="ns:ArrayOf_tns1_Employee"
type="java:com.gui.webservice.User[]"
serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</service>
</deployment>
3. 打开 程序 --》 运行 cmd ;进入dos目录下 cd进入到项目所在的web-inf 目录下。
输入:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient
- lhttp://localhost:8888/services/User deploy.wsdd
如果成功的话会显示 Processing file deploy.wsdd
<Admin>Done processing</Admin>
同时在web-inf 目录下生成一个service-config.wsdd文件,其中的一部分代码。和在deploy.wsdd文件中配置的beanMapping,typeMapping,typeMapping(返回数组) 是对应的。
<service name="User" provider="java:RPC">
<parameter name="allowedMethods" value="*" />
<parameter name="className"
value="com.gui.webservice.ServiceServer" />
<parameter name="scope" value="Request" />
<typeMapping
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
qname="ns1:User"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
type="java:com.gui.webservice.User" xmlns:ns1="com.gui.webservice" />
<typeMapping
deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
qname="ns2:ArrayOf_tns1_Employee"
serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
type="java:com.gui.webservice.User[]"
xmlns:ns2="http://localhost:8888/services/User" />
<beanMapping languageSpecificType="java:com.gui.webservice.User"
qname="ns3:User" xmlns:ns3="com.gui.webservice" />
</service>
注:java -Djava.ext.dirs=lib 表示 启动 Java 程序时用来修改默认查找扩展类库中类的路径
deploy集体的配置还是看一下axis自带的例子。根据网上的例子,三种类型我一种也没有配置成功。倒是根据axis自带例子一配置就成功了。
-lhttp://localhost:8888/services/User
deploy.wsdd 的格式是 -lhttp://localhost:8888/项目服务名称(如果没有就不写)/services(这个固定)/User(就是deploy.wsdd文件中serviceName的名称) deploy.wsdd
客户端调用:
这个事返回一个自定义对象。
package com.gui.webservice;
import java.util.Date;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
public class Client {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8888/services/User?wsdl";
Service service = new Service();
Call call = null;
QName qn = new QName("http://localhost:8888/services/User",
"getUser");
call = (Call) service.createCall();
call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(
User.class, qn),
new BeanDeserializerFactory(User.class, qn));
call.setReturnType(qn, User.class);
call.setOperationName(qn);
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.addParameter("user", qn, javax.xml.rpc.ParameterMode.IN);
User user = new User();
user.setName("sdf");
user.setDate(new Date());
User ret = (User) call.invoke(new Object[] { user });
System.out.println("return value is " + ret);
} catch (Exception ex) {
ex.getMessage();
ex.printStackTrace();
}
}
}
这个是返回一个数组
package com.gui.webservice;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
public class ClientList {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8888/services/User?wsdl";
Service service = new Service();
Call call = null;
QName qn = new QName("http://localhost:8888/services/User",
"getUserList");
call = (Call) service.createCall();
call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(
User.class, qn),
new BeanDeserializerFactory(User.class, qn));
call.setReturnType(qn, User[].class);
call.setOperationName(qn);
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.addParameter("user", qn, javax.xml.rpc.ParameterMode.IN);
User[] user = new User[] { new User(), new User() };
User[] ret = (User[]) call.invoke(new Object[] { user });
ArrayList al = new ArrayList(Arrays.asList(ret));
System.out.println("return value is " + al.size());
System.out.println("return value is " + ret.length);
} catch (Exception ex) {
ex.getMessage();
ex.printStackTrace();
}
}
}
运行一般情况下没有问题。
分享到:
相关推荐
WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
核心概念在于,Webservice提供了一种标准化的方式,让应用程序能够通过互联网互相通信,就像调用本地函数一样。这种服务通常采用SOAP(Simple Object Access Protocol)协议,以XML格式传输数据,确保跨平台的兼容性...
本文将详细介绍 Oracle 调用 Webservice 的实现过程,包括 Webservice 的基本概念、 Java 编写简单的 WebService 实例、Oracle 服务器端配置、加载 JAR 包、测试调用 PHP Webservice 和 Java Webservice 等内容。...
【WebService基本理论知识】 Web Services是一种基于互联网的、允许不同系统之间进行交互和协作的应用程序组件。它们通过开放协议如HTTP(超文本传输协议)进行通信,并利用XML(可扩展标记语言)作为数据交换的...
### WebService 入门概念详解 #### 一、概述 WebService 是一种支持系统间通信的技术,主要用于实现不同系统之间的交互。随着互联网的发展和技术的进步,不同系统间的协作变得越来越重要。WebService 的出现就是...
### Webservice基本教程知识点概述 #### 一、Webservice简介 Webservice是一种跨语言、跨平台的应用程序间通信协议标准,它允许不同平台上的应用程序通过网络进行数据交换和功能调用。Webservice主要依赖于XML(可...
作为入门教材,这本书旨在帮助初学者快速掌握WebService的基本概念和使用方法。它会讲解如何使用Java和JAX-WS(Java API for XML Web Services)来创建和调用Web Services,同时还会涉及客户端和服务器端的配置与...
1. **WebService基本概念**:WebService是一种基于开放标准(如XML、WSDL和SOAP)的Web应用程序,允许不同系统之间的数据交换。它通过HTTP协议进行通信,使得分布式计算变得简单且可互操作。 2. **数据压缩**:在...
根据提供的文件信息,本文将详细解释一个简单的 WebService 示例,并深入探讨其中的关键概念和技术细节。 ### 一、WebService 概念 #### 1.1 WebService 定义 WebService 是一种支持通过网络进行调用的服务形式,...
WebService基本概念 WebService是一种可以接收从Internet或者Intranet上的其他系统中传递过来的请求,轻量级的独立的通讯技术。它使用SOAP在Web上提供的软件服务,并通过WSDL文件进行说明,并通过UDDI进行注册。...
【深入浅出WebService】这篇文章是面向初学者的指南,旨在帮助读者理解并熟悉WebService的基本概念和技术。WebService是一种基于Web的服务,允许不同系统间通过网络进行通信和数据交换,以实现跨平台、跨语言的互...
1. Webservice 的基本概念:Webservice 是一种基于 XML 的远程调用协议,它允许不同的应用程序之间进行通信。 2. JDK 6.0 自带 Webservice 服务器:JDK 6.0 中自带了一个轻量级的 Webservice 服务器,可以用来发布...
首先,我们需要理解WebService的基本概念。WebService是一种基于XML(Extensible Markup Language)的通信协议,它利用SOAP(Simple Object Access Protocol)进行消息传输,通过WSDL(Web Services Description ...
1. WebService的基本概念,作为接口提供功能给外部调用。 2. XML作为数据传输的格式,以及其在WebService中的应用。 3. 如何在VS2003中创建和配置WebService项目。 4. 使用[WebMethod]特性声明公开的接口函数。 5. ...
WSDL(Web Services Description Language)是另一个关键概念,它是一个XML文档,用于详细描述WebService的接口、消息格式、操作和地址。WSDL文档包含了服务的输入、输出、错误处理以及服务使用的协议等信息,使得...
它是WebService中最常用的通信协议之一,主要用于传递信息、调用远程服务。SOAP消息由四个主要部分组成: 1. **信封(Envelope)**:包含消息本身的通用结构。 2. **头部(Header)**:包含消息传递过程中所需的上...
【VB.NET调用WebService的基本概念】 VB.NET(Visual Basic .NET)是微软开发的一种面向对象的编程语言,它是.NET框架的一部分,支持多种编程模式,包括面向对象编程。WebService是一种基于HTTP协议的Web应用程序,...
首先,理解WebService的基本概念至关重要。WebService是一种通过网络提供可互操作的、标准化的服务。它使用SOAP(Simple Object Access Protocol)作为传输协议,WSDL(Web Services Description Language)用于定义...
学习使用WebserviceStudio需要对Web服务的基本概念和技术有一定了解,如XML、WSDL、SOAP等。深入掌握这些知识,将有助于更高效地利用WebserviceStudio进行Web服务的调试和测试。 总之,WebserviceStudio是一款实用...
1. WebService基本概念 WebService是一种基于XML(可扩展标记语言)的轻量级通信技术,它允许不同系统之间通过SOAP(简单对象存取协议)进行交互。WSDL(Web Services Description Language)用于描述WebService的...