WebService简介及开发实例
⽂章分类:JavaEye 关键字: web service jax-ws saaj jaxb java
Web Service简介及开发实例
作者:岳乡成
本⽂档实例Dome基于的技术是:JSF  +  Jboss-seam-2.1.1.GA.  +  Jboss 4.2.3 GA  +  EJB 3.0  +  Jboss ESB  +  My-SQL-5.0.8 +  JDK 1.6。由于实例⼯程太⼤,不能放博客上,如有需要联系我,MSN:xiangcheng.yue@163。
QQ号码:827650367。
⼀、 Web Service的简介
1、 什么是Web Service
Web services是建⽴可互操作的分布式应⽤程序的新平台。
Web service平台是⼀套标准,它定义了应⽤程序如何在Web上实现互操作性。你可以⽤任何你喜欢的语
⾔,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进⾏查询和访问。
Web service平台需要⼀套协议来实现分布式应⽤程序的创建。任何平台都有它的数据表⽰⽅法和类型系统。要实现互操作性,Web service平台必须提供⼀套标准的类型系统,⽤于沟通不同平台、编程语⾔和组件模型中的不同类型系统。
基础的 Web Services 平台是 XML + HTTP。
HTTP 协议是最常⽤的因特⽹协议。
XML 提供了⼀种可⽤于不同的平台和编程语⾔之间的语⾔。
Web services 平台是简单的可共同操作的消息收发框架。它仍然缺少许多诸如安全和路由等重要的特性。但是,⼀旦 SOAP 变得更加⾼级,这些事项就会得到解决。
Web services 有望使应⽤程序更加容易通信。
★ Web services 把 Web 应⽤程序提升到了另外⼀个层⾯
通过使⽤ Web services,您的应⽤程序可向全世界发布功能或消息。
Web services 使⽤ XML 来编解码数据,并使⽤ SOAP 借由开放的协议来传输数据。
通过 Web services,您的会计部门的 Win 2k 服务器可与 IT 供应商的 UNIX 服务器进⾏连接。
★ Web services 有两种类型的应⽤
可重复使⽤的应⽤程序组件
有⼀些功能是不同的应⽤程序常常会⽤到的。那么为什么要周⽽复始地开发它们呢?
Web services 可以把应⽤程序组件作为服务来提供,⽐如汇率转换、天⽓预报或者甚⾄是语⾔翻译等等。
⽐较理想的情况是,每种应⽤程序组件只有⼀个最优秀的版本,这样任何⼈都可以在其应⽤程序中使⽤它。
连接现有的软件
通过为不同的应⽤程序提供⼀种链接其数据的途径,Web services有助于解决协同⼯作的问题。
通过使⽤ Web services,您可以在不同的应⽤程序与平台之间来交换数据。
★ Web Services 拥有两种基本的元素。
它们是:SOAP及WSDL
(1)什么是 SOAP?
SOAP 指简易对象访问协议
SOAP 是⼀种通信协议
SOAP ⽤于应⽤程序之间的通信
SOAP 是⼀种⽤于发送消息的格式
SOAP 被设计⽤来通过因特⽹进⾏通信
调用webservice服务
SOAP 独⽴于平台
SOAP 独⽴于语⾔
SOAP 基于 XML
SOAP 很简单并可扩展
SOAP 允许您绕过防⽕墙
SOAP 将作为 W3C 标准来发展
(2)什么是 WSDL?
WSDL 是基于 XML 的⽤于描述 Web Services 以及如何访问 Web Services 的语⾔。
WSDL 指⽹络服务描述语⾔
WSDL 使⽤ XML 编写
WSDL 是⼀种 XML ⽂档
WSDL ⽤于描述⽹络服务
WSDL 也可⽤于定位⽹络服务
WSDL 还不是 W3C 标准
2、 什么是JWS
JWS(Java Web Service)是Java应⽤平台上专门⽤于开发Web服务系统及⾯向服务系统的产品,它的最新版本是2.0,Java EE
5和Java SE 6都对JWS 2.0提供⽀持。
在JWS 2.0,Java定义了⼀系列新的标准,JMS本⾝也包含了⼀些⼯具,如JAX-WS 2.0,JAXB 2.0,JAXP 1.4,SAAJ 1.3以及WS-Metadata等。
⾯向服务的系统往往由多个具有不同的⼦功能的独⽴组件构成,通过他们之间良好的相互协作,可以实现复杂的需求。⾯向服务系统的这个特点,要求独⽴组建之间有公共的接⼝,这些⽤于交换数据的公共接⼝有良好的定义。由于要实现组件之间的数据通信,这些具有良好定义的接⼝就必须要被别的组件识别并正确理解,才能实现协作。
在定义了公共的接⼝后,还存在具体的数据交换问题,即双⽅需要遵循⼀个共同的数据交换标准,这个数据交换标准称为协议。要在独⽴的组件之间进⾏通信,需要⼀系列标准来严格规定数据通信的格式和规则。
Web Service的出现解决了上述问题,利⽤WSDL定义统⼀的接⼝格式,⽤SOAP消息统⼀输⼊/输出参
数的统⼀格式。SOAP消息可以由多种途径传递,⽐如,通过HTTP,SMTP及JMS协议传递。以HTTP为例,在服务使⽤端,WSDL的接⼝定义可以通过HTTP-GET 请求获取,⽽SOAP应答消息及回复消息的传输可以通过HTTP-POST请求来实现。这样,基于WSDL和SOAP消息机制就可以满⾜⾯向服务应⽤系统开发的需求。
Web Service平台架构主要由三部分构成:序列化及反序列化⼦系统、调⽤⼦系统及发布⼦系统。这三个⼦系统并不受具体语⾔的限制,也不受平台和框架的限制,⽆论使⽤Java语⾔还是.NET语⾔,⽆论使⽤Axis平台还是JWS来开发web服务,都会涉及这三个最基本的功能模块。
(1)序列化及反序列化
在JMS中将⼀个Java对象转化为⼀个XML元素的过程,称为序列化。反之将⼀个XML元素转化为相应的Java
对象的过程,称为反序列化。序列化和反序列化的过程要依赖于Java类和XML-Scheme之间的映射关系,JWS有独⽴
的序列化和反序列化⼦系统⽤来负责完成这些映射及转化。
在web服务的客户端,序列化过程将参数转化为xml结点,进⽽封装成Soap请求消息,发送⾄服务器
端的web服务端点。获得返回值时,反序列化过程启动,它将返回值从SOAP消息中指定的xml结点中取出,然后将它转化为客户端相对应的Java对象。
转化规则的定义在JWS中是通过JAXB的注释来完成的。新版的JAXB简化了绑定规则的描述,它允许直接将规则以注解的形式写⼊Java 类。
例如:
@Entity
@Name("hotel")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(name="", propOrder = {
"id",
"img",
"name",
"address",
"city",
"state",
"zip",
"country",
"price",
"ipAddress"
})
@XmlRootElement(name="Hotel")
public class Hotel implements Serializable
{
private Long id;
private String img;
private String name;
private String address;
private String city;
private String state;
private String zip;
private String country;
private BigDecimal price;
private String ipAddress = "192.168.1.112";
@Id @GeneratedValue
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
@Length(max = 50)
@NotNull
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
@Length(max=50) @NotNull
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Length(max=100) @NotNull
public String getAddress()
{
return address;
}
public void setAddress(String address)    {
this.address = address;
}
@Length(max=40) @NotNull
public String getCity()
{
return city;
}
public void setCity(String city)
{
this.city = city;
}
@Length(min=4, max=6) @NotNull
public String getZip()
{
return zip;
}
public void setZip(String zip)
{
this.zip = zip;
}
@Length(min=2, max=10) @NotNull
public String getState()
{
return state;
}
public void setState(String state)
{
this.state = state;
}
@Length(min=2, max=40) @NotNull
public String getCountry()
{
return country;
}
public void setCountry(String country)
{
}
@Column(precision=6, scale=2)
public BigDecimal getPrice()
{
return price;
}
public void setPrice(BigDecimal price)
{
this.price = price;
}
@Transient
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
@Override
public String toString()
{
return "Hotel(" + name + "," + address + "," + city + "," + zip + ")";
}
}
(2)服务调⽤的过程
在⾯向服务的分布式系统中,⼀般将传统的客户服务器框架中的客户端Client称为服务的消费者,⽽将服务器端称为服务的提供者。          按照现在的web服务标准,⼀个服务被调⽤时,在服务的提供端⼤致的处理过程如下:
①接受并预处理SOAP请求消息,例如效验,处理SOAP消息报⽂头。
②从消息中获取该消息希望调⽤的接⼝和具体操作。
③利⽤web服务提供的⽀持,到具体的实现对象,并调⽤该对象的接⼝。这个对象可以由不同的语⾔实现。JWS⽀持从WSDL到Java的映射,可以通过WSDL到与它相对应的Java服务端点实现类。
④使⽤序列化⼯具的反序列化过程,将SOAP请求消息中的服务请求参数取出,传递给步骤3中的⽬标对象的相应函数。
⑤⽬标Java对象执⾏相应的操作,将计算的结果以对象形式返回。
⑥使⽤序列化⼯具的序列化过程,根据wsdl中的定义,将步骤5中的结果对象序列化成XML元素,并封装到SOAP回复消
息中。
⑦将步骤6中的SOAP回复消息发送回服务调⽤端。
与之对应的,在服务使⽤端的调⽤过程如下:
①⾸先创建服务端点接⼝对象SEI(Service Endpoint Interface),在Web服务客户端⼀般都会有相应的⼯⼚类完成SEI对象的实例化。在JWS中,SEI对象⼀般是由Java代理来实现的。
②客户端通过SEI调⽤其中封装的web服务接⼝。
③利⽤序列化⼯具的序列化过程,根据WSDL的定义,将客户端的调⽤接⼝的参数转化成XML元素,再将该元素封装在SOAP请求消息⾥。
④在同步模式下,在SOAP请求消息发出后,客户端会等待SOAP应答消息;异步模式下,客户端顺序执⾏后续代码,直到通过接收到SOAP请求消息⾥。
⑤解析从服务器端获得的SOAP应答消息,使⽤序列化⼯具中的反序列化过程,将SOAP应答消息中的数据转化成客户端对象,该对象的值就是被调⽤服务的返回值。
(3)web服务的发布
以JMS为例,web服务发布系统的主要功能
①以URL的形式公开被发布的WEB服务的WSDL⽂件,并绑定SOAP请求消息和Java⽬标类。
②发布JAVA⽬标⽂件(例如Java Object⽂件,WAR⽂件,JAR⽂件及相关配置⽂件等)。
③配置序列化和反序列化⼦系统。
④配置web服务端点和SOAP消息预处理进程。
⼆、 web service的⼏种开发及调⽤⽅式
(1)⽤EJB容器模型开发Web Service,⽤wsimport⼯具⽣成辅助类进⾏调⽤。
实例如下(实例中应⽤的EJB容器为Jboss,所有代码是基于JBoss Seam架构来编写的):
①服务的提供者端<;提供服务端的代码>:
服务的提供者端的任务是暴露⼀个web service以供外部使⽤,本例的web service是通过JavaEE平台提供的@java.jws.WebService注解来实现的。
以下代码的路径是VSS上  前期调查⽂件夹下SOA\web service\⽤EJB容器模型开发Web Service,⽤wsimport⼯具⽣成辅助类进⾏调⽤\tele\book\src\org\jboss\seam\example\booking\ws\impl,⽤EJB容器模型开发Web Service,⽤wsimport⼯具⽣成辅助类进⾏调⽤⽂件夹下包括两个⽂件夹:local,tele。tele⽂件夹下放服务的提供者端的⼯程和打好的EAR包。local⽂件夹下放服务的消费者端的⼯程和打好的EAR包。
package org.ample.booking.ws.impl;
import static org.jboss.seam.ScopeType.SESSION;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.seam.annotations.Out;
import org.ample.booking.Hotel;
import org.ample.booking.User;
import org.ample.booking.ws.HotelObject;
@Stateless
/**实例是使⽤了两个JBoss应⽤服务器,该代码是服务提供者端的代码,所以使⽤了@Remote注解,实现远程接⼝。。*/
@Remote (HotelObject.class)
@WebService
public class HotelObjectImpl implements HotelObject {
@PersistenceContext
private EntityManager em;
public List<Hotel> getHotelObject(String hotelName) {
List<Hotel> results = em.createQuery("select h from Hotel h where h.name like"+ " '%"+hotelName+"%'")
.getResultList();
if(results.size()>0){
return results;
}
return null;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。