帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > JAVA编程
J2EE应用系统内部的Web Services
作者:佚名 发布时间:2005-04-02 来源:不详
 
  近六个月来,有关Web
JSR已经开始用一种标准的
支持。
services生命周期,安全,协作
方式来定义Web services的各个

,事务方面的许多标准纷纷出现。
方面如何从J2EE应用服务器中得到


  JSR 109专门讨论本地
部署。JSR 104,105和106联
加密。JSR 156 和157定义
业事务。本文将介绍JSR 10
客户端如何访问Web services,
合在一起来描速web服务安全,
支持Web services的事务和合作
9 的内容并考察它对Web servic
服务器生命周期和Web services的
包括信任服务的API,数字签名和
的基础,包括支持2PC (JTA) 和商
es在J2EE环境中实现的影响。

  JSR 109: Web'>http://jcp.org/en/jsr/detail?id=109">Web Services 在J2EE上的实现。当前规格说明书状态:版本0.3(正式发布版本 1.0) 15-April-2002


  JSR 109介绍

  在过去的这些年里,J2
移植至web前端之后的标准,
和无状态会话企业java
EE成为提供web服务的主流标准
其中Web services是最新的。J

。同时也出现了许多把应用端功能
2EE一开始使用的是servlets,JSP

  bean, 然后EJB规范发生了调整开始
最后开始支持基于消息的java bean。
支持有状态的企业java bean, 在后来是实体bean,


  毫无疑问J2EE将会继续的发展和进步
JSR 109 定义了J2EE应用服务器应该如何
和访问的本地支持。 明确的说,JSR 109
。JSR 109是最新的描述扩展J2EE的规格文档之一。
以一种标准的方式提供对Web services的部署,管理
覆盖以下重要的领域:

  客户端的编程模式――
程模式――怎样用servlets
们一样的生存周期Web serv
J2EE如何把Web services作为传
和无状态会话EJB来实现Web ser
ices部署和部署描述器――如何
统的远程对象来访问服务器端的编
vices并使Web services具有和他
在应用服务器上部署Web services

  在这篇文章里,我们要考察JSR 109
。但是在读这篇文章的时候,你要记住规
技术的时候常常只是注意它能做什么而忘
档的时候,我们要一直问自己“它究竟要
论,它描述的范围不应该宽于也不应该窄
的许多领域来理解每个领域到底带来了什么样的好处
格说明文档是描述解决问题的结论。我们在研究一种
记它要解决的问题是什么。在我们读这篇规格说明文
解决什么问题?” 规格说明文档描述解决问题的结
于问题的范围。

  首先,JSR 109 尝试定
services是如何实现的,对
多的规范所控制和定义,JS
变。我们来简单的看看部署
义一种实现Web services的编程
调用端来说看起来都是一样的。
R 109不可以要求Web services
和部署模式。
模式,在这种模式下无论Web
因为Web services同时被其他很
在实现和部署范围以外有任何的改


  JSR 109 尝试定义一种
调用的开发人员会很容易的
他J2EE应用一致的客户端编
模拟其它J2EE编程模式的客户端
理解JSR 109。所谓的“传统”
程模式,使用JNDI等方式来获取
编程模式;熟悉“传统”远程方法
,我们指JSR 109定义了一种和其
远程接口然后调用引用的对象。

  注意:一些支持Web services的公司,比如说Sun 和 BEA,他们表示对JSR109持有保留意见。需要查看完全的描述,参考http://jcp.org/en/jsr/results?j=109&t=1&c=1">投票内容。


  客户端编程模型

  JSR 109客户端编程模
service。这个问题只是许
 services的访问;然而,
service的应用服务器内部
式的目的是清楚的定义java应用
多复杂情形中的一种。其它的JS
这种方式给客户端应用带来了一
访问Web service我们定义为直
如何能够像访问EJB那样访问Web
R定义和应用服务器不在一起的Web
定的编程复杂度。在部署Web
接访问。JSR
  109的客户端编程模式定义了一种简
单易懂的访问本地部署的Web service的方式。

  三种模式

  JSR 109定义了三种客户端编程模式
,动态端口访问模式。我们将侧重于用户
service定义了一个接口。使用用户管理
供一个端口。容器管理端口访问模式和用
,而用户只是申请一个普通的可以访问不
――用户管理端口访问模式,容器管理端口访问模式
管理访问模式,这种模式基于原来的WSDL为Web 
访问模式的时候,应用系统需要为一个特定的接口提
户自管理模式类似,但是容器直接管理对实例的调用
同接口的端口。

  端口 在了解Web serv
的一个实例。一个客户应用
能启动一个已经存在的实例
发现JSR 109的客户端编程
ice之前,我们必需先理解端口
访问Web service必需通过服务
或者创建一个新实例来实现这个
模式非常熟悉。
的概念。一个端口是Web service
接口访问服务,这时应用服务器可
请求。熟悉EJB编程模式的读者会


  动态端口访问模式不需
显看来动态端口访问模式更
将来――当动态编程变得更
中,我们将使用更加传统的
接口的定义。我们待会再解
要事先了解WSDL的定义,调用会
加强壮,但是在现实应用中动态
加普遍的时候――这种方式也许
容器管理端口访问模式,在这种
析用户管理端口访问模式和容器
在端口不工作的时候发生。虽然明
端口访问模式并没有多大用处。在
会是非常有用的。本文的余下篇章
模式里用户事先知道Web service
管理端口访问模式。

  第一步:首先我们得到一个在任何JN
的描速已经超出了本文的范围,有兴趣的
services部署的时候,我们将了解访问We
需要使用Web services的名称。当然,应
JNDI树上了。
DI客户系统中都要用到的InitialContext。(对JNDI
读者可以直接访问JNDI培训)当我们考察Web 
b service实际名称的细节;直到这个时候,我们才
用服务器应当保证实际的Web services已经被绑定到


  例1.用户管理端口访问模式                                                    


  00 InitialContent ic
= new InitialContext();

  01 SomeSpecificServi
(java:comp/env/service/S
ceInterface srv = (SomeSpeci
omeSpecificServiceInterface)
ficServiceInterface)ic.lookup
;

  02 ServiceInstance si = (SomeSpe
cificService)srv.getServiceInstancePort();

  让我们来逐行研究这个
ServiceInterface的一个特
问服务的一些公用方法,例
EJB本地接口有类似之处。
程序片断,行00是传统的JNDI查
定实例。所有的服务都需要实现
如返回特定实例。如果你熟悉EJ
行02,我们得到了定义了实际使
找。行01,我们得到接口
Services接口,这个接口定义了访
B规范,你将发现Services接口和
用的方法的远程对象的一个实例。

  当Web service的定义在开发的时候
问模式。如果因为某种原因应用服务器不

已经完全已知的情况下我们一般使用用户管理端口访
能返回支持行01 cast操作的实例,异常将会被抛出


  例2.容器管理端口访问模式                                                    


  00 InitialContent ic
= new InitialContext();

  01 Service srv = (Service)ic.lookup        

  (java:comp/env/servi
ce/SomeSpecificServiceInterf
ace);

  02 ServiceInstance si = (SomeSpe
cificService)srv.getPort();

  例2和例1仅有很小的差别。在01我们只需要对象的一个公用接口。没有指定返回的接口名称,所以容器可以自由的返回任意的匹配被请求的JNDI名称的实例。行02也有一些差别:我们使用一个普通的getPort()调用方法而不是像我们在例1中使用的那种特定名称的get port>Port调用方法。


  规格说明书中声明当用
定客户端知道服务可能不支
抛出。更可能的是,客户端
getPort()方法,但是他们
户仅仅访问对象的服务定义时可
持的一个特定接口。如果容器不
在build的时候没有一个完全的W
会指定合适的实例类型――这种
以使用容器管理端口访问。行02假
知道所需求的cast操作,异常将被
SDL定义,因此他们不能用the 
方式看起来更可行。

  服务器编程模型

  服务器编程模式可能是JSR109最重要
方式将帮助Web service开发人员创建在
的部分。理解Web service在不同的生命周期的工作
不同条件下都可以按预定方式工作的Web
  service。EJB规格说明书定义了不同
EJB模式,定义了Web services如何在Web
定义是一个解决行为一致性的尝试。
类型EJB的生命周期。JSR 109更进了一步,它扩展了
 services容器里工作。JSR 109 关于服务器编程的


  快速背景贴士 Web 应
时需要需要的所有服务。事
用服务器里有两种容器――
管理,但也会有微小的差异
servlets;EJB容器知道如
用和EJB 一般在“容器”内执行
务,JNDI,JDBC,所有类似的服务
Web 应用容器和EJB容器。它们
,这个要看提供的是何种服务。
何加载EJB。
。容器提供EJB或者Web 应用运行
都由容可提供。一般来说,一个应
都提供相似的服务,比如生命周期
Web应用容器知道如何加载


  在我们了解JSR 109规
J2EE的工作方式。首先,We
实现这个事实不应该改变客
Web service。因此,编程

范内容之前,让我们先了解我们
b service的实现应该对客户透
户端对服务行为的认识。况且我
模式应该是轻便强壮的,不仅支

需要什么来支持Web services顺应
明。Web service在应用服务器内
们需要在很多的应用服务器里使用
持现在的实现也要支持将来的实现


  另一点比较重要的是和现存J2EE服务
services能够方便的利用J2EE现存的优势
的无缝整合,例如 JDBC。我们希望我们的Web
而不危及到服务自身的完整性。

  有了这些目标,JSR 109定义了对Web
servlets。JSR 109一个让人失望的地方
。消息bean支持可扩展的同步消息,这是
为可以被无状态bean和servlets所模拟,
services两个领域的支持:无状态会话bean和
是它在没有解释的情况下忽略了消息驱动bean的定义
Web services的一个重要部分。由于消息bean的行
所以我们需要编写额外的代码。

  在Web services里端口
和服务进行映射。Web serv
的定义十分重要,JSR 109 定义
ice的端口在概念上类似于JVM里
了在J2EE应用服务器里如何将端口
的实例。

  WSDL: Web service的
service之间如何互相联系
接口定义,WSDL并不是Web serv

ice的一部分,但它定义了Web

  服务接口定义 (SDI):
务实现是分开的。
Web service的SDI定义了服务实

际支持的方法。记住服务定义和服


  服务实现: Web servic
servlet。 一般来说,一个

e的实际实现。在JSR 109里,它
服务直接实现SDI,它可以也可

是一个无状态会话EJB或者一个
以不具体实现SDI定义的java接口


  安全角色: 一旦JSR 10
9涉及到安全问题,它将从servl
et 和 EJB规范中继承相关定义。

  用无状态会话bean实现Web Services

  JSR 109 一个很棒的地方就是无状态
那些没有足够EJB背景的人可以通读EJB关
Web services很重要的部分以下说明。
会话bean可以被用来简单快速的开发Web services。
于无状态bean的规格说明书。规格说明书中对实施


  遵循 JAX-RPC 规范: W
JAX-RPC 获取更详细信息。
eb services必须遵循JAX-RPC规

范来正确的和客户端交互。参考

  无状态和无事务: 用无
到事务上下文。
状态会话EJB实现的Web service

s不能跟踪任何状态;也不可以得


  遵循SDI:一个服务的实现必须实现SDI定义的此服务的所有的方法              
  服务接口: 一般来说我们会实现服务
生)服务的实现,就像我们现在使用EJB
的方法。
接口,然而,在实际中,我们常常继承(或者已经产
那样。很明显,bean也可以实现SDI定义之外的其他


  遵循无状态EJB需求:
须遵守无状态bean的相关规
因为无状态Web services是基于
定。
传统的EJB规范,Web services必

  以上的所有方面的定义适用于新的We
Web services呢?因为EJB遵循规格说明
为一个现存服务的实现来部署的。实际上
别。
b services。那么我们可不可以把现有的EJB作为
书的规范,也没有违反JAX-RPC的规定,它是可以作
,从EJB容器的角度出发,EJB和服务并没有实际的区


  无状态会话bean在EJB
bean的实例。图1显示了无
冲”或者“预先创建”对象
态来表示“已缓冲”。
容器里执行。容器本身控制了be
状态会话EJB的生命周期。考虑
实例的概念来提高应用效率。我

an的生命周期,包括创建和消灭
到大部分的应用服务器都支持“缓
增加了一个额外的“概念性”的状

  

  
图1 无状态会话EJB的生命周期


  Does Not Exist: 在这
pooled状态,或者直接变成
数量的“预创建”bean已经
个状态下,没有bean的实例可供
ready状态那是因为应用服务器
被指定到缓冲池里。
使用。当bean从这个状态转变为
需要新实例来满足客户需求或一定

  Pooled Unallocated: 并不是所有的
格说明书都没有指定可选择的“Pooled U
WebLogic 支持这个中间状态,就是说应
bean。当一个应用释放了bean的一个实例
应用服务器都支持可用池的概念,因此,大部分的规
nallocated”状态。一些应用服务器比如说BE'的
用服务器预基于描述文件创建一定数量的可供使用的
,这个实例会被重新初始化并放进缓冲池提供重用。
  Ready : 处在这个状态
可以接受和处理方法调用。
的bean已经被创建好,实例化好

处于可用状态。在这个状态下它们

  Beans 因为许多原因转换状态。了解
为正确的bean:
bean为什么进行状态的转换将帮助你理解如何开发行


  1. 事务1 表示bean的第一次创建。
然而,如果正在被使用并且有足够的空间
创建的bean在被使用之前,会调用它自己
作都可以在这里完成。
一般来说,应用服务器会预先创建一定数量的bean;
,一个新的bean的实例将在客户访问的时候创建。新
的init()方法进行初始化 。任何一次性的初始化工


  2. 事务2表示从一个pooled状态到method-ready状态的转变。这种转变发生在当一个pooled的实例被分配给一个客户的时候,一般是通过get<...>Port()方法调用。和刚才说得一样,pooled状态的存在是提高启动性能。


  3. 事务3只是一个简单
方法。
的“例行工作”。对象的一个实

例被分配给一个客户然后客户调用


  4. 事务4发生在对象被释放的时候(
候。基于应用服务器的不同实现方式,be
does-not-exist状态。
例如:设定变量为null)或者从任何范围被调离的时
an转换为pooled状态然后被初始化或者直接转变成


  5. 事务5发生在bean被实际撤除的时
init()方法里做的任何事情。
候。destroy()方法被调用,在这里用户可以取消在


  关于事务:现在Web services不支持
挂起。就是说,这意味着bean不可以指定
“强制性”。
事务处理,在bean方法被调用的时候任何事务都将被
或者需要事物context,因此,不可以被标志为事务


  用Servlets实现Web Services

  用servlet和用EJB实现Web services
现工具完全是个人喜好。用servlet来实
从概念上并没有很明显的不同。选择servlet作为实
现Web
  services需要遵循和EJB实现相同的
示了一些最明显的不同之处。
原则。这两种方式的不同在于底层实现方式。表1显


  我们要指明的是这些不同是作者的观点而不是出自JSR 109的内容。            

  
表1:EJB和servlet实现的不同

  

  Servlet 和 EJB方式的
样,EJB知道它是通过init(
明文档里没有类似的接口;
java.xml.rpc.server.Serv
一个很重要的不同是生命周期的
)方法调用被创建,通过destroy
为了支持相似的行为,JSR109定
iceLifeCycle――来提供相似的
管理。正如我们在图 1上看到的那
()方法调用被移除。Servlet的说
义了一个额外的接口――
行为。


  Example 3. java.xml.
rpc.server.ServiceLifeCycle

  package java.xml.rpc.server;                      

  public interface ServiceLifeCycle {        

  void init(Object context) throws
ServletException;

  void destroy();                                                

  }                                                                            

  部署

  部署解决了Web service使用细节和
始化。开发人员可能定义一些基于部署考
是为了Web  service能正确的工作,部
署描述文件webservices.xml把它的部署
实现细节的分离。它既定义了打包也定义了命名/初
虑是必需的,比如服务的名字和需要何种初始化,但
署人员必需指定这些参数。JSR 109使用一个新的部
架构于普通EJB或者Web 应用的部署之上。

  JSR109的如此定义使Web service的
webservices.xml文件的大概样子,它包
部署看起来和EJB部署非常类似。例4 显示了
括5个主要元素。

  端口名称:应用服务器用来辨认端口
名称类似。这并不是实际端口名,只是用

的唯一的端口名称。注意端口名称和EJB部署器里EJB
来作为标识。使用port-component-name元素来声明

  端口Q名称:Web servi
port-qname-namespace来指
ce命名空间和WSDL名称。使用元
定。
素port-qname-localname和元素

  WSDL定义:在包.war 或 .jar内指向WSDL的路径。                

  服务定义接口类:实现Web service
service-def-interface来指定。考虑到
是被创建的,就像许多EJB接口类那样。
服务接口功能的类名。用元素
有两种可能的实现机制,在实际使用中这个类很可能

  端口服务实现:bean的实现用元素EJ
于webservice.xml文件本身要被打包进包
接所指定的实现必需已经被设定,就是说
B-link 或者 servlet-link指向实际的服务实现。由
含服务实现的   .jar 或者 .war文件里,这些链
,你必须引用一个存在的EJB或者servlet。

  例4显示了webservices
的.03版本,可能已经有所
需要一些解释。
.xml文件的大概样子。需要指出
改变。代码很简单(完整的DTD

的是,这个例子是基于规格说明书
可以在说明文档里找到),但是也


  行12-16链接行05 的WSDL提供的Web
service的引擎,并且必需链接回先前定
service描述。EJB或者servlet都可以被指定为Web
义的EJB或者servlet。行11定义了取得Web
  service端口所需要的
的用户就可以使用了。
服务接口。行08 和 09 指定了W

eb service的外部名称,这样外部


  Example 4. Sample webservices.xml            

  00                                                                          

  01                                                                          

  02 My first Web Service using JSP 109    

  03 Sample                                                            

  04                                                                          

  05 path.to.the.wsdl.representing
.the.service

  06                                                                          

  07 .. various optional elements
such as description etc

  08 MyWebService                                                

  09 qualifying.namespace                                

  10 name.within.namespace                              


  11 com.webservicesar
eus.webservice.sampleservInt

  12                                                                          

  13 link to a named ejb                                  

  14 or                                                                    

  15 link to a named servlet                          

  16                                                                          

  17                                                                          

  18                                                                          

  19                                                                          
  JSR 109是一个定义Web services如
题的存在,比如为什么Mbeans会被忽略,
何整合进现有的J2EE应用的主要领域。我

何融合进J2EE应用服务的有趣文档。由于一些明确问
这个说明文档覆盖了需要被用来定义Web services如
将一直密切关注这个JSR和在安全方面一些类似的JSR

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·.NET和J2EE架构之战 正在升级  (2005-04-02)
 ·将J2EE平台提升到一个新的高度  (2005-04-02)
 ·J2EE Design Patterns  (2005-04-02)
 ·如何实现一个与数据库表字段松耦  (2005-04-02)
 ·solaris上开发J2EE应用中文问题的  (2005-04-02)
 ·Sun在开放源代码J2EE认证上又迈出  (2005-04-02)
 ·J2EE 1.4 application Server fo  (2005-04-02)
 ·《J2EE核心模式》(DAO模式)  (2005-04-02)
 ·J2EE 和 .NET之间的对比  (2005-04-02)
 ·J2EE初学者需要理解的问题  (2005-04-02)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·谈谈JDBC
·JDBC专题介绍
·JDBC接口技术
·利用weblogic的POOL(连接池)连接
·Jsp中调用Oracle存储过程的小例子
·JSP数据库操作例程
·JSP数据库连接大全
·用连接池提高Servlet访问数据库的效
·一种简单JDBC连接池的实现
·数据库连接池Java实现小结
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统