选择显示字体大小

jsr 109:j2ee应用系统内部的web services

<p><strong>jsr 109:j2ee应用系统内部的web services</strong> </p>翻译作者: cocoqin<br>by al saganich 08/07/2002<br>原文链接:<a href=&quot;http://www.onjava.com/pub/a/onjava/2002/08/07/j2eewebsvs.html&quot;>http://www.onjava.com/pub/a/onjava/2002/08/07/j2eewebsvs.html</a><br>
<p>  近六个月来,有关web services生命周期,安全,协作,事务方面的许多标准纷纷出现。jsr已经开始用一种标准的方式来定义web services的各个方面如何从j2ee应用服务器中得到支持。 </p>
<p>  jsr 109专门讨论本地客户端如何访问web services服务器生命周期和web services的部署。jsr 104,105和106联合在一起来描速web服务安全,包括信任服务的api,数字签名和加密jsr&nbsp;156 和157定义支持web services的事务和合作的基础,包括支持2pc (jta) 和商业事务。本文将介绍jsr 109 的内容并考察它对web <br>&nbsp; services在j2ee环境中实现的影响。 </p>
<p>  jsr 109: <a href=&quot;http://www.matrix.org.cn/html/<a%20href='http://jcp.org/en/jsr/detail?id=109&quot;>web'&gt;http://jcp.org/en/jsr/detail?id=109&quot;&gt;web</a> services 在j2ee上的实现</a>。当前规格说明书状态:版本0.3(正式发布版本 1.0) 15-april-2002<br><br></p><br>
<p><strong>jsr 109介绍</strong> </p>
<p>  在过去的这些年里,j2ee成为提供web服务的主流标准。同时也出现了许多把应用端功能移植至web前端之后的标准, 其中web services是最新的。j2ee一开始使用的是servlets,jsp和无状态会话企业java <br>&nbsp; bean, 然后ejb规范发生了调整开始支持有状态的企业java bean, 在后来是实体bean, 最后开始支持基于消息的java bean。 </p>
<p>  毫无疑问j2ee将会继续的发展和进步。jsr 109是最新的描述扩展j2ee的规格文档之一。jsr 109 定义了j2ee应用服务器应该如何以一种标准的方式提供对web <br>&nbsp; services的部署,管理和访问的本地支持。 明确的说,jsr 109覆盖以下重要的领域:</p>
<ul>&nbsp;
<li>客户端的编程模式――j2ee如何把web services作为传统的远程对象来访问</li>&nbsp;
<li>服务器端的编程模式――怎样用servlets和无状态会话ejb来实现web services并使web services具有和他们一样的生存周期</li>&nbsp;
<li>web services部署和部署描述器――如何在应用服务器上部署web services</li><br></ul>
<p>  在这篇文章里,我们要考察jsr 109的许多领域来理解每个领域到底带来了什么样的好处。但是在读这篇文章的时候,你要记住规格说明文档是描述解决问题的结论。我们在研究一种技术的时候常常只是注意它能做什么而忘记它要解决的问题是什么。在我们读这篇规格说明文档的时候,我们要一直问自己&ldquo;它究竟要解决什么问题?&rdquo;&nbsp; 规格说明文档描述解决问题的结论,它描述的范围不应该宽于也不应该窄于问题的范围。</p>
<p>  首先,jsr 109 尝试定义一种实现web services的编程模式,在这种模式下无论web services是如何实现的,对调用端来说看起来都是一样的。因为web&nbsp; services同时被其他很多的规范所控制和定义,jsr 109不可以要求web services在实现和部署范围以外有任何的改变。我们来简单的看看部署和部署模式。<br><br>  &nbsp;jsr 109 尝试定义一种模拟其它j2ee编程模式的客户端编程模式;熟悉&ldquo;传统&rdquo;远程方法调用的开发人员会很容易的理解jsr 109。所谓的&ldquo;传统&rdquo;,我们指jsr&nbsp; 109定义了一种和其他j2ee应用一致的客户端编程模式,使用jndi等方式来获取远程接口然后调用引用的对象。</p>
<p>  <strong>注意</strong>:一些支持web services的公司,比如说sun 和 bea,他们表示对jsr109持有保留意见。需要查看完全的描述,参考<a href=&quot;http://www.matrix.org.cn/html/<a%20href=&quot; http: jcp.org en jsr results?j='109&amp;t=1&amp;c=1&quot;'>http://jcp.org/en/jsr/results?j=109&amp;t=1&amp;c=1</a>&quot;&gt;投票内容</a>。</p><br>
<p><strong>客户端编程模型</strong></p>
<p>  jsr 109客户端编程模式的目的是清楚的定义java应用如何能够像访问ejb那样访问web service。这个问题只是许多复杂情形中的一种。其它的jsr定义和应用服务器不在一起的web&nbsp; services的访问;然而,这种方式给客户端应用带来了一定的编程复杂度。在部署web service的应用服务器内部访问web service我们定义为直接访问。jsr <br>&nbsp; 109的客户端编程模式定义了一种简单易懂的访问本地部署的web service的方式。</p>
<p>&nbsp; 三种模式</p>
<p>   jsr 109定义了三种客户端编程模式――用户管理端口访问模式,容器管理端口访问模式,动态端口访问模式。我们将侧重于用户管理访问模式,这种模式基于原来的wsdl为web&nbsp; service定义了一个接口。使用用户管理访问模式的时候,应用系统需要为一个特定的接口提供一个端口。容器管理端口访问模式和用户自管理模式类似,但是容器直接管理对实例的调用,而用户只是申请一个普通的可以访问不同接口的端口。</p>
<p><em><strong>端口 </strong></em><em>在了解web service之前,我们必需先理解端口的概念。一个端口是web service的一个实例。一个客户应用访问web service必需通过服务接口访问服务,这时应用服务器可能启动一个已经存在的实例或者创建一个新实例来实现这个请求。熟悉ejb编程模式的读者会发现jsr&nbsp; 109的客户端编程模式非常熟悉。</em></p>
<p>  动态端口访问模式不需要事先了解wsdl的定义,调用会在端口不工作的时候发生。虽然明显看来动态端口访问模式更加强壮,但是在现实应用中动态端口访问模式并没有多大用处。在将来――当动态编程变得更加普遍的时候――这种方式也许会是非常有用的。本文的余下篇章中,我们将使用更加传统的容器管理端口访问模式,在这种模式里用户事先知道web&nbsp; service接口的定义。我们待会再解析用户管理端口访问模式和容器管理端口访问模式。</p>
<p>  第一步:首先我们得到一个在任何jndi客户系统中都要用到的initialcontext。(对jndi的描速已经超出了本文的范围,有兴趣的读者可以直接访问jndi培训)当我们考察web&nbsp; services部署的时候,我们将了解访问web service实际名称的细节;直到这个时候,我们才需要使用web services的名称。当然,应用服务器应当保证实际的web <br>&nbsp; services已经被绑定到jndi树上了。</p>
<p>例1.用户管理端口访问模式<br><br>&nbsp; 00 initialcontent ic = new initialcontext(); <br><br>&nbsp; 01 somespecificserviceinterface srv = (somespecificserviceinterface)ic.lookup&nbsp;(java:comp/env/service/somespecificserviceinterface); <br><br>&nbsp; 02 serviceinstance si = (somespecificservice)srv.getserviceinstanceport(); </p>
<p>  让我们来逐行研究这个程序片断,行00是传统的jndi查找。行01,我们得到接口serviceinterface的一个特定实例。所有的服务都需要实现services接口,这个接口定义了访问服务的一些公用方法,例如返回特定实例。如果你熟悉ejb规范,你将发现services接口和ejb本地接口有类似之处。行02,我们得到了定义了实际使用的方法的远程对象的一个实例。 </p>
<p>  当web service的定义在开发的时候已经完全已知的情况下我们一般使用用户管理端口访问模式。如果因为某种原因应用服务器不能返回支持行01 cast操作的实例,异常将会被抛出。</p>
<p>例2.容器管理端口访问模式<br><br>&nbsp; 00 initialcontent ic = new initialcontext();<br><br>&nbsp; 01 service srv = (service)ic.lookup<br><br>&nbsp; (java:comp/env/service/somespecificserviceinterface);<br><br>&nbsp; 02 serviceinstance si = (somespecificservice)srv.getport(); </p>
<p>  例2和例1仅有很小的差别。在01我们只需要对象的一个公用接口。没有指定返回的接口名称,所以容器可以自由的返回任意的匹配被请求的jndi名称的实例。行02也有一些差别:我们使用一个普通的getport()调用方法而不是像我们在例1中使用的那种特定名称的get<some <br>&nbsp; port&gt;port调用方法。</p>
<p>  规格说明书中声明当用户仅仅访问对象的服务定义时可以使用容器管理端口访问。行02假定客户端知道服务可能不支持的一个特定接口。如果容器不知道所需求的cast操作,异常将被抛出。更可能的是,客户端在build的时候没有一个完全的wsdl定义,因此他们不能用the&nbsp; get<some port>port()方法,但是他们会指定合适的实例类型――这种方式看起来更可行。</p>
<p><br>&nbsp; <strong>服务器编程模型</strong></p>
<p>  服务器编程模式可能是jsr109最重要的部分。理解web service在不同的生命周期的工作方式将帮助web service开发人员创建在不同条件下都可以按预定方式工作的web <br>&nbsp; service。ejb规格说明书定义了不同类型ejb的生命周期。jsr 109更进了一步,它扩展了ejb模式,定义了web services如何在web&nbsp; services容器里工作。jsr 109 关于服务器编程的定义是一个解决行为一致性的尝试。</p>
<p><strong><em>快速背景贴士</em></strong><em> web 应用和ejb 一般在&ldquo;容器&rdquo;内执行。容器提供ejb或者web 应用运行时需要需要的所有服务。事务,jndi,jdbc,所有类似的服务都由容可提供。一般来说,一个应用服务器里有两种容器――web&nbsp;应用容器和ejb容器。它们都提供相似的服务,比如生命周期管理,但也会有微小的差异,这个要看提供的是何种服务。web应用容器知道如何加载servlets;ejb容器知道如何加载ejb。</em></p>
<p>  在我们了解jsr 109规范内容之前,让我们先了解我们需要什么来支持web services顺应j2ee的工作方式。首先,web service的实现应该对客户透明。web&nbsp; service在应用服务器内实现这个事实不应该改变客户端对服务行为的认识。况且我们需要在很多的应用服务器里使用web service。因此,编程模式应该是轻便强壮的,不仅支持现在的实现也要支持将来的实现。</p>
<p>  另一点比较重要的是和现存j2ee服务的无缝整合,例如 jdbc。我们希望我们的web services能够方便的利用j2ee现存的优势而不危及到服务自身的完整性。</p>
<p>  有了这些目标,jsr 109定义了对web services两个领域的支持:无状态会话bean和servlets。jsr 109一个让人失望的地方是它在没有解释的情况下忽略了消息驱动bean的定义。消息bean支持可扩展的同步消息,这是web&nbsp; services的一个重要部分。由于消息bean的行为可以被无状态bean和servlets所模拟,所以我们需要编写额外的代码。</p>
<p>  在web services里端口的定义十分重要,jsr 109 定义了在j2ee应用服务器里如何将端口和服务进行映射。web service的端口在概念上类似于jvm里的实例。 <br></p>
<ul>
<li>wsdl: web service的接口定义,wsdl并不是web service的一部分,但它定义了web service之间如何互相联系。</li>&nbsp;
<li>服务接口定义 (sdi): web service的sdi定义了服务实际支持的方法。记住服务定义和服务实现是分开的。</li><br>
<li>服务实现: web service的实际实现。在jsr 109里,它是一个无状态会话ejb或者一个servlet。 一般来说,一个服务直接实现sdi,它可以也可以不具体实现sdi定义的java接口。</li><br>
<li>安全角色: 一旦jsr 109涉及到安全问题,它将从servletejb规范中继承相关定义。</li><br></ul>
<p><strong>用无状态会话bean实现web services</strong>&nbsp; </p>
<p>  jsr 109 一个很棒的地方就是无状态会话bean可以被用来简单快速的开发web services。那些没有足够ejb背景的人可以通读ejb关于无状态bean的规格说明书。规格说明书中对实施web services很重要的部分以下说明。</p>
<ul>
<li>遵循 jax-rpc 规范: web services必须遵循jax-rpc规范来正确的和客户端交互。参考jax-rpc 获取更详细信息。</li>&nbsp;
<li>无状态和无事务: 用无状态会话ejb实现的web services不能跟踪任何状态;也不可以得到事务上下文。</li><br>
<li>遵循sdi:一个服务的实现必须实现sdi定义的此服务的所有的方法</li>&nbsp;
<li>服务接口: 一般来说我们会实现服务接口,然而,在实际中,我们常常继承(或者已经产生)服务的实现,就像我们现在使用ejb那样。很明显,bean也可以实现sdi定义之外的其他的方法。</li><br>
<li>遵循无状态ejb需求: 因为无状态web services是基于传统的ejb规范,web services必须遵守无状态bean的相关规定。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li></ul>
<p>  以上的所有方面的定义适用于新的web services。那么我们可不可以把现有的ejb作为web services呢?因为ejb遵循规格说明书的规范,也没有违反jax-rpc的规定,它是可以作为一个现存服务的实现来部署的。实际上,从ejb容器的角度出发,ejb和服务并没有实际的区别。</p>
<p>  无状态会话bean在ejb容器里执行。容器本身控制了bean的生命周期,包括创建和消灭bean的实例。图1显示了无状态会话ejb的生命周期。考虑到大部分的应用服务器都支持&ldquo;缓冲&rdquo;或者&ldquo;预先创建&rdquo;对象实例的概念来提高应用效率。我增加了一个额外的&ldquo;概念性&rdquo;的状态来表示&ldquo;已缓冲&rdquo;。<br><br>&nbsp;&nbsp;<a href=&quot;http://www.matrix.org.cn/upload/article/200312203229.jpg&quot; target=_blank><img height=200 alt=&quot;&quot; hspace=0 src=&quot;http://www.matrix.org.cn/upload/article/200312203229.jpg&quot; width=200 border=0></a><br><br>&nbsp; 图1。无状态会话ejb的生命周期 </p>
<ul>
<li>does not exist: 在这个状态下,没有bean的实例可供使用。当bean从这个状态转变为pooled状态,或者直接变成ready状态那是因为应用服务器需要新实例来满足客户需求或一定数量的&ldquo;预创建&rdquo;bean已经被指定到缓冲池里。</li>&nbsp;
<li>pooled unallocated: 并不是所有的应用服务器都支持可用池的概念,因此,大部分的规格说明书都没有指定可选择的&ldquo;pooled unallocated&rdquo;状态。一些应用服务器比如说be'的weblogic&nbsp; 支持这个中间状态,就是说应用服务器预基于描述文件创建一定数量的可供使用的bean。当一个应用释放了bean的一个实例,这个实例会被重新初始化并放进缓冲池提供重用。</li>&nbsp;
<li>ready : 处在这个状态的bean已经被创建好,实例化好处于可用状态。在这个状态下它们可以接受和处理方法调用。</li></ul>
<p>  beans 因为许多原因转换状态。了解bean为什么进行状态的转换将帮助你理解如何开发行为正确的bean:</p>
<p>&nbsp;1. 事务1 表示bean的第一次创建。一般来说,应用服务器会预先创建一定数量的bean;然而,如果正在被使用并且有足够的空间,一个新的bean的实例将在客户访问的时候创建。新创建的bean在被使用之前,会调用它自己的init()方法进行初始化 。任何一次性的初始化工作都可以在这里完成。</p>
<p>&nbsp;2. 事务2表示从一个pooled状态到method-ready状态的转变。这种转变发生在当一个pooled的实例被分配给一个客户的时候,一般是通过get&lt;...&gt;port()方法调用。和刚才说得一样,pooled状态的存在是提高启动性能。</p>
<p>3. 事务3只是一个简单的&ldquo;例行工作&rdquo;。对象的一个实例被分配给一个客户然后客户调用方法。</p>
<p>4. 事务4发生在对象被释放的时候(例如:设定变量为null)或者从任何范围被调离的时候。基于应用服务器的不同实现方式,bean转换为pooled状态然后被初始化或者直接转变成does-not-exist状态。</p>
<p>5. 事务5发生在bean被实际撤除的时候。destroy()方法被调用,在这里用户可以取消在init()方法里做的任何事情。</p>
<p><strong>关于事务:</strong>现在web services不支持事务处理,在bean方法被调用的时候任何事务都将被挂起。就是说,这意味着bean不可以指定或者需要事物context,因此,不可以被标志为事务&ldquo;强制性&rdquo;。</p><br>
<p><strong>用servlets实现web services</strong></p>
<p>&nbsp;   用servlet和用ejb实现web services从概念上并没有很明显的不同。选择servlet作为实现工具完全是个人喜好。用servlet来实现web <br>&nbsp; services需要遵循和ejb实现相同的原则。这两种方式的不同在于底层实现方式。表1显示了一些最明显的不同之处。</p>
<p>  我们要指明的是这些不同是作者的观点而不是出自jsr 109的内容。</p>
<table cellspacing=0 cellpadding=0 width=&quot;97%&quot; border=1 &nbsp;>
<caption align=top><br>&nbsp; 表1:ejbservlet实现的不同<br>&nbsp; </caption><br>&nbsp;
<tbody>
<tr><br>&nbsp;&nbsp;&nbsp;
<td width=&quot;35%&quot; height=25>
<div align=center></div></td><br>&nbsp;&nbsp;&nbsp;
<td width=&quot;'&quot;>
<div align=center><strong>servlet</strong></div></td><br>&nbsp;&nbsp;&nbsp;
<td width=&quot;38%&quot;>
<div align=center><strong>ejb</strong></div></td><br>&nbsp; </tr><br>&nbsp;
<tr><br>&nbsp;&nbsp;&nbsp;
<td>生存时间(lifetime)</td><br>&nbsp;&nbsp;&nbsp;
<td>long-lived</td><br>&nbsp;&nbsp;&nbsp;
<td>一般是short-lived,如果使用缓存周期会长一些</td><br>&nbsp; </tr><br>&nbsp;
<tr><br>&nbsp;&nbsp;&nbsp;
<td>启动消耗(startup overhead)</td><br>&nbsp;&nbsp;&nbsp;
<td>can be significant</td><br>&nbsp;&nbsp;&nbsp;
<td>normally light</td><br>&nbsp; </tr><br>&nbsp;
<tr><br>&nbsp;&nbsp;&nbsp;
<td>内存印记(memory footprint)</td><br>&nbsp;&nbsp;&nbsp;
<td>large </td><br>&nbsp;&nbsp;&nbsp;
<td><br><br>&nbsp;&nbsp;&nbsp; small</td><br>&nbsp; </tr><br>&nbsp;
<tr><br>&nbsp;&nbsp;&nbsp;
<td>容器服务支持(container services support)</td><br>&nbsp;&nbsp;&nbsp;
<td>some</td><br>&nbsp;&nbsp;&nbsp;
<td>significant</td><br>&nbsp; </tr><br>&nbsp;
<tr><br>&nbsp;&nbsp;&nbsp;
<td><br>生命周期(lifecycle-aware)</td><br>&nbsp;&nbsp;&nbsp;
<td>marginally</td><br>&nbsp;&nbsp;&nbsp;
<td>very</td><br>&nbsp; </tr><br>&nbsp;
<tr><br>&nbsp;&nbsp;&nbsp;
<td>事务(transaction)</td><br>&nbsp;&nbsp;&nbsp;
<td>unsupported</td><br>&nbsp;&nbsp;&nbsp;
<td>must not be required</td></tr><br>&nbsp;
<tr><br>&nbsp;&nbsp;&nbsp;
<td>must implement(必需实现)</td><br>&nbsp;&nbsp;&nbsp;
<td>javax.servlet.singlethreadmodel</td><br>&nbsp;&nbsp;&nbsp;
<td>javax.ejb.sessionbean</td><br>&nbsp; </tr>
<tr>&nbsp;&nbsp;&nbsp;
<td>scales(性能)</td>
<td>poorly</td>&nbsp;&nbsp;&nbsp;
<td>well</td>&nbsp; </tr>&nbsp;
<tr>&nbsp;&nbsp;&nbsp;
<td>when you might choose(什么时候选择使用)</td>&nbsp;&nbsp;&nbsp;
<td>当需要很小数量的 long-lived方法并且不考虑启动消耗的情况下</td>
<td>当需要大量的short-lived调用</td></tr></tbody></table><br>
<p>  servletejb方式的一个很重要的不同是生命周期的管理。正如我们在图 1上看到的那样,ejb知道它是通过init()方法调用被创建,通过destroy()方法调用被移除。servlet的说明文档里没有类似的接口;为了支持相似的行为,jsr109定义了一个额外的接口―― java.xml.rpc.server.servicelifecycle――来提供相似的行为。</p>
<p>&nbsp; example 3. java.xml.rpc.server.servicelifecycle<br><br>&nbsp; package java.xml.rpc.server;<br><br>&nbsp; public interface servicelifecycle {<br><br>&nbsp; void init(object context) throws servletexception;<br><br>&nbsp; void destroy();<br><br>&nbsp; } </p><br>
<p><strong>&nbsp; 部署</strong></p>
<p>  &nbsp; 部署解决了web service使用细节和实现细节的分离。它既定义了打包也定义了命名/初始化。开发人员可能定义一些基于部署考虑是必需的,比如服务的名字和需要何种初始化,但是为了web&nbsp;&nbsp; service能正确的工作,部署人员必需指定这些参数。jsr 109使用一个新的部署描述文件webservices.xml把它的部署架构于普通ejb或者web&nbsp; 应用的部署之上。</p>
<p>  jsr109的如此定义使web service的部署看起来和ejb部署非常类似。例4 显示了webservices.xml文件的大概样子,它包括5个主要元素。 </p>
<ul>
<li>端口名称:应用服务器用来辨认端口的唯一的端口名称。注意端口名称和ejb部署器里ejb名称类似。这并不是实际端口名,只是用来作为标识。使用port-component-name元素来声明。</li>&nbsp;
<li>端口q名称:web service命名空间和wsdl名称。使用元素port-qname-localname和元素port-qname-namespace来指定。</li><br>&nbsp; wsdl定义:在包.war 或 .jar内指向wsdl的路径。<br>&nbsp;
<li>服务定义接口类:实现web service服务接口功能的类名。用元素service-def-interface来指定。考虑到有两种可能的实现机制,在实际使用中这个类很可能是被创建的,就像许多ejb接口类那样。</li>&nbsp;
<li>端口服务实现:bean的实现用元素ejb-link 或者 servlet-link指向实际的服务实现。由于webservice.xml文件本身要被打包进包含服务实现的&nbsp;&nbsp;&nbsp;&nbsp; .jar 或者 .war文件里,这些链接所指定的实现必需已经被设定,就是说,你必须引用一个存在的ejb或者servlet。</li><br></ul>
<p>  例4显示了webservices.xml文件的大概样子。需要指出的是,这个例子是基于规格说明书的.03版本,可能已经有所改变。代码很简单(完整的dtd可以在说明文档里找到),但是也需要一些解释。</p>
<p>  行12-16链接行05 的wsdl提供的web service描述。ejb或者servlet都可以被指定为web service的引擎,并且必需链接回先前定义的ejb或者servlet。行11定义了取得web <br>&nbsp; service端口所需要的服务接口。行08 和 09 指定了web service的外部名称,这样外部的用户就可以使用了。</p>
<p>example 4. sample webservices.xml<br><br>&nbsp; 00 <?xml version=&quot;1.0&quot;?><br><br>&nbsp; 01 <webservices><br><br>&nbsp; 02 <description>my first web service using jsp 109</description><br><br>&nbsp; 03 <display-name>sample</display-name><br><br>&nbsp; 04 <web-services-description><br><br>&nbsp; 05 <wsdl-name>path.to.the.wsdl.representing.the.service</wsdl-name><br><br>&nbsp; 06 <port-components><br><br>&nbsp; 07 .. various optional elements such as description etc<br><br>&nbsp; 08 <port-component-name>mywebservice</port-component-name><br><br>&nbsp; 09 <port-qname-namespace>qualifying.namespace</port-qname-namespace><br><br>&nbsp; 10 <port-qname-localname>name.within.namespace</port-qname-localname><br><br>&nbsp; 11 <service-def-interface>com.webservicesareus.webservice.sampleservint<br><br></service-def-interface><br><br>12 <service-impl-bean><br><br>13 <ejb-link>link to a named ejb</ejb-link><br><br>14 or<br><br>15 <servlet-link>link to a named servlet</servlet-link><br><br>16 </service-impl-bean><br><br>17 </port-components><br><br>18 </web-services-description><br><br>19 </webservices></p><br>
<p>  jsr 109是一个定义web services如何融合进j2ee应用服务的有趣文档。由于一些明确问题的存在,比如为什么mbeans会被忽略,这个说明文档覆盖了需要被用来定义web <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; services如何整合进现有的j2ee应用的主要领域。我将一直密切关注这个jsr和在安全方面一些类似的jsr。</p><br>
<p><strong>原作者:</strong></p>
<p>al saganich 是bea系统公司的资深开发人员和企业java技术工程师,主要研究java集成和xmlweb services系统。</p><a href=&quot;http://www.matrix.org.cn/html/article/200312201439.jpg&quot; target=_blank></a><a href=&quot;http://www.matrix.org.cn/upload/article/200312203229.jpg&quot; target=_blank></a>


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons