J2EE Web服务开发系列之七: J2EE 1.4 平台和Web服务

本文是J2EE Web服务开发系列文章的第七篇,在本系列文章的前面各主题中,着重介绍了在J2EE1.3平台下使用各种技术或者工具进行Web服务开发。从本文开始,将介绍J2EE1.4平台下的Web服务开发。

本文首先介绍了J2EE1.4平台中Web服务的构架,然后分别介绍了J2EE1.4平台中Web服务的最新规范和最新技术,接下来介绍了开发Web服务使用的API以及J2EE Web服务开发步骤,最后介绍了Web服务的开发工具。

本文的参考资料见参考资料

J2EE1.4 Web服务构架

J2EE1.4的主题是Web服务,在J2EE1.4平台下:

  • 允许J2EE应用组件暴露为基于SOAP/HTTP的Web服务;
  • 和原有的Web服务进行整合;
  • Web服务的关键技术:JAX-RPC;
  • J2EE1.4下的Web服务框架:Web services for J2EE。

J2EE1.4平台升级的新增加的技术大部分和Web服务相关。在J2EE1.4平台下,开发、部署、发现Web服务变得非常方便。尽管J2EE1.4平台对Web服务方便提供了升级,但是:

  • Web服务仅仅是J2EE平台中一种使用服务的通道,所以不需要改变J2EE的构架,并且原有的J2EE组件可以非常容易地暴露为Web服务;
  • J2EE平台的优点仍然对Web 服务适用:可扩展性、可靠性、开放性。

J2EE1.4Web服务构架如图1所示。

图1 J2EE1.4 Web服务构架
图1 J2EE1.4 Web服务构架

在图1中,灰色的代表J2EE1.4平台中新增加的技术,白色的代表了原有的技术。在图1的构架图中,Web服务的客户端可以是Applet或者标准的Java客户端,当然也可以是运行在Servlet或者EJB容器中的组件;客户端可以通过JAX-RPC以HTTP/SSL协议来访问Web服务。Web服务的服务端点运行在Servlet或者EJB容器中,它以JAX-RPC和SAAJ作为运行环境。

J2EE1.4中Web服务技术

J2EE1.4提供了Web服务总框架,在这个总的框架下,包含了以下的技术和框架:

  • Web services for J2EE
  • JAX-RPC
  • SAAJ
  • JAXR
  • EJB2.1
  • Connector Architecture1.5

下面分别介绍这些技术或框架。

Web services for J2EE

Web services for J2EE是J2EE平台下Web服务总的构架规范,它义了在 J2EE 1.3 或 J2EE 1.4 应用程序服务器中如何支持 Web 服务。具体地说,Web Services for J2EE 定义了客户端模型、服务端模型、部署模型WSDL绑定和安全相关规范,从而使 Web 服务客户机和实现可以从一个 J2EE 供应商实现移植到另一个 J2EE 供应商实现。Web Services for J2EE 基于 JAX-RPC(JSR101)进行构建,以提供客户机编程模型。该客户机模型允许 Web 服务客户机(Java 的或非 Java 的,在 J2EE 之中或在 J2EE 之外)访问部署在支持 JSR109 的 J2EE 应用程序服务器中的 Web 服务。它还允许 J2EE 组件通过使用 J2EE 编程模型调用 Web 服务(Java 的或非 Java 的,在 J2EE 之中或在 J2EE 之外)。

在此框架下,服务端可以有两种选择:

  • 基于Servlet的服务端点:通过JAX-RPC实现,由Servlet容器提供运行环境;
  • 基于无状态会话Bean的服务端点:必须遵循EJB2.1规范,由EJB容器提供运行环境。

JAX-RPC

JAX-RPC是J2EE1.4平台中Web服务的核心技术,那么什么是JAX-RPC ?

  • 是一种远程调用基于,类似于RMI;
  • 规定了JAX-RPC的运行环境;
  • 定义了XML数据类型到Java 类型的映射方法;
  • 定义了WSDL到Java之间的映射;
  • 定义了JAX-RPC客户端编程模型(Stub接口、动态代理、动态调用);
  • 定义了基于Servlet的服务端点模型;
  • 定义了SOAP消息Handler框架;
  • 提供了复杂Java数据库类型映射的扩展框架。

JAX-RPC的构架如图2所示。

图2  JAX-RPC的构架
图2 JAX-RPC的构架

JAX-RPC的客户端可以是基于J2SE、J2EE或者J2ME的运行环境,服务端是Servlet或者EJB容器。WSDL不仅描述了Web服务,同时在JAX-RPC客户端调用服务端的端点时起了重要的作用。

JAX-RPC的互操作性如图3所示。服务端和客户端通过SOAP来进行通信,SOAP以HTTP作为底层的传输协议。

图3 JAX-RPC的互操作性
图3 JAX-RPC的互操作性

SAAJ

SAAJ从JAXM1.0划分出来,原JAXM1.0被划分为JAXM1.1和SAAJ1.1。SAAJ包含了创建和读取遵循SOAP1.1规范的以及带附件的SOAP消息的API,也包含了发送和接收请求/响应模型的SOAP消息。

SAAJ不仅可以被JAX-RPC使用,也可以被JAXM等Web服务技术使用。它是一组通用的、处理SOAP消息的API。JAXM、JAX-RPC和SAAJ的关系如图4所示。

图4 JAXM、JAX-RPC和SAAJ的关系
图4 JAXM、JAX-RPC和SAAJ的关系

JAXR

JAXR是和服务注册、发布相关的标准API。由于当前Web服务注册提供者比较多,要想在J2EE平台中使用这些注册服务,为每个注册服务都开发一个单独的API,显然是不现实的,JAXR为注册服务进行了多层抽象,使得在J2EE平台中操作当今的或者将来的Web服务注册中心成为可能。JAXR支持三种注册服务类型:JAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository等)。

JAXR规范为JAXR的实现定义了有两种级别的支持,分别是:

  • Level0:用于支持UDDI注册;
  • Level1:用于支持ebXML注册。

JAXR的互操作性如图5所示。

图5 JAXR的互操作性
图5 JAXR的互操作性

从图中可以看出,通过JAXR API,注册浏览器、J2EE组件和桌面应用可以访问UDDI、ebXML等注册服务中心。

需要注意的是,JAXR并不是一个新的注册规范,它只是访问原有的注册中心的一个编程接口。

EJB2.1

EJB2.1规范对Web服务提供了支持,定义了无状态会话Bean可以作为Web服务端点模型。这样,在J2EE平台中,有两种Web服务端点:基于Servlet的和基于无状态会话Bean的。

用EJB作为Web服务端点,同样可以像Servlet作为服务端点一样使用消息Handler。

在EJB2.1规范下,消息驱动Bean不是必须实现javax.jms.MessageListener接口。这样,除了开发JMS的消息驱动Bean外,还可以开发出自定义的消息驱动Bean,如com.mycompany.EmailListener。结合连接器的支持,可以开发出javax.xml.messaging. OnewayListener之类的消息驱动Bean来提供Web服务支持。

Connector Architecture1.5

在旧有的连接器结构中,只支持从J2EE组件内部到企业资源层(EIS)单向的调用,而资源层无法直接调用J2EE组件。在新的连接器规范中,可以从企业资源层中直接调用J2EE组件。这样,我们可以通过连接器来把EJB等组件向外暴露为Web服务端点,从而支持Web服务。

JAXM

首先需要声明的是,JAXM不是J2EE平台中的一部分,它只是一个可选的开发包。通过JAXM发送和接收基于SOAP的消息,它定义了两种发送和接收消息的模型:

  • 请求-响应(request-resposne),它是一种点对点的消息发送模型,消息发送端发送了消息后将阻塞等待服务端的相应,这种方式的好处是编程简单,缺点是无法取保消息到达服务端。
  • 单向(one-way),这种方式需要使用JAXM消息提供者,一端发送的消息通过消息提供者再转发到接收端;当接收端对消息响应时,同样首先通过JAXM消息提供者,再由消息提供者发送到原来的发送端。这种方式是消息通信是异步的,优点是可以保证消息被可靠发送到服务端,缺点是编程变得复杂。

JAXM两种消息发送模型如图6所示。

图6 JAXM两种消息发送模型
图6 JAXM两种消息发送模型

在J2EE1.4平台中,EJB2.1消息驱动Bean可以接收JMS消息或者JAXM SOAP消息。

在以下的情况下,可以优先考虑使用JAXM,而不是JAX-RPC:

  • 要发送面向文档的数据;
  • 要发送大量的、粗粒度的、复杂的流数据;
  • 需要使用异步数据交换模型;
  • 需要确保每个发送的数据都在对方接收。

JAXM互操作模型如图7所示。

图7  JAXM的互操作性
图7 JAXM的互操作性

开发Web服务的JAVA API

下面介绍在JAVA环境下开发Web服务要使用的API,这里只列出了J2EE标准的开发包和可选的开发包。

J2EE Web服务框架中核心API:

  • J2EE 1.4 (JSR 151)
  • JAX-RPC (JSR 101)
  • JAXR
  • SAAJ
  • EJB 2.1

和处理SOAP消息相关的API:

  • JAXM:发送接收异步的SOAP消息;
  • SAAJ:处理带附件的SOAP消息;
  • JAX-RPC:是J2EEWeb服务关键API,它定义了SOAP消息Handler API,;
  • JMS:别忘了,JAVA消息服务API也可以发送SOAP消息。

和WSDL相关的API:

  • Java API for WSDL:见JSR110;
  • JAX-RPC:定义了java和WSDL之间的映射。

和UDDI相关的API:

  • JAXR:Web服务注册的高层API。

和ebXML相关的API:

  • ebXML消息服务:提供ebXML消息支持的JAXM(JSR67);
  • ebXML注册:JAXR
  • CPP/CPA:Java API for ebXML CPP/CPA (JSR 157)

和XML文档管理相关的API:

  • JAXP (Java API for XML processing, JSR 05),用于解析XML文档,可以在这个API下使用可插入的解析器,如DOM;
  • JAXB (Java API for XML data-binding, JSR31),XML文档处理的高层API,用于XML文档模型和Java对象之间的绑定;
  • Streaming API for XML (JSR 173),基于迭代器(Iterator)的Pull-parsing API。

和XML安全相关的API:

  • XML Digital Signature (JSR 105)
  • XML Encryption (JSR 106)
  • XML Trust Service (JSR 104)
  • Secure Assertion Markup Language,(SAML, JSR 155)
  • WS-Security (JSR 183)

其它和Web服务相关的API:

  • XML Transactioning API for Java (JSR 156), Java API for OASIS BTP;
  • Java Process Component API (JSR 159);
  • Web Services for J2ME (JSR 172),为J2ME设备提供发送、接收SOAP消息的支持;
  • Web Services Metadata for J2EE (JSR 181),基于Web services的Metadata。

除了上面列举的API外,还有其它一些组织公司开发的API,比如Apache、IBM、BEA、Oracle等组织和公司,都为Web服务开发提供了许多API,在这里就不再列举了。

J2EE Web服务开发步骤

下面来讨论Web服务的开发步骤,在这里只是概述性的,在后面的文章中我们将结合这个开发步骤来进行具体实践。

  1. 定义Web服务;
  2. 实现Web服务;
  3. 创建可以部署的包;
  4. 在J2EE平台中部署Web服务;
  5. 发布Web服务,把Web服务绑定到注册中心(Service Registry);
  6. 对客户端的请求提供服务。

下面分别介绍这些开发步骤的具体工作。

定义Web服务

第一步就是定义Web服务,Web服务可以使用WSDL(Web服务描述语言)定义,也可以使用Java接口定义。在定义时,可以使用Top-down的方式,也可以使用Buttom-up的方式,具体采用哪种方式,取决于是否已经有将要暴露为Web服务的J2EE组件。如果已经有J2EE组件,那么可以使用Buttom-up的方式,在这种情况下,通过一些工具从J2EE组件生成WSDL描述;在Top-down的方式下,先创建WSDL,然后进行具体的实现。当然使用这两种方式也不是绝对的,在某些情况下,Web服务设计人员可能要把新定义的WSDL映射到原有的J2EE组件上,这样就出现了Top-down和Buttom-up中间的解决方案。

在定义Web服务时,同时需要定义出Web服务的端点接口(Endpoint Interface),服务端点接口是一个由JAX-RPC规范指定的Java接口,这个接口必须扩展javax.rmi.Remote接口。不论是使用Servlet作为服务端点,还是使用无状态会话Bean作为服务端点,都必须按照规范定义这个接口。这个接口可以使用Java编程语言编写,也可以使用一些工具从WSDL中生成,如Apache axis提供的WSDL2Java工具就可以从WSDL生成Web服务端点接口。如果是无状态会话Bean,那么服务接口将在Bean的部署描述符中使用<service-endpoint>元素指定,具体方法请参考本系列文章下一篇。例程1是一个服务接口定义的例子。

例程1 定义服务接口


public interface EchoService extends Remote
{
    /**
     *返回用户提供的信息。
     */
    public String echo (String name) throws RemoteException;    
}

实现Web服务

在实现服务时,有三个工作需要做:

1、选择一种具体的服务端点实现,也就是使用Servlet作为服务端点还是使用无状态会话Bean作为服务端点。

2、实现在服务接口中定义的业务逻辑,在这个阶段,可以使用一些工具生成Web服务运行时需要的框架,如使用axis中的WSDL2Java,Sun提供的wscompile等。

3、创建部署描述符,在部署描述符中指定具体的endpoint的实现。

如果使用Servlet作为服务端点,那么实现类代码看起来应该如例程2所示。

例程2 Servlet作为服务端点


public class EchoServlet implements EchoService
{
	public String echo (String name) 
	{
          //业务逻辑具体实现。
		return "Hello:"+name;
	}
}

如果使用无状态会话Bean作为服务端点,那么实现类代码看起来应该如例程3所示。

例程3 使用无状态会话Bean作为服务端点


public class EchoBean implements javax.ejb.SessionBean
{
	public String echo (String name) 
	{
		//业务逻辑具体实现。
		return "Hello:"+name;
	}
	...//其它EJB方法。
}

在实现了Web服务后,对于EJB组件,需要在EJB部署描述符中指定它的服务端点接口,如例程4所示。

例程4 编写和组件相关的部署描述符


 <session>
      <display-name>EchoServiceEJB</display-name>
      <ejb-name>EchoServiceEJB</ejb-name>
      <service-endpoint>com.hellking.webservice.EchoService</service-endpoint>
      <ejb-class>com.hellking.webservice.EchoServiceBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>    
 </session>
 

可以看出,使用无状态会话Bean作为Web服务端点,可以不开发HOME接口和Remote(Locale)接口,只需要指定服务端点接口。

创建可部署的包

接下来的任务就是创建可以部署的包,Web services for J2EE规定了打包的法则,在打包后的应用中可能包含以下的内容:

  • Web服务部署描述,指定了Web服务的运行特性,描述文件为webservices.xml,它是J2EE平台中Web服务的标准描述,就像EJB中的ejb-jar.xml描述符一样;
  • WSDL描述,用于描述Web服务;
  • 到其它J2EE组件的引用,比如那个组件实现了这个Web服务;
  • J2EE组件的标准描述。

webservices.xml部分部署描述符如例程5所示。

例程5 webservices.xml部分部署描述符


<!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN"
"http://www.ibm.com/standards/xml/webservices/j2ee/j2ee_web_services_1_0.dtd">
<webservices>
  <description>desc</description>
  <webservice-description>
    <webservice-description-name>EchoServiceEJB</webservice-description-name>
    <wsdl-file>META-INF/MyEchoService.wsdl</wsdl-file>
    <jaxrpc-mapping-file>META-INF/mapping.xml</jaxrpc-mapping-file>
    <port-component>
      <description>port component description</description>
      <port-component-name>EchoServicePort</port-component-name>
      <wsdl-port>
        <namespaceURI>urn:Echo</namespaceURI>
        <localpart>EchoServicePort</localpart>
      </wsdl-port>
      <service-endpoint-interface>com.hellking.webservice.EchoService
      </service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>EchoServiceEJB</ejb-link>
      </service-impl-bean>
    </port-component>
  </webservice-description>
</webservices>

在J2EE平台中部署Web服务

Web服务的部署任务在不同的应用服务器环境下方式也不一样,它取决于应用服务器提供的工具。部署时可能将产生和应用服务器厂商特有的部署描述符,这些特有的部署描述符一般都通过应用服务器厂商提供的工具自动生成。

发布Web服务

部署好Web服务后,可以通过JAXR编程发布,也可以使用注册中心提供的工具进行发布,IBM、Microsoft等都提供了UDDI注册工具。

对客户端的请求提供服务

客户端可以通过UDDI来发现Web服务,然后进一步调用。在调用时,可以使用JAX-RPC,也可以使用其它编程语言或者调用框架。在使用JAX-RPC时,可以使用JAX-RPC生成的Stub来进行,也可以使用动态调用机制或者动态代理等。另外,客户端也可以把Web服务绑定到服务器的JNDI名称空间中,然后在JNDI名称空间中查找这个服务,进一步调用。

如果把Web服务绑定到JNDI名称空间中,那么调用示例代码如例程6所示。

例程6 调用Web服务


Public class MyTestBean implements SessionBean{
public void getHello(...) {
Context ctx = new InitialContext();
EchoService es =(EchoService) ctx.lookup("java:comp/env/service/EchoService");
EchoServiceProvider sqp =es.getEchoServicePort();
String hello= sqp.echoHello("hellking");
...
}
}

Web服务开发工具

现在有众多的公司、组织提供了Web服务开发工具和运行环境,下面分别简单的介绍。

SUN公司提供的工具

Sun提供了Java Web Services Developer Pack(Java WSDP),它JWSDP最新的版本是JWSDP1.2,包含了:

  • JAXP、JAXB、JAXP、SAAJ、JAX-RPC、JAXR运行库、开发实例,它上支持最新的Web服务标准;
  • Java WSDP Registry Server (UDDI server),一个用于发布和查询Web服务的工具。

JWSDP1.2既是开发工具,也是Web服务运行环境。

你可以通过http://java.sun.com/webservices/download.html获得JWSDP最新版本。

另外,在Sun发布的J2EESDK1.4Beta2中,对Web服务最新的技术提供了全面的支持,可以通过它来学习J2EE平台中Web服务的最新技术。

你可以通过http://java.sun.com/j2ee/download.html#sdk获得J2EESDK1.4Beta2。

IBM公司提供的工具

IBM公司提供了大量的Web服务开发工具和运行环境。最常使用的有WSDK,它带有一个轻量级的Websphere服务器,通过它可以方便地创建和Websphere服务器兼容的Web服务。你可以从IBM官方网站下载WSDK最新版本。

BEA公司提供的工具

BEA为Web服务提供了WorkShop作为开发工具,在WorkShop中可以使用JWS规范非常快捷地开发Web服务,WorkShop和Weblogic服务器是紧密集成的,WorkShop中开发的Web服务可以方便地部署到Weblogic服务器上运行。你可以从BEA公司官方网站下载Weblogic开发版和Workshop的试用版。

APACHE组织提供的工具

Apache最新的Web服务开发工具是axis,它是Apache SOAP 项目的替代者。Axis同时也是一个Web服务的运行环境,它可以插入到任务J2EE兼容的Web服务器下运行,通过axis,可以快速构建和JAX-RPC兼容的Web服务。

你可以在http://ws.apache.org/axis/上获得axis的最新版本。

总结

通过上面对J2EE1.4Web服务的讲解,相信读者对J2EE1.4平台下的Web服务构架、Web服务相关的技术以及Web服务开发有了一个比较全面的了解。如果你只能记一句话,请记住:JAX-RPC是J2EE1.4平台中WEB服务的关键技术,Web services for J2EE是J2EE平台下Web服务总的构架规范。

下一步

现在已经对J2EE1.4平台下Web服务构架和技术有了初步的了解,下一步就是介绍在J2EE1.4平台下使用EJB2.1规范开发一个Web服务。

参考资料

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值