⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ejb2_0中的变化增强,应用程序开发的灵活性和可移植性3.htm

📁 写给JSP初级程序员的书
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://eps.www85.cn4e.com/java/article/devshow.asp?id=68 -->
<HTML><HEAD><title>csdn_EJB2.0中的变化增强,应用程序开发的灵活性和可移植性3</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>TD {
	FONT-FAMILY: "Verdana", "Arial", "宋体"; FONT-SIZE: 9pt
}
A {
	COLOR: #660000; TEXT-DECORATION: underline
}
A:hover {
	COLOR: #660000; TEXT-DECORATION: none
}
.line {
	LINE-HEIGHT: 14pt
}
</STYLE>

<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>
<table>
  <table><tbody>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT size=3>EJB2.0中的变化增强,应用程序开发的灵活性和可移植性3 <BR><FONT size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300><BR><BR>在部署时,部署者将使用持久性管理器工具来具体实现这个&nbsp;bean&nbsp;类及其从属类。这些具体实现将在运行时保持各种关系,并使各&nbsp;bean&nbsp;实例的状态与数据库同步。容器将在运行时管理持久性实例,从而提供一种强健的环境,其中具有自动的访问控制和事务控制。&nbsp;<BR><BR>bean&nbsp;也可以定义从属对象的值,这些对象是可序列化的对象,如&nbsp;EJB&nbsp;1.1&nbsp;示例中的&nbsp;Address&nbsp;对象。这些值通过序列化而变为持久的,它们并不形成与&nbsp;bean&nbsp;的关系&nbsp;--&nbsp;它们是严格的容器管理的持久性字段。&nbsp;<BR><BR>容器与持久性管理器之间也已经定义了一个合约,使持久性管理器可以获得事务的句柄,并访问由该容器管理的数据库连接池。这个合约稍嫌宽松,将来还需要使其更为严格,但它是允许持久性管理器跨&nbsp;EJB&nbsp;容器移植的基础。容器和持久性管理器之间合约的细节已超出了本文的范围。&nbsp;<BR><BR>除了通过抽象持久性方案定义持久性之外,EJB&nbsp;2.0&nbsp;还提供了一种新的查询语言,用来说明持久性管理器应该如何实现&nbsp;CMP&nbsp;中的各种查找方法。&nbsp;<BR><BR>EJB&nbsp;查询语言&nbsp;<BR>EJB&nbsp;查询语言&nbsp;(EJB&nbsp;QL)&nbsp;规定了持久性管理器应该如何实现在本地接口中定义的各种查找方法。&nbsp;EJB&nbsp;QL&nbsp;以&nbsp;SQL-92&nbsp;为基础,可由持久性管理器自动编译,这使得实体&nbsp;bean&nbsp;具有更高的可移植性,并且更容易部署。&nbsp;<BR><BR>EJB&nbsp;QL&nbsp;和查找方法&nbsp;<BR>EJB&nbsp;QL&nbsp;语句是在实体&nbsp;bean&nbsp;的部署描述符中声明的。使用&nbsp;EJB&nbsp;QL&nbsp;非常简单。作为一个例子,Employee&nbsp;bean&nbsp;的本地接口可以按以下方式声明:&nbsp;<BR><BR>public&nbsp;interface&nbsp;EmployeeHome&nbsp;extends&nbsp;javax.ejb.EJBHome&nbsp;<BR>{&nbsp;<BR>...&nbsp;<BR><BR>public&nbsp;Employee&nbsp;findByPrimaryKey(Integer&nbsp;id)&nbsp;<BR>throws&nbsp;RemoteException,&nbsp;CreateException;&nbsp;<BR><BR>public&nbsp;Collection&nbsp;findByZipCode(String&nbsp;zipcode)&nbsp;<BR>throws&nbsp;RemoteException,&nbsp;CreateException;&nbsp;<BR><BR>public&nbsp;Collection&nbsp;findByInvestment(String&nbsp;<BR>investmentName)&nbsp;<BR>throws&nbsp;RemoteException,&nbsp;CreateException;&nbsp;<BR><BR>}&nbsp;<BR><BR><BR><BR>给定了上面的本地接口定义之后,您就可以使用&nbsp;EJB&nbsp;QL&nbsp;来指定持久性管理器应该如何执行查找方法。每个实体&nbsp;bean&nbsp;都必须有一个&nbsp;findByPrimaryKey()&nbsp;方法。为执行该方法所需的查询是很明显的&nbsp;--&nbsp;使用主关键字的(一个或几个)字段在数据库中查找&nbsp;bean,这样就不需要任何&nbsp;EJB&nbsp;QL&nbsp;语句。&nbsp;<BR><BR>findByZipCode()&nbsp;方法用来获得具有某个邮政编码的所有&nbsp;Employee&nbsp;bean。这将使用部署描述符中的下列&nbsp;EJB&nbsp;QL&nbsp;来表达。&nbsp;<BR><BR>FROM&nbsp;contactInfo&nbsp;WHERE&nbsp;contactInfo.zip&nbsp;=&nbsp;?1&nbsp;<BR><BR>该语句本质上是表示“选择其邮政编码等于&nbsp;zipcode&nbsp;参数的所有&nbsp;Employee&nbsp;bean”。&nbsp;<BR><BR>在用于查找方法的&nbsp;EJB&nbsp;QL&nbsp;语句中,不需要使用&nbsp;SELECT&nbsp;子句来表明要选择的内容。这是因为,查找方法将总是选择与其自身的&nbsp;bean&nbsp;类型相同的远程引用。在这种情况下,就可以认为选择语句将返回远程&nbsp;Employee&nbsp;bean&nbsp;的全部引用。&nbsp;<BR><BR>如果各种查找方法都一起部署在同一个&nbsp;ejb-jar&nbsp;文件中,并且其间具有可导航的实际关系,那么这些查找方法就甚至可以跨越到另一些&nbsp;bean&nbsp;的抽象持久性方案中去。例如,findByInvestment()&nbsp;方法将要求该查找查询从&nbsp;Employee&nbsp;导航到投资&nbsp;bean&nbsp;的抽象持久性方案中去。声明来表达这种查找操作的&nbsp;EJB&nbsp;QL&nbsp;语句如下所示。&nbsp;<BR><BR>FROM&nbsp;element&nbsp;IN&nbsp;benefit.investments&nbsp;WHERE&nbsp;element.name&nbsp;<BR>=&nbsp;?1&nbsp;<BR><BR><BR><BR>以上语句是说:“选择全部这样的&nbsp;Employee&nbsp;bean:其获利从属对象至少包含一个投资&nbsp;bean&nbsp;的引用,并且其名称等于&nbsp;findByInvestment()&nbsp;方法的&nbsp;investmentName&nbsp;参数。”&nbsp;<BR><BR>EJB&nbsp;QL&nbsp;和选择方法&nbsp;<BR>EJB&nbsp;QL&nbsp;也用于一种称为&nbsp;ejbSelect&nbsp;方法的新查询方法中,该方法类似于查找方法,只是它仅供&nbsp;bean&nbsp;类使用。该方法不在本地接口中声明,所以也不显露给客户机。此外,ejbSelect&nbsp;方法可返回范围更大的各种值,而不仅限于&nbsp;bean&nbsp;本身的远程接口类型。&nbsp;<BR><BR>存在两种选择方法:ejbSelect&lt;METHOD&gt;&nbsp;和&nbsp;ejbSelect&lt;METHOD&gt;InEntity。ejbSelect&lt;METHOD&gt;&nbsp;方法是全局执行的,这是指这种方法并非专用于执行该方法的&nbsp;bean&nbsp;实例。ejbSelect&lt;METHOD&gt;InEntity&nbsp;方法则专用于执行该方法的实体实例。这些选择方法在&nbsp;bean&nbsp;类中被声明为抽象方法,并在这些类的业务方法中使用。下面是&nbsp;ejbSelect&lt;METHOD&gt;&nbsp;方法和&nbsp;ejbSelect&lt;METHOD&gt;InEntity&nbsp;方法的示例,同时说明了可以如何在业务方法中使用它们。&nbsp;<BR><BR>public&nbsp;abstract&nbsp;class&nbsp;EmployeeBean&nbsp;implements&nbsp;<BR>javax.ejb.EntityBean&nbsp;{&nbsp;<BR>...&nbsp;<BR>//&nbsp;ejbSelectInEntity&nbsp;<BR>public&nbsp;abstract&nbsp;Collection&nbsp;<BR>ejbSelectInvestmentsInEntity&nbsp;(String&nbsp;risk);&nbsp;<BR><BR>//&nbsp;ejbSelect&nbsp;<BR>public&nbsp;abstract&nbsp;Collection&nbsp;<BR>ejbSelectInvestments(String&nbsp;risk);&nbsp;<BR>...&nbsp;<BR>}&nbsp;<BR><BR><BR><BR>在上面的声明中,两种选择方法运行于不同的范围。ejbSelectInvestmentsInEntity()&nbsp;仅在当前的&nbsp;Employee&nbsp;bean&nbsp;实例上执行,所以它只返回雇员的风险投资。&nbsp;<BR><BR>SELECT&nbsp;invest&nbsp;FROM&nbsp;invest&nbsp;IN&nbsp;benefit.investments&nbsp;WHERE&nbsp;<BR>invest.type&nbsp;=&nbsp;?1&nbsp;<BR><BR><BR><BR>另一方面,ejbSelect&lt;METHOD&gt;&nbsp;方法的范围则是全局性的,所以同一个查询将返回整个企业内所有雇员的全部风险投资。&nbsp;<BR><BR>ejbSelect&lt;METHOD&gt;InEntity&nbsp;选择方法可以返回&nbsp;bean&nbsp;的远程类型(如在上面的查询中那样)、从属对象或任何其它&nbsp;Java&nbsp;类型。另一方面,全局选择方法则不能返回&nbsp;bean&nbsp;的从属对象类型。&nbsp;<BR><BR>选择方法的&nbsp;EJB&nbsp;QL&nbsp;语句要求使用&nbsp;SELECT&nbsp;子句,因为它们能够返回范围更广的各种值。&nbsp;<BR><BR>新的&nbsp;ejbHome&nbsp;方法&nbsp;<BR>在&nbsp;EJB&nbsp;2.0&nbsp;中,实体&nbsp;bean&nbsp;可以声明一些&nbsp;ejbHome&nbsp;方法,用来执行与&nbsp;EJB&nbsp;组件相关的操作,但并不专用于某个&nbsp;bean&nbsp;实例。在&nbsp;bean&nbsp;类中定义的&nbsp;ejbHome&nbsp;方法在本地接口中必须有一个与其相匹配的本地方法。下面的代码说明了一个本地方法,它正是作为&nbsp;Employee&nbsp;bean&nbsp;的本地接口定义的。applyCola()&nbsp;方法用来根据最近&nbsp;COLA(生活费用调整)的增长来更新所有雇员的薪水。&nbsp;<BR><BR><BR>public&nbsp;interface&nbsp;EmployeeHome&nbsp;extends&nbsp;javax.ejb.EJBHome&nbsp;<BR>{&nbsp;<BR>//&nbsp;本地方法&nbsp;<BR>public&nbsp;void&nbsp;applyCola(double&nbsp;increate)&nbsp;throws&nbsp;<BR>RemoteException;&nbsp;<BR>...&nbsp;<BR>}&nbsp;<BR><BR><BR><BR>applyCola()&nbsp;方法在&nbsp;bean&nbsp;类中必须有匹配的&nbsp;ejbHome&nbsp;方法,它被声明为&nbsp;ejbHomeApplyCola()。ejbHomeApplyCola()&nbsp;方法并非专用于一个&nbsp;bean&nbsp;实例,它的范围是全局的,所以它将对所有雇员的薪水使用同一个&nbsp;COLA。&nbsp;<BR><BR>public&nbsp;abstract&nbsp;class&nbsp;EmployeeBean&nbsp;implements&nbsp;<BR>javax.ejb.EntityBean&nbsp;{&nbsp;<BR>...&nbsp;<BR>//&nbsp;ejbHome&nbsp;方法&nbsp;<BR>public&nbsp;void&nbsp;ejbHomeApplyCola&nbsp;(double&nbsp;increase&nbsp;){&nbsp;<BR>Collection&nbsp;col&nbsp;=&nbsp;ejbSelectAllEmployees&nbsp;();&nbsp;<BR>Iterator&nbsp;employees&nbsp;=&nbsp;col.iterator();&nbsp;<BR>while(employees.next()){&nbsp;<BR>Employee&nbsp;emp&nbsp;=&nbsp;<BR>(Employee)employees.next();&nbsp;<BR>double&nbsp;salary&nbsp;=&nbsp;<BR>emp.getAnnualSalary();&nbsp;<BR>salary&nbsp;=&nbsp;salary&nbsp;+&nbsp;(salary*increase);&nbsp;<BR>emp.setAnnualSalary(salary);&nbsp;<BR>}&nbsp;<BR>}&nbsp;<BR>}&nbsp;<BR><BR><BR><BR>bean&nbsp;的开发人员需要为&nbsp;BMP&nbsp;和&nbsp;CMP&nbsp;实体&nbsp;bean&nbsp;都实现&nbsp;ejbHome&nbsp;方法。CMP&nbsp;实现可能在很大程度上要依赖于全局的选择语句(如上面所说明的那样)和&nbsp;finder&nbsp;方法,而&nbsp;ejbHome&nbsp;的&nbsp;BMP&nbsp;实现则将使用直接数据库访问和&nbsp;bean&nbsp;的&nbsp;finder&nbsp;方法,来查询数据和进行更改。&nbsp;<BR><BR>MessageDrivenBean&nbsp;<BR>在&nbsp;EJB&nbsp;2.0&nbsp;中,对规范的一个基础性更改是添加了一种全新的企业级&nbsp;bean&nbsp;类型,即&nbsp;MessageDrivenBean。MessageDrivenBean&nbsp;专门设计来处理入网的&nbsp;JMS&nbsp;消息。对于许多开发人员来说,JMS&nbsp;是一种新的范例,所以本文将花一些时间逐步说明对&nbsp;JMS&nbsp;的理解,以及它们在&nbsp;EJB&nbsp;2.0&nbsp;中的用法。&nbsp;<BR><BR>什么是&nbsp;JMS?&nbsp;<BR>JMS&nbsp;是一种与厂商无关的&nbsp;API,用来访问消息收发系统。它类似于&nbsp;JDBC&nbsp;(Java&nbsp;Database&nbsp;Connectivity):这里,JDBC&nbsp;是可以用来访问许多不同关系数据库的&nbsp;API,而&nbsp;JMS&nbsp;则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持&nbsp;JMS,包括&nbsp;IBM&nbsp;的&nbsp;MQSeries、BEA&nbsp;的&nbsp;Weblogic&nbsp;JMS&nbsp;service&nbsp;和&nbsp;Progress&nbsp;的&nbsp;SonicMQ,这只是几个例子。&nbsp;<BR><BR>JMS&nbsp;使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个&nbsp;JMS&nbsp;客户机向另一个&nbsp;JML&nbsp;客户机发送消息。消息是&nbsp;JMS&nbsp;中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本&nbsp;(TextMessage)、可序列化的对象&nbsp;(ObjectMessage)、属性集合&nbsp;(MapMessage)、字节流&nbsp;(BytesMessage)、原始值流&nbsp;(StreamMessage),还有无有效负载的消息&nbsp;(Message)。&nbsp;<BR><BR>消息收发系统是异步的,也就是说,JMS&nbsp;客户机可以发送消息而不必等待回应。比较可知,这完全不同于基于&nbsp;RPC&nbsp;的(基于远程过程的)系统,如&nbsp;EJB&nbsp;1.1、CORBA&nbsp;和&nbsp;Java&nbsp;RMI&nbsp;的引用实现。在&nbsp;RPC&nbsp;中,客户机调用服务器上某个分布式对象的一个方法。在方法调用返回之前,该客户机被阻塞;该客户机在可以执行下一条指令之前,必须等待方法调用结束。在&nbsp;JMS&nbsp;中,客户机将消息发送给一个虚拟通道(主题或队列),而其它&nbsp;JMS&nbsp;客户机则预订或监听这个虚拟通道。当&nbsp;JMS&nbsp;客户机发送消息时,它并不等待回应。它执行发送操作,然后继续执行下一条指令。消息可能最终转发到一个或许多个客户机,这些客户机都不需要作出回应&nbsp;<BR><BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -