应用程序查看源代码

查看源代码  时间:2021-03-21  阅读:()
SunMicrosystems,Inc.
4150NetworkCircleSantaClara,CA95054U.
S.
A.
650-960-1300关于本文档的建议请发到:docfeedback@sun.
com构建J2EE应用程序SunONEStudio5编程系列部件号码817-3290-102003年10月,修订A请回收版权所有(C)2003SunMicrosystems,Inc.
,4150NetworkCircle,SantaClara,California95054,U.
S.
A.
保留所有权利.
SunMicrosystems,Inc.
具有与本文档所描述的产品中所含技术相关的知识产权.
需特别指出的是(但不局限于此),这些知识产权可能包括一项或多项在http://www.
sun.
com/patents上列出的美国专利,以及一项或多项在美国和其它国家(地区)的其它专利或待批的专利申请.
本文档及其相关产品依据限制其使用、复制、分发和反编译的许可证进行分发.
未经Sun及其许可方(如果存在)的事先书面授权,不得以任何形式、任何手段复制本文档或产品的任何部分.
第三方软件(包括字体技术)的版权归Sun供应商所有并由他们授权.
Sun、SunMicrosystems、Sun徽标、Forte、Java、NetBeans、iPlanet、docs.
sun.
com和Solaris是SunMicrosystems,Inc.
在美国和其它国家(地区)的商标或注册商标.
所有的SPARC商标均需获得授权才能使用,它们是SPARCInternational,Inc.
在美国和其它国家(地区)的商标或注册商标.
标有SPARC商标的产品都基于由SunMicrosystems,Inc.
开发的体系结构.
UNIX是在美国和其它国家(地区)的注册商标,由X/OpenCompany,Ltd.
独家授权.
政府采购:商业软件-政府用户受标准许可证条款和条件的约束.
本文档按"原样"提供,对所有明示或默示的条件、陈述和担保,包括对适销性、特殊用途的适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效.
3目录开始之前9阅读本书须知10本书的结构11排版惯例12相关的文档12与Sun技术支持联系15Sun欢迎您提出意见和建议151.
组装、部署和执行的基础知识17组装的基础知识17J2EE应用程序是模块化的17J2EE应用程序由J2EE运行环境支持19J2EE应用程序是分布式的22模块和应用程序的可视化表示25Web模块25EJB模块26J2EE应用程序27属性表单27部署的基础知识28执行的基础知识29使用本书304构建J2EE应用程序2003年10月2.
方案:Web模块31本模块中的交互操作32本模块的编程33创建欢迎页面33Servlet方法的编程36将URL映射到Servlet41其它组装任务433.
方案:EJB模块51本模块中的交互操作52本模块的编程53创建会话企业bean的远程接口54创建实体企业bean的本地接口55在会话企业bean中使用本地接口55组装EJB模块584.
方案:Web模块和EJB模块67本应用程序中的交互操作68本应用程序的编程69创建J2EE应用程序69设置web模块的web上下文71链接EJB引用72附加组装任务755.
方案:Web模块和队列模式消息驱动Bean79本应用程序中的交互操作80为消息驱动通讯编程81设置应用程序服务器81Web模块编程83EJB模块编程90组装J2EE应用程序92目录56.
事务93缺省事务边界93重定义事务边界957.
安全性99Web模块的安全性100EJB模块的安全性107J2EE应用程序的安全性1148.
部署并执行J2EE模块和应用程序117服务器的可视化表示117服务器注册节点118已安装的服务器节点119服务器产品节点119SunONE应用程序服务器节点119缺省服务器节点122特定服务器属性122使用服务器实例节点来部署并执行123A.
IDE如何支持J2EE模块及应用程序的部署125部署进程125服务器插件概念126使用插件的部署过程127部署除web模块及J2EE应用程序外的组件127索引1296构建J2EE应用程序2003年10月7图图1-1使用J2EE组件和模块的多层应用程序22图1-2Web模块的节点和子节点26图1-3EJB模块的节点和子节点26图1-4J2EE应用程序节点及其子节点27图2-1CatalogWebModuleweb模块31图2-2[欢迎文件]属性编辑器35图2-3具有未链接引用的[EJB引用]属性编辑器39图2-4具有链接引用的[EJB引用]属性编辑器40图2-5[Servlet映射]属性编辑器42图2-6[Servlet映射]属性编辑器43图2-7[错误页面]属性编辑器44图2-8[JSP文件]属性编辑器46图2-9[Servlet映射]属性编辑器47图2-10[增加环境条目]对话框49图3-1CatalogDataEJB模块51图3-2[增加EJB引用]对话框58图3-3EJB模块CMP资源属性编辑器61图3-4[增加资源引用]对话框63图3-5[增加资源引用]对话框,特定服务器标签64图4-1CatalogAppJ2EE应用程序678构建J2EE应用程序2003年10月图4-2CatalogWebModule的属性表单72图4-3取消链接的EJB引用73图4-4通过覆盖链接的EJB引用74图4-5J2EE应用程序[环境条目]属性编辑器75图4-6覆盖环境条目值76图5-1具有队列模式消息驱动bean的J2EE应用程序79图5-2增加CheckoutQueue的资源环境引用86图5-3提供队列引用的JNDI名称87图5-4QueueConnectionFactory的资源引用88图5-5QueueConnectionFactory引用的JNDI名称89图5-6消息驱动bean属性表单90图5-7消息驱动bean的[连接工厂]属性编辑器91图6-1缺省的事务属性设置94图6-2复杂事务95图6-3更改后的事务设置97图7-1为web模块声明的安全角色Me和EveryoneElse101图7-2定义名为allItems的web资源102图7-3[增加安全限制]对话框中的allItems资源103图7-4为名为allItems的web资源指定限制104图7-5映射到角色Me的名为roleRefMe的安全角色引用106图7-6EJB模块的[安全角色]属性编辑器108图7-7EJB[方法权限]属性编辑器109图7-8声明的安全角色引用everyOne111图7-9EJB模块属性编辑器中的everyOne安全角色引用112图7-10EJB模块的[安全角色引用]属性编辑器113图7-11J2EE应用程序[安全角色]属性编辑器中的安全角色114图7-12名为myself的角色被映射到名为Me的角色115图8-1服务器注册节点118图8-2EJB模块的SunONEAS标签122图A-1服务器插件使得IDE能够与J2EE运行环境通讯1269开始之前SunMicrosystems,Inc支持的JavaCommunityProcess发展了用Java2平台,EnterpriseEdition(J2EE平台)设计分布式企业应用程序的标准.
第10页的"阅读本书须知"中所列的J2EE平台文档涵盖了应用程序设计和体系结构的这些标准.
本书介绍了如何使用SunONEStudio5,StandardEdition开发人员工具来实现这些体系结构.
其中包括使用IDE来组合组件并创建J2EE模块,确定所有组件都按照应用程序设计所指定的方式进行交互操作.
此外还包括组合J2EE模块来创建J2EE应用程序,确定模块间的分布式交互操作按照应用程序设计所调用的方式进行.
不同平台中的屏幕截图会稍有不同.
虽然几乎所有的过程都使用SunONEStudio5软件界面,但有时也可能要求您在命令行输入命令.
不同平台的命令行也会稍有不同,例如,在MicrosoftWindows中的命令有可能是:而UNIX命令则可能是:c:>cdMyWorkDir\MyPackage%cdMyWorkDir/MyPackage10构建J2EE应用程序2003年10月阅读本书须知本书旨在让使用SunONEStudio5IDE的读者能够组装、部署或执行J2EE应用程序.
第一章简明扼要地介绍了在J2EE平台中进行组装和部署的概念,读者可以获得对组装和部署的初步理解.
阅读本书前,您必须熟悉以下内容:Java编程语言J2EE的概念Web和应用程序服务器软件本书要求具备J2EE概念的知识,如下列资源中所述:《Java2平台,EnterpriseEdition蓝图》http://java.
sun.
com/j2ee/blueprints《Java2平台,EnterpriseEdition规范》http://java.
sun.
com/j2ee/download.
html#platformspec《J2EE教程》http://java.
sun.
com/j2ee/tutorial《JavaServlet规范2.
3版》http://java.
sun.
com/products/servlet/download.
html#specs《JavaServerPages规范1.
2版》http://java.
sun.
com/products/jsp/download.
html#specs若熟悉基于XML的RPC中的JavaAPI(JAX-RPC),则对读者更有帮助.
更多信息请参阅以下web页:http://java.
sun.
com/xml/jaxrpc注–Sun公司不对本文档所提及的第三方web站点的可用性负责,而且Sun公司不认可也不对以上站点或资源上的任何内容、广告、产品或其它资料承担责任.
此外,Sun公司也不会因您使用或依靠以上任何站点或资源上的(或通过该站点或资源所获取的)内容、货物或服务所产生的(或所谓产生的)任何损失承担责任.
开始之前11本书的结构J2EE平台能够使用面向组件的方法来开发企业应用程序.
应用程序开发人员将企业逻辑封装在EnterpriseJavaBeans(EJB)组件和web组件中.
创建组件之后,开发人员将组件组装到模块中而模块是执行可识别业务任务的逻辑单元.
组装模块之后,开发人员再将模块组装到J2EE应用程序中,J2EE应用程序执行全部的业务处理.
本书介绍了如何使用SunONEStudio5开发环境将组件组装到模块中,再将模块组装到应用程序中.
本书通过一系列方案来展现这些信息.
第1章概述了组装和部署J2EE的概念.
其中定义了模块和应用程序的J2EE单元,并且仔细分析了模块和应用程序的部署描述符.
此外还解释了如何在IDE中组装模块和应用程序.
特别要指出的是,该章还解释了如何使用模块和应用程序属性表来设置模块和应用程序部署描述符.
第2章提供了如何组装web模块的方案.
此外该章还简要描述了用作J2EE应用程序前端的web模块,最后介绍了如何对web模块进行编程.
第3章提供了如何组装EJB模块的方案.
该章简要描述了用于J2EE应用程序的EJB模块.
最后介绍了如何对EJB模块进行编程.
第4章提供了如何通过组合web模块和EJB模块来组装J2EE应用程序的方案.
该章概述了组合web模块和EJB模块的J2EE应用程序.
在该章的最后,介绍了如何组装应用程序.
该方案使用JavaRMI在两个模块之间进行同步交互操作.
第5章提供了如何使用消息驱动企业bean或MDB建立模块间异步通信的方案.
该章简要描述了用于企业应用程序的异步通信.
最后,该章介绍了如何对应用程序的发送端和接收端进行编程.
这一章的方案使用了与EJB模块进行通信的web模块,不过其中的示例也适用于其它模块组合.
第6章解释了如何使用IDE来编程容器管理的事务.
第7章解释了如何使用IDE保护J2EE应用程序中的资源.
该章介绍了如何在模块级设置安全角色,如何使用安全角色来限制对web模块资源和企业bean方法的访问.
此外,该章还介绍了将模块组装到应用程序时如何映射安全角色.
第8章解释了如何部署并执行已组装的应用程序.
特别要指出的是,该章解释了如何在部署前使应用程序适应特定的服务器产品.
附录A说明IDE用于与web和应用程序服务器进行交互的机制,其中包括对部署过程的详细说明.
12构建J2EE应用程序2003年10月排版惯例相关的文档SunONEStudio5文档包括以AcrobatReader(PDF)格式提供的书籍、发行说明、联机帮助、示例应用程序的自述文件以及Javadoc文档.
字体含义示例AaBbCc123命令、文件和目录的名称;计算机屏幕输出编辑您的.
cvspass文件.
使用DIR列出所有文件.
Searchiscomplete.
AaBbCc123键入的内容,以便与计算机屏幕输出相区别>loginPassword:AaBbCc123书名、新词或术语以及要强调的词请阅读《用户指南》的第6章.
这些称作类选项.
您必须保存更改.
AaBbCc123命令行变量,用实际的名称或值替换要删除文件,请输入DELfilename.
开始之前13联机文档本部分介绍的文档可从docs.
sun.
comSMWeb站点和SunONEStudioDeveloperResources(SunONEStudio开发人员资源)门户(http://forte.
sun.
com/ffj/documentation)的文档页面中找到.
docs.
sun.
comWeb站点(http://docs.
sun.
com)使您可以通过因特网阅读、打印和购买SunMicrosystems的手册.
如果找不到手册,请参见与本地系统或网络上的产品一同安装的文档索引.
发行说明(HTML格式)每个SunONEStudio5版本均提供了发行说明.
介绍了最新的发行更改和技术说明.
《SunONEStudio5,StandardEdition发行说明》-部件号码817-2337-10入门指南(PDF格式)介绍如何在每个支持的平台上安装SunONEStudio5集成开发环境(IDE),还包括其它相关信息,如系统需求、升级说明、应用程序服务器信息、命令行开关、已安装的子目录、数据库集成,以及有关如何使用更新中心的信息.
《SunONEStudio5,StandardEdition入门指南》-部件号码817-3302-10《SunONEStudio4,MobileEdition入门指南》-部件号码817-1145-10SunONEStudio5编程系列(PDF格式)本系列深入介绍了如何使用各种SunONEStudio5功能以开发正确格式的J2EE应用程序.
《构建Web组件》-部件号码817-3292-10描述如何使用JSP页、servlet、标记库以及支持的类和文件生成一个作为J2EEWeb模块的Web应用程序.
《构建J2EE应用程序》-部件号码817-3290-10描述如何将EJB模块和Web模块组装到J2EE应用程序中,以及如何部署和运行J2EE应用程序.
《构建EnterpriseJavaBeans组件》-部件号码817-3288-10描述如何使用SunONEStudio5EJB生成器向导和IDE的其它组件生成EJB组件(会话Bean、消息驱动Bean和包含容器管理持续性或Bean管理持续性的实体Bean).
《构建Web服务》-部件号码817-3294-10描述如何使用SunONEStudio5IDE生成Web服务、如何通过UDDI注册表使Web服务可供其它服务使用,以及如何通过本地Web服务或UDDI注册表生成Web服务客户机.
《使用Java数据库连接》-部件号码817-3296-10描述如何使用SunONEStudio5IDE的JDBC生产率增强工具,包括如何使用这些工具创建JDBC应用程序.
14构建J2EE应用程序2003年10月SunONEStudio5教程(PDF格式)这些教程演示了如何使用SunONEStudio4各版本的主要功能.
《SunONEStudio5Web应用程序教程》-部件号码817-3298-10提供了生成简单的J2EEWeb应用程序的分步说明.
《SunONEStudio5J2EE应用程序教程》-部件号码817-3300-10提供了使用EJB组件和WebServices技术生成应用程序的分步说明.
《SunONEStudio4,MobileEdition教程》-部件号码817-3861-10提供了为无线设备(如移动电话或个人数字助理(PDA))生成简单的应用程序的分步说明.
此应用程序将与Java2Platform,MicroEdition(J2METM平台)兼容,并符合移动信息设备配置文件(MIDP)和联网的受限设备配置(CLDC).
您也可以在以下网址找到完整的教程应用程序:http://forte.
sun.
com/ffj/documentation/tutorialsandexamples.
html联机帮助SunONEStudio5IDE中提供了联机帮助.
要打开帮助,请按帮助键(在MicrosoftWindows和Linux环境中按[F1]键,在Solaris环境中按[Help]键),或选择"帮助"→"内容".
执行以上任意操作都将显示一个帮助主题列表和一个搜索工具.
示例可以在以下SunONEStudioDeveloperResources(SunONEStudio开发人员资源)门户下载演示特定SunONEStudio5功能以及构建J2EE应用程序完整的教程应用程序的示例:http://forte.
sun.
com/ffj/documentation/tutorialsandexamples.
html此站点包含本文档中使用的应用程序.
Javadoc文档许多SunONEStudio5模块的IDE中均提供了Javadoc文档.
请参考发行说明以了解如何安装此文档.
启动此IDE时,您可以在资源管理器的[Javadoc]窗格中访问到此Javadoc文档.
开始之前15使用易读格式的文档该文档以易读格式提供,以方便残障用户使用辅助技术进行阅读.
您还可以按照下表所描述的信息找到文档的易读版本.
与Sun技术支持联系如果您有关于本产品的技术问题而本文档未予以解答,请访问:http://www.
sun.
com/service/contactingSun欢迎您提出意见和建议Sun致力于提高文档质量,并欢迎您提出宝贵的意见和建议.
请通过电子邮件将您的意见发送至以下地址:docfeedback@sun.
com请在电子邮件的主题行中包含文档的部件号码(817-3290-10).
文档类型易读版本的格式和位置书籍和教程HTML,位于http://docs.
sun.
com迷你教程HTML,位于http://forte.
sun.
com/ffj/tutorialsandexamples.
html集成示例自述文件HTML,位于s1studio-install-directory/examples的示例子目录中发行说明HTML,位于http://docs.
sun.
com16构建J2EE应用程序2003年10月17第1章组装、部署和执行的基础知识使用J2EE平台进行开发的模块化特性是将较小的单元进行组合以创建较大的单元.
您可以组合组件以创建模块,然后组合模块以创建应用程序.
这种组合较小的J2EE软件单元来创建较大单元的方法被称为组装.
组装的模块和应用程序需要运行环境服务,例如,由J2EE平台提供的容器管理持久性、容器管理事务和容器管理安全性验证.
组装模块或应用程序时必须决定所需的运行环境服务,然后必须在J2EE部署描述符中指定这些服务.
本章描述了J2EE模块和应用程序的一些基本特性,这些特性会影响组装过程.
此外还介绍了使用SunONEStudio5开发人员工具进行组装的基础知识.
组装的基础知识J2EE组装是一个包括许多独立任务的过程.
只有正确组装应用程序或模块,才能够将应用程序或模块部署到J2EE应用程序服务器,并执行该模块或应用程序.
成功组装的最大阻碍是组装过程的多变性.
因此,组装的每个模块或应用程序都需要不同运行环境服务的组合和一组不同的组装任务,组装模块和应用程序没有标准过程.
在组装过程开始前,必须了解什么是正确组装的模块或应用程序.
本节提供了在J2EE平台上的背景知识,能够帮助您识别什么是正确组装的模块或应用程序.
J2EE应用程序是模块化的J2EE应用程序是一组模块,应用程序中的模块是多组的组件.
在J2EE平台上,将组件组合为模块并将模块组合为应用程序的机制是部署描述符.
部署描述符是对模块或应用程序的"成分列表".
应用程序的部署描述符列出了应用程序中的模块.
模块的部署描述符列出了模块中的组件.
18构建J2EE应用程序2003年10月要了解J2EE平台使用部署描述符的原因,请考虑如何部署并执行应用程序的源代码.
在开发阶段,组件以许多源文件的形式存在于开发环境中.
只有将这些源文件部署到J2EE应用程序服务器时,才能够执行它们.
这些组件必须在由应用程序服务器提供的运行环境下执行.
部署应用程序时将编译应用程序部署描述符中列出的源文件,然后将编译后的文件安装在应用程序服务器管理的目录中.
在部署时,源文件实际上是被编译到J2EE应用程序中.
部署完成后,就可以在应用程序服务器的环境中执行部署的应用程序.
部署描述符是开发阶段使用的一种机制,其中列出了将同时作为模块或应用程序部署的文件.
在开发阶段组装模块或应用程序时,实际上并没有修改源文件,您只需准备一个描述部署过程的模块或应用程序的部署描述符.
部署描述符是XML文件.
它们使用特定的XML标记来标识应用程序和组成应用程序的模块(或标识模块和组成模块的组件).
编码范例1-1显示了名为CatalogApp的J2EE应用程序中的部署描述符.
该部署描述符列出了CatalogApp应用程序中的模块.
CatalogApp应用程序包含两个模块:CatalogData和CatalogWebModule.
该部署描述符使用标记来标识模块.
部署CatalogApp应用程序时,应用程序服务器读取应用程序的部署描述符.
CatalogApp部署描述符所列出的每个模块都有其自身模块级的部署描述符.
应用程序服务器继续读取这两个模块的部署描述符.
这些部署描述符标识两个模块中J2EE组件的源文件.
编码范例1-2和编码范例1-3显示模块级的部署描述符.
使用SunONEStudio5IDE时,IDE为您准备了部署描述符.
您不必书写部署描述符标记,但是应该了解在IDE中工作时IDE会为您准备部署描述符.
编码范例1-1CatlaogApp的部署描述符CatalogAppJ2EEApplicationCatalogAppCatalogData.
jarCatalogData.
xmlCatalogWebModule.
warcatalogCatalogWebModule.
xml第1章组装、部署和执行的基础知识19J2EE应用程序由J2EE运行环境支持在运行环境下,J2EE应用程序使用由J2EE应用程序服务器所提供的服务.
这些服务包括容器管理持久性、容器管理事务和容器管理安全性验证.
应用程序和其中的模块必须让应用程序服务器知道它们所需的服务.
部署描述符就是告诉应用程序服务器哪些是所需服务的机制.
例如,考虑J2EE容器管理事务.
要使用容器管理事务服务,就必须告诉J2EE应用程序服务器需要哪些事务服务.
将企业bean组装到EJB模块时,您要通过设置每个企业bean的事务特性属性来定义事务边界.
IDE在部署描述符中包括每个企业bean事务属性的值.
编码范例1-2显示名为CatalogData的EJB模块(CatalogData模块是编码范例1-1中所列的两个模块之一)中的部署描述符.
具有事务属性值的标记出现在部署描述符末端.
编码范例1-2EJB模块部署描述符CatalogDataCatalogManagerBeanCatalogManagerBeanCatalogBeans.
CatalogManagerBeanHomeCatalogBeans.
CatalogManagerBeanCatalogBeans.
CatalogManagerBeanEJBStatefulContainerejb/ItemBeanEntityCatalogBeans.
ItemBeanLocalHomeCatalogBeans.
ItemBeanLocalItemBeanejb/ItemDetailBeanEntityCatalogBeans.
ItemDetailBeanLocalHomeCatalogBeans.
ItemDetailBeanLocalItemDetailBean20构建J2EE应用程序2003年10月ItemBeanItemBeanCatalogBeans.
ItemBeanLocalHomeCatalogBeans.
ItemBeanLocalCatalogBeans.
ItemBeanEJBContainerjava.
lang.
StringFalseItemBeanitemskuitemnameitemskufindAllSELECTObject(I)FROMItemBeanASIItemDetailBeanItemDetailBeanCatalogBeans.
ItemDetailBeanLocalHomeCatalogBeans.
ItemDetailBeanLocalCatalogBeans.
ItemDetailBeanEJBContainerjava.
lang.
StringFalseItemDetailBeanitemskudescriptionitemskuThisvaluewassetasadefaultbySunONEStudio.
编码范例1-2EJB模块部署描述符(后续)第1章组装、部署和执行的基础知识21当部署并执行包含该EJB模块的应用程序时,应用程序服务器识别在部署描述符中指定的事务边界.
应用程序服务器在指定点打开并提交事务(或将事务转返).
其它运行环境服务的处理与容器管理事务类似.
每个服务都有自身的部署描述符标记,可以明确指出所需的服务.
IDE自动为您写入这些标记,所以不需要了解用在部署描述符中的标记.
CatalogManagerBean*RequiredThisvaluewassetasadefaultbySunONEStudio.
ItemBean*RequiredThisvaluewassetasadefaultbySunONEStudio.
ItemDetailBean*Required编码范例1-2EJB模块部署描述符(后续)22构建J2EE应用程序2003年10月J2EE应用程序是分布式的J2EE应用程序不仅是模块化和使用J2EE平台的运行环境服务,此外它还是分布式的.
应用程序中的每个模块都可以部署到不同的计算机来创建分布式应用程序.
图1-1显示了由两个模块所组成的应用程序.
该应用程序实现了典型的多层应用程序体系结构.
图1-1使用J2EE组件和模块的多层应用程序Web模块被部署到专门与用户进行HTTP交互的计算机上.
应用程序服务器提供HTTP连接,使用该HTTP连接,应用程序服务器将web模块中定义的web页发送到在用户桌面计算机上运行的浏览器.
EJB模块部署到专门用于数据库操作的另一台计算机上.
Web模块使用JavaRMI与EJB模块进行通讯.
而应用程序服务器提供对JavaRMI交互操作的运行环境支持.
J2EE平台提供多种技术支持模块间的分布式交互操作,J2EE平台的分布式技术包括:通过HTTP连接的基于web的通讯.
这种通讯通常在用户和应用程序之间使用.
使用JavaRMI-IIOP的同步方法调用.
这种方法调用主要用于调用企业bean方法.
使用Java消息服务(JMS)的异步消息传递.
消息可以送至队列或主题中.
J2EE平台提供支持不同种交互操作的不同种组件.
例如,J2EE平台使用消息驱动企业bean来支持模块间的异步消息传递.
在应用程序中,为分布式交互操作使用哪种技术是应用程序设计的一项任务.
决定使用哪种组件也是一项设计任务.
在组装应用程序时,需要知道已设计了哪种交互操作,以及如何实现该操作.
您要通过执行设置EJB引用来完成JavaRMI交互操作,设置队列来实现JMS消息传递交互操作这样的组装任务来实现交互操作.
用户Web浏览器Web层服务器数据库服务器Web模块EJB模块第1章组装、部署和执行的基础知识23J2EE平台还支持J2EE模块与外部资源(如数据源)间的交互操作.
支持这些交互操作的J2EE技术包括下列内容:JDBC技术容器管理持久性组装应用程序时,请确保已经标识了由应用程序使用的任何外部资源.
标识外部资源的开发阶段机制是部署描述符.
编码范例1-3显示了名为CatalogWebModule的web模块的部署描述符.
该模块和名为CatalogData的EJB模块被组装到J2EE应用程序中.
在两个模块间进行交互操作的技术是JavaRMI.
JavaRMI交互操作需要一个远程EJB引用,该远程EJB引用由编码范例1-3底部的标记声明.
编码范例1-3Web模块部署描述符AllItemsServletAllItemsServletDetailServletDetailServletAllItemsServlet/servlet/AllItemsServletDetailServlet/servlet/DetailServlet30index.
jspindex.
html24构建J2EE应用程序2003年10月在SunONEStudio5IDE中工作时,您无须编码模块和应用程序中的部署描述符,而是使用IDE中组件、模块和应用程序的可视化表示.
IDE会为您准备部署描述符.
index.
htmejb/CatalogManagerBeanSessionCatalogBeans.
CatalogManagerBeanHomeCatalogBeans.
CatalogManagerBeanCatalogManagerBean编码范例1-3Web模块部署描述符(后续)第1章组装、部署和执行的基础知识25模块和应用程序的可视化表示J2EE组装的多数说明讨论了部署描述符文件的内容,例如在编码范例1-1、编码范例1-2和编码范例1-3中所示的文件.
这些说明告诉您如何为XML编码.
SunONEStudio5IDE提供组件、模块和应用程序的可视化表示.
所以您无需编码部署描述符文件,只需使用表示组件、模块和应用程序的资源管理器窗口节点.
在IDE中进行组装时,资源管理器为要创建的模块或应用程序创建可视化表示.
表示应用程序的节点包含应用程序中模块的子节点,表示模块的节点包含模块中组件的子节点.
在使用可视化表示时,IDE会创建一个与其匹配的部署描述符.
每个节点都有一个属性表单,允许您配置节点所表示的组件、模块或应用程序.
多数属性会映射到部署描述符标记.
(不过属性的数量多过部署描述符标记.
)通过设置部署的属性,您可以为其配置组件、模块或应用程序,而IDE会将标记增加到它的部署描述符中.
这些标记标识应用程序服务器所需的服务.
以下几节介绍了模块和应用程序的IDE可视化表示.
Web模块Web模块有标准的目录结构(更多信息请参阅《构造Web组件》),该结构在资源管理器窗口中表示.
图1-2显示了资源管理器中的web模块,web模块的节点和子节点表示模块中单独的目录和文件.
Web模块的顶层节点表示web模块的顶层目录.
要使IDE能够将目录识别为web模块,您就必须将目录安装为资源管理器窗口文件系统.
如果将资源管理器中的web模块目录直接安装为另一文件系统的子目录,IDE就不会将web模块目录识别为web模块.
顶层节点有WEB-INF目录的子节点,WEB-INF目录有库子目录和类子目录的子节点,其中库子目录用于具有JAR文件格式的web组件,而类子目录用于任何具有.
java文件格式的web组件.
WEB-INF节点还有表示模块部署描述符文件的web子节点.
以上就是web模块的标准目录结构.
26构建J2EE应用程序2003年10月Web模块还有开发人员所增加的组件和资源的节点.
图1-2显示了名为index.
html的HTML页的节点.
classes目录包含两个servlet类(即AllItemsServlet和ItemDetailServlet)的节点.
图1-2Web模块的节点和子节点注意,web模块的这种表示与特定的目录及其内容相对应.
该部署描述符是名为web.
xml的文件,在资源管理器中通过web节点表示.
而web.
xml文件是web模块源代码的一部分.
EJB模块EJB模块的表示方法与web模块不同.
EJB模块的顶层节点不表示特定的目录及其内容.
相反,EJB模块节点却表示模块的部署描述符.
EJB模块节点的作用是用作企业bean列表.
这些企业bean可以在一个目录下或在不同文件系统的多个目录下,表示部署描述符的顶层节点追踪组件的源代码所在的位置.
用逻辑节点表示EJB模块,您就能够将不同目录下的企业bean组合到一个EJB模块中,而且还可以将部署描述符中的配置信息和源代码分开.
在部署EJB模块时生成部署描述符XML文件,而且在部署描述符中标识的组件源文件被编译到EJBJAR文件.
图1-3显示了资源管理器窗口中的EJB模块.
该模块有包括在模块中的三个企业bean的子节点.
每个企业bean都可以在不同的目录中,甚至一个单独的企业bean也可能在多个不同的目录中.
例如,企业bean接口的源代码可能在一个目录下,而实现这些接口的类却可能在另一个不同的目录下.
图1-3EJB模块的节点和子节点第1章组装、部署和执行的基础知识27J2EE应用程序J2EE应用程序也由逻辑节点表示.
像EJB模块节点一样,顶层J2EE应用程序节点不表示单一的目录或文件系统.
相反,应用程序节点表示应用程序的部署描述符,并作为组成应用程序的模块列表.
这些模块的源代码可以位于一个以上的目录或文件系统中.
IDE维护与源代码分开的应用程序级部署描述符.
可以在一个以上的J2EE应用程序中包含相同的源代码.
部署过程将编译所有的源文件,并将编译的版本与EAR文件中的部署描述符相关联.
图1-4显示了资源管理器中的J2EE应用程序.
图1-2和图1-3所示的模块已经增加到应用程序中,这些模块由应用程序节点的子节点表示.
图1-4J2EE应用程序节点及其子节点属性表单每个表示J2EE模块或应用程序的节点都有属性表单,属性表单包含的某些属性使您能够指定模块或应用程序所需的应用程序服务器中的服务.
这些属性与出现在模块或应用程序部署描述符中的标记相对应.
在设置属性值时需要提供将在部署描述符中使用的信息.
不过您只需使用该属性表单,而不必使用文本编辑器编辑和格式化XML部署描述符.
对于web模块,部署描述符以文件的形式存在,并且该文件出现在资源管理器窗口.
请参阅图1-2,您在web模块部署描述符中所指定的值是与源文件相关联的.
对于EJB模块或J2EE应用程序,在部署模块或应用程序之前不会生成部署描述符文件,部署编译源文件并生成一个归档文件和一个EJBJar或EAR文件.
部署描述符文件就包括在该归档文件中,部署描述符与源文件的一个特定归档副本相关联.
属性具有能够帮助您选择正确值的属性编辑器.
打开属性表单时,通过单击属性并单击其省略号(.
.
.
)按钮,打开编辑器中的各个属性.
而使用属性编辑器的过程大不相同:有些用于浏览IDE节点,有些却用于打开其它级别的对话框,还有很多其它情况.
要了解更复杂的属性编辑器,请使用联机帮助.
属性表单有许多标签,名为[属性]的标签列出了由J2EE规范定义的标准属性.
其它标签的名称是应用程序服务器产品的名称.
这些标签搜集了J2EE规范定义的信息之外的其它信息,但这些信息却是特定应用程序服务器产品所必须的.
这些标签是属性表单的特定服务器标签.
组装模块或应用程序时,需要使用标准属性和使用的服务器产品的特定服务器属性.
28构建J2EE应用程序2003年10月部署的基础知识部署是编译组成J2EE应用程序的源文件并将编译的文件安装到由J2EE应用程序服务器管理的目录中的过程.
部署是由应用程序服务器或与服务器一起发布的软件(如部署工具或管理工具)来执行的.
IDE与应用程序服务器进行通讯.
它提供将模块或应用程序部署到应用程序服务器并执行模块或应用程序的命令.
您可以在不离开IDE的情况下进行部署和执行.
部署由插件或应用程序服务器软件执行,但是执行是发生在应用程序服务器的环境下,而对部署和执行的管理却是在IDE中.
在执行并测试应用程序之后,您就可以修改源代码,重新部署应用程序和执行新的版本.
该过程能够一直持续,直到您不再需要进行为止.
部署已组装的应用程序的实际过程是非常简单的.
右键单击应用程序节点并选择[部署]命令.
但是,在部署之前,必须设置IDE使其与应用程序服务器一起工作.
下表概括了设置应用程序服务器的步骤:1.
安装应用程序服务器.
2.
安装能够实现IDE和应用程序服务器之间通讯的服务器插件,SunONE应用程序服务器7,StandardEdition的插件随IDE一起安装.
插件也可用于其它广泛使用的应用程序服务器产品.
安装插件会在资源管理器[运行环境]标签下创建应用程序服务器节点.
(要了解关于插件的更多信息,请参阅附录A.
)3.
使用应用程序服务器节点的菜单命令,建立IDE与应用程序服务器之间的通讯.
4.
使用应用程序的属性表单,指定要部署的应用程序的目标应用程序服务器.
5.
右键单击应用程序节点并选择[部署]命令.
部署软件读取由应用程序节点所表示的部署描述符,然后部署在部署描述符中列出的源文件.
IDE的大多数安装包括了SunONE应用程序服务器7,安装程序会自动配置IDE以便使其与应用程序服务器一起工作.
SunONEStudio5,StandardEditionGettingStartedGuide对安装进行了详细的解释.
第1章组装、部署和执行的基础知识29执行的基础知识部署完应用程序后,您就可以执行该应用程序了.
IDE将表示应用程序的资源管理器节点与应用程序的部署副本相关联.
可以右键单击该节点并选择[执行]命令,然后IDE就会指示应用程序服务器执行应用程序的部署副本.
许多IDE节点,其中包括J2EE应用程序节点,都有[执行]命令.
如果需要,右键单击一个节点并选择[执行],IDE会部署并执行应用程序.
[执行]命令的结果取决于应用程序的类型.
例如,如果应用程序包括web模块,那么[执行]命令就会启动web浏览器并打开该应用程序的URL.
您还可以完全在应用程序服务器环境下执行部署的应用程序而无需使用IDE.
例如,要执行一个包括web模块的已部署应用程序,请启动web浏览器并打开应用程序中的一个web页.
30构建J2EE应用程序2003年10月使用本书SunMicrosystems,Inc支持的JavaCommunityProcess发展了用J2EE组件设计分布式企业应用程序的标准.
第10页的"阅读本书须知"中所列的J2EE平台文档涵盖了应用程序设计和体系结构的这些标准.
本书介绍了如何使用SunONEStudio5IDE来实现这些体系结构.
使用IDE来组合组件并创建J2EE模块,确定所有组件都按照应用程序设计所指定的方式进行交互操作.
此外,还组合J2EE模块来创建J2EE应用程序,确定模块间的分布式交互操作按照应用程序设计所调用的方式进行.
本书通过展示多个示例或方案介绍了组装.
每个方案都展示了组件或模块的真实组合,并示范了将它们组装到模块或应用程序中的方法.
在方案中所描述的业务问题都是真实的,但这不意味着本书是设计J2EE应用程序的完全指南.
这些方案的真正目的是说明如何对组件和模块之间的特定类型的交互操作进行编程.
一旦您决定了应用程序的设计,就可以使用本书中的方案来帮助您对组件和模块之间的交互操作进行编程.
您可能无法在某一个方案中找到所需的全部内容,因为每个方案只着眼于一或两种J2EE交互操作,而实际的J2EE应用程序却可能包括大量组件和交互操作.
不过,您却可以在本书中找到每种交互操作的示例.
例如,要编程一个具有web模块和EJB模块的普通类型的J2EE应用程序,您就可以查看第2章(包含web模块的组装),第3章(包含EJB模块的组装)和第4章(包含将web模块和EJB模块组装到J2EE应用程序中的内容).
如何设置事务请阅读第6章,安全性的内容则请阅读第7章.
本书可以作为使用SunONEStudio5开发环境开发分布式企业应用程序的指南.
并且说明了如何开发J2EE模块,如何为不同类型的交互操作编程模块,如何从J2EE平台请求企业服务(例如安全性检查和事务管理).
31第2章方案:Web模块图2-1显示了web模块和该模块参与的交互操作.
该模块是J2EE应用程序的一部分,图中所示的交互操作是J2EE应用程序中web模块的典型操作.
该web模块与HTTP连接(图中通过标为1的箭头表示)上的用户和EJB模块(通过标为3的箭头表示)所提供的中间层服务进行交互.
在该web模块中,web组件相互间进行交互(通过标为2箭头的表示).
本章描述了该web模块,并解释了如何编程图2-1所示的交互操作.
图2-1CatalogWebModuleweb模块最终用户Web浏览器32构建J2EE应用程序2003年10月本模块中的交互操作本方案描述了图2-1中所示的web模块和交互操作的用法之一.
在本方案中,该模块是支持某零售web站点的J2EE应用程序的前端.
该web模块包含访问该站点的联机顾客所见到的web页面,对这些页面中的顾客输入信息进行处理.
显示页面并处理输入信息是J2EE应用程序中web模块的典型任务.
从顾客的观点来看,该应用程序是一系列的web页面.
顾客使用web浏览器来查看应用程序的主页,并使用出现在web页面上的文本字段、按钮和其它控件来进行输入.
从开发人员的观点看,应用程序是一组web组件,它们接收HTTP请求并返回HTTP和响应.
本方案中的web模块仅包含了几个组件,且只处理两个不同的请求.
尽管很简单,但是这些组件和请求说明了web组件如何提供用户、web模块和EJB模块间所需的交互操作.
在本方案中涵盖的特定交互操作概述如下:1.
联机顾客启动web浏览器并打开应用程序的根URL,然后打开到应用程序的连接.
该操作将打开应用程序的主页.
实际的购物站点主页会显示出许多选项,其中包括请求按种类显示项目、请求关键字搜索、请求实时客户服务信息等等.
而在这个简单的示例中,主页仅显示一个选项,该选项是到另一个显示全部目录的页面的链接.
2.
顾客单击链接.
该操作生成一个请求,该请求由其中名为AllItemsServlet的servlet处理.
AllItemsServlet通过调用EJB模块的业务方法(getAllItems方法)来处理该请求,该方法返回数据.
3.
AllItemsServlet将从EJB模块返回的数据准备好并显示在顾客的浏览器中.
Servlet将从EJB模块返回的独立字段值与格式化该字段值的HTML标记进行组合.
AllItemsServlet将这个字段值和HTML标记的组合写入返回到用户web浏览器的输出流.
顾客的web浏览器处理HTML输出并显示目录.
在目录的显示中,每个项目的名称都显示为到项目详细信息的HTML链接.
4.
顾客浏览显示的目录并单击其中一个链接.
该请求由另一个名为DetailServlet的servlet处理.
DetailServlet调用EJB模块的另一个业务方法(getOneItemDetail)来获取该项目的详细信息.
5.
DetailServlet处理从EJB模块返回的数据,用于显示在顾客的浏览器中.
如同AllItemsServlet,DetailServlet准备一个组合字段值和HTML标记的输出流.
顾客的web浏览器处理该输出流并将其显示为另一个web页面.
由AllItemsServlet和DetailServlet写入的HTML输出只含有文本.
尽管很简单,但是这些示例说明了web组件是如何处理HTTP请求的:通过使用远程方法调用从EJB模块获取数据,再将数据写入HTML输出流.
一个经验丰富的web设计人员或web程序员能够使用这种操作编写更复杂的输出.
Web模块和EJB模块之间的交互操作是通过JavaRMI方法调用实现的,而JavaRMI是EJB模块设计所必须的.
关于EJB模块设计的更多信息,请参阅第52页的"本模块中的交互操作".
关于创建web组件、在web组件中编写企业业务逻辑以及类似任务的指示,请参阅《构造Web组件》.
第2章方案:Web模块33本模块的编程表2-1总结了用于创建上节所述并在图2-1中图示的web模块的编程方法.
后续的几节说明了如何执行这些编程任务中的大部分任务.
其中方法签名指定了每个交互操作的输入和输出.
关于过程的几节说明了如何将这些输入和输出连接到其它组件和模块,但是不包括关于创建web模块或将web组件增加到模块的指示.
(要了解这些任务的信息,请参阅联机帮助或《构造Web组件》.
)创建欢迎页面零售web站点的设计要求顾客在主页上开始与站点的交互操作.
主页是一个典型的web站点功能,它为用户提供了入口点,该入口点可以标识站点并向客户显示可用的选项.
顾客查看主页并选择要使用的功能.
首先顾客要启动浏览器并打开购物站点的URL.
在web模块内部,该URL已经被映射到应用程序的上下文根.
如果需要在用户打开站点的URL时应用程序始终显示该主页,那么请将该主页标识为欢迎页面.
表2-1本方案所需的编程方法应用程序元素所需的编程方法应用程序服务器无.
Web模块创建web模块.
创建欢迎页面:index.
html.
该页面包括一个执行servletAllItemsServlet的HTML链接.
创建两个servlet:AllItemsServlet和ItemDetailServlet.
编码处理HTTP请求并生成HTTP响应的processRequest方法.
这些processRequest方法是:1.
执行"Java命名和目录接口"(JNDI)查找,以调用EJB模块业务方法.
2.
将从EJB模块获取的数据写入servlet的响应中.
由AllItemsServlet输出的HTML页面包含一个到ItemDetailServlet的HTML链接.
为每个servlet设置URL模式.
J2EE应用程序关于将web模块增加到J2EE应用程序的指示,请参阅第4章.
34构建J2EE应用程序2003年10月创建HTML页面在资源管理器窗口的节点分层结构中,欢迎页面的HTML文件必须与web模块的WEB_INF节点在同一级别.
请参阅图1-2中的示例.
要在正确的级别创建HTML文件:1.
右键单击包含绿色WEB-INF节点的文件系统节点,并选择[新建]→[所有模板].
[新建]向导的[选择模板]页打开.
2.
选择[HTML文件]模板.
a.
在[选择模板]字段,展开JSP和Servlet节点并选择[HTML文件]节点.
b.
单击[下一步][新建]向导的[新建对象名称]页面打开.
3.
在名称字段中输入index,然后单击[完成].
IDE创建新的HTML文件并在资源管理器中使用名为index的新节点表示.
这时[源编辑器]打开,同时新文件中出现光标.
4.
将HTML代码输入欢迎页面.
编码范例2-1显示了本方案中使用的简单欢迎页面的HTML代码.
编码范例2-1目录显示模块的欢迎页面OnlineCatalogInventoryListApplicationDisplaytheCatalog第2章方案:Web模块35该欢迎页面只向用户显示一个选项,即名为DisplaytheCatalog的文本链接.
该链接使用URL模式来指定模块中的其中一个servlet:AllItemsServlet.
用户单击该链接时,浏览器向web模块发送另一个请求.
该请求通过执行AllItemsServlet处理.
用户看到的下一页是由AllItemsServlet输出的页面.
要查看这个由AllItemsServlet输出的页面,请参考编码范例2-2.
虽然实际web站点的欢迎页面包括许多具有不同功能的链接,但是每个链接都遵从在该示例中演示的原则.
显示给用户的页面包含生成HTTP请求的链接或操作.
每个请求都由web模块中的某些组件处理,web模块通过写入另一个供用户查看的页面进行响应.
在该示例中,链接指定了一个servlet,而没有指定servlet的方法.
当请求只指定一个servlet名称时,缺省操作是执行servlet的doGet方法.
您也可以编写指定servlet其它方法之一的链接,如doPost.
关于servlet方法的更多信息,请参阅《构造Web组件》.
将页面标识为模块的欢迎页面在IDE中创建web模块时,模块具有列出欢迎页面文件中缺省名称的[欢迎文件]属性.
图2-2显示了具有缺省名称的[欢迎文件]属性编辑器.
用户访问应用程序的根URL时,应用程序服务器在模块目录中搜索具有这些缺省名称的文件.
搜索到的第一个文件被显示为欢迎页面.
为模块创建欢迎文件的最简单方法是创建一个具有其中一个缺省名称的文件.
例如,在本方案中,您就创建了一个名为index.
html的文件.
图2-2[欢迎文件]属性编辑器如果要使模块的欢迎页面使用一个不同名称的文件,请打开[欢迎文件]属性编辑器,增加要使用的文件的名称.
36构建J2EE应用程序2003年10月Servlet方法的编程本方案中的servlet通过调用企业bean方法从EJB模块获取数据.
对于所调用的方法,有两个编程任务:在调用servlet时,为调用的企业bean编码调用方法并设置引用声明.
下面首先说明方法体代码的编码.
注–该示例中的servlet是由IDE的servlet模板创建的.
HttpServlet是由该模板创建的servlet,它们包含名为processRequest的方法.
doGet和doPost方法都调用processRequest,因此您可以将处理请求的代码增加到processRequest方法.
方法体编码范例2-2显示了如何在AllItemsServlet中实现processRequest方法.
当用户单击出现在欢迎页面上的DisplaytheCatalog链接时,该方法开始执行.
欢迎页面上的URL模式将servlet命名为AllItemsServlet,但是URL模式不指定方法.
在这种情况下,应用程序服务器执行缺省操作和servlet的doGet方法.
doGet方法调用processRequest方法.
编码范例2-2显示了AllItemsServlet是如何从EJB模块获取目录数据并将其显示给用户的,其中有三个步骤:1.
AllItemsServlet使用JNDI查找来获取对CatalogDataEJB模块中的会话企业bean的远程引用.
关于CatalogData模块的更多信息,请参阅第3章.
2.
AllItemsServlet调用会话bean的业务方法(getAllItems方法).
3.
Servlet将远程方法调用返回的数据写入HTML输出流中,然后输出流返回到用户的浏览器窗口.
第2章方案:Web模块37编码范例2-2ServletAllItemsServlet的processRequest方法protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.
setContentType("text/html");PrintWriterout=response.
getWriter();/*在此处输出页面*/out.
println("");out.
println("");out.
println("AllItemsServlet");out.
println("");out.
println("");out.
println("TheInventoryList");out.
println("");out.
println("");out.
println("Item");out.
println("ItemSKU");out.
println("Detail");CatalogBeans.
CatalogManagerBeanHomecatHome;CatalogBeans.
CatalogManagerBeancatRemote;try{InitialContextic=newInitialContext();Objectobjref=ic.
lookup("java:comp/env/ejb/CatalogManagerBean");catHome=(CatalogBeans.
CatalogManagerBeanHome)objref;catRemote=catHome.
create();java.
util.
VectorallItems=catRemote.
getAllItems();Iteratori=allItems.
iterator();while(i.
hasNext()){CatalogBeans.
iDetailitemDetail=(CatalogBeans.
iDetail)i.
next();out.
println(""+""+itemDetail.
getItemname()+""+itemDetail.
getItemsku()+""+""+"GetItemDetail"+38构建J2EE应用程序2003年10月lookup语句指定CatalogManagerBean,但实际上该字符串是引用的名称,而不是所引用的企业bean.
为了便于记住所指的是哪个bean,企业bean名称经常作为引用名称使用.
实际上,引用的企业bean在引用声明中指定,该内容将在下一节提及.
EJB引用的引用声明如同AllItemsServlet,web组件通过EJB引用在EJB模块中调用企业bean的方法.
下面列出了EJB引用的两个部分:JNDI查找代码,使用JNDI命名工具来获取对已命名的企业bean的远程引用.
引用声明,部署描述符的一部分.
引用声明告诉应用程序服务器在查看代码中引用了哪个特定的bean.
在本方案中,查看代码位于AllItemsServlet的processRequest方法中.
(请参阅编码范例2-2.
)您可以编译该代码,但是没有引用声明就无法在运行环境返回引用.
引用声明将用于查找语句中的引用名称映射到企业bean的实际名称中.
"");}}catch(javax.
naming.
NamingExceptionnE){System.
out.
println("NamingExceptiononLookup"+nE.
toString());}catch(javax.
ejb.
CreateExceptioncE){System.
out.
println("CreateException"+cE.
toString());}catch(java.
rmi.
RemoteExceptionrE){System.
out.
println("RemoteException"+rE.
toString());}catch(Exceptione){System.
out.
println(e.
toString());}out.
println("");out.
println("");out.
println("");out.
close();}编码范例2-2ServletAllItemsServlet的processRequest方法(后续)第2章方案:Web模块39要设置web模块的EJB引用声明:1.
右键单击web模块的web节点并选择[属性]→[引用]标签→[EJB引用]→省略号(.
.
.
)按钮.
[EJB引用]属性编辑器打开.
2.
单击[增加]按钮.
[增加EJB引用]对话框打开.
使用该对话框来设置引用声明.
3.
要设置引用声明,请输入用于lookup语句的引用名称和用于方法调用的起始接口和远程接口的名称.
图2-3显示了在字段中具有这些值的[增加EJB引用]对话框.
如果要使引用在运行环境下工作,或使JNDI查找将远程引用返回到企业bean,就必须将引用链接到同一应用程序的特定企业bean中.
在部署并执行应用程序之前必须链接该引用,但此刻是不需要链接的.
在开发过程中遇到此情况时,您可以先保持引用的未链接状态,然后在将web模块组装到J2EE应用程序之后再进行链接.
在某些情况下可能会选择在开发的这个阶段解决引用,您应该考虑以下几个条件:如果企业bean不在您的开发环境中,那么就不能链接该引用.
提供接口的名称并单击[确定].
直到您具有了开发环境中出现的接口的副本,才能够编译JNDI查找代码.
图2-3显示了设置未链接引用的[增加EJB引用]对话框.
[起始接口]和[远程接口]被指定,但[引用的EJB名称]字段为空.
以后将在应用程序属性表单上链接该引用.
图2-3具有未链接引用的[EJB引用]属性编辑器40构建J2EE应用程序2003年10月如果企业bean在您的开发环境中可用,那么此时就能够链接引用.
单击[引用的EJB名称]字段旁的[浏览]按钮.
使用出现的对话框来选择调用的企业bean,最后单击[确定].
图2-4显示了链接到CatalogManagerBean的名为ejb/CatalogManagerBean的引用.
图2-4具有链接引用的[EJB引用]属性编辑器即使调用的企业bean可用,您也可能选择此时不链接引用.
这其中有很多原因,例如,如果web组件有机会用于多个应用程序,则不需要在web模块的属性表单上链接该引用.
开发人员重新使用web模块,能够将该引用重新链接到可以实现相同接口的某些其它企业bean.
重新链接该引用会改变web.
xml部署描述符文件中的值,同时也影响源代码的使用.
如图2-3所示,在本方案中引用保持未链接状态.
在创建了J2EE应用程序后,引用在应用程序节点的属性表单中链接.
请参阅第72页的"链接EJB引用".
第2章方案:Web模块41将URL映射到Servlet在欢迎页面上设置的链接使用以下HTML标记格式化:DisplaytheCatalog当顾客单击该链接时,应用程序服务器将HTML标记中的URL模式附加到URL路径,然后执行所产生的URL.
要使链接正确工作,应用程序服务器所生成的URL必须映射到要执行的servlet.
下一节解释如何将URL映射到servlet.
了解Servlet映射在部署的web模块中,servlet的URL和web模块中的其它web资源是将名称附加到URL路径的结果.
对于部署到SunONE应用程序服务器7的模块,URL路径有以下的通用形式:http://hostname:port/web-context/URL-pattern该路径中的元素按以下方式决定:hostname是正在运行应用程序服务器的机器名,port是为该服务器示例的HTTP请求指定的端口.
端口号在安装应用程序服务器时分配.
Web上下文是在将模块增加到J2EE应用程序之后,指定为web模块的属性的字符串.
Web上下文限定模块中所有的web资源.
URL模式是标识特定servlet或JSP页面的字符串.
在web模块属性表单上设置URL模式.
将web模块组装到J2EE应用程序中前可以分配URL模式.
换句话说,在web模块中分配的URL模式与以后将模块增加到J2EE应用程序时所要分配的web上下文是相对的.
本方案中的URL使用了使它们与web上下文相对的格式.
所以无论您在组装应用程序时提供什么样的web上下文,这些链接还是会在应用程序执行时正确工作.
关于设置web上下文的信息,请参阅第71页的"设置web模块的web上下文".
42构建J2EE应用程序2003年10月检查缺省Servlet映射在缺省情况下创建servlet时,Servlet向导会使用您在Servlet向导首页为servlet名称所提供的类名,并将servlet名称映射到包括该servlet名称的URL模式中.
图2-5显示了具有AllItemsServlet缺省设置的web模块的[Servlet映射]属性编辑器.
图2-5[Servlet映射]属性编辑器如果使用该servlet映射部署web模块,AllItemsServlet就映射到以下URL:http://hostname:port/web-context/servlet/AllItemsServlet编辑Servlet映射如果要将一个不同的URL映射到servlet,那么请使用servlet映射属性编辑器编辑该映射.
在本方案中,您将URL模式从缺省值更改为更具有特定意义的值.
要编辑servlet映射:1.
右键单击web模块的web节点,并选择[属性]→[Servlet映射]→省略号(.
.
.
)按钮.
[Servlet映射]属性编辑器打开.
[Servlet映射]属性编辑器列出模块中的所有servlet和为它们设置的映射.
2.
选择allItemsServlet的当前映射,然后单击[编辑]按钮.
[编辑Servlet映射]对话框打开.
第2章方案:Web模块433.
在[URL模式]字段中,输入/allItems,单击[确定].
图2-6显示了具有AllItemsServlet和DetailServlet新映射的[Servlet映射]属性编辑器.
图2-6[Servlet映射]属性编辑器编辑该servlet映射之后,使用以下URL就可以执行AllItemsServlet:http://hostname:port/web-context/allItems注意,新的URL模式是在HTML标记中所用的字符串,该HTML标记创建与欢迎页面的链接(请参阅编码范例2-1).
单击链接,立即执行AllItemsServlet.
其它组装任务上述几节包含了组装CatalogWebModule所需的组装任务.
本节包含CatalogWebModule方案中不需要的web模块组装任务.
Web模块可能需要您执行这些其它组装任务中的某些任务.
本节包含了可以执行的多个web模块组装任务.
44构建J2EE应用程序2003年10月设置错误页面如果要为web模块指定错误页面,那么就需要在模块的部署描述符中标识该错误页面.
在[错误页面]属性编辑器中操作.
要为web模块设置错误页面:1.
右键单击web节点,并选择[属性]→[部署]标签→[错误页面]→省略号(.
.
.
)按钮.
[错误页面]属性编辑器打开.
2.
使用HTTP错误代码或Java异常类标识错误,并将它映射到特定的错误页面.
您可以使用HTTP错误页面或Java异常类来标识错误.
注意,编辑器有两个[增加]按钮,每个按钮对应一种错误.
无论是哪种类型,您都要指定错误并将错误映射到页面.
图2-7显示了HTTP错误代码404被映射到特定的错误页面之后的属性编辑器.
图2-7[错误页面]属性编辑器设置JSP页面如果您要组装的web模块包含JSP页面组件,那么有多种方法执行这些组件.
如果您创建的是名为myJsp的新JSP页面,那么可以使用以下任何一种方法来执行该页面.
第2章方案:Web模块45使用HTML链接执行JSP页面如果要从HTML链接执行JSP页面,请按照以下示例设置链接:ExecutemyJsp通过程序执行JSP页面如果您使用IDE创建JSP页面,那么就没有为它创建应用程序描述符条目.
而如果业务逻辑通过程序访问JSP页面,就不需要部署描述符条目.
例如,下面的代码位于执行myJsp的servlet中.
注意,该代码通过提供其实际文件名称(myJsp.
jsp)来标识要执行的JSP页面.
使用URL到JSP的映射前面的示例是通过指定实际文件名称(myJsp.
jsp)来执行JSP页面的.
也可以将URL模式映射到JSP页面,然后引用到该页面的URL模式来执行页面.
完成该过程需要两个步骤,首先是为JSP文件设置servlet名称.
要设置JSP页面的URL映射:1.
右键单击web节点,并选择[属性]→[部署]标签→[JSP文件]→省略号(.
.
.
)按钮.
[JSP文件]属性编辑器打开.
2.
单击[增加]按钮.
[增加JSP文件]对话框打开.
a.
在[JSP文件]字段中,输入要设置的JSP文件的文件名称.
b.
在[Servlet名称]字段中,输入要映射到JSP文件的servlet名称.
编码范例2-3通过程序执行JSP页面的代码.
.
.
response.
setContentType("text/html");RequestDispatcherdispatcher;dispatcher=getServletContext().
getRequestDispatcher("/myJsp.
jsp");dispatcher.
include(request,response);.
.
.
46构建J2EE应用程序2003年10月c.
单击[确定].
[增加JSP文件]对话框关闭.
图2-8显示了将名为itemDetailPage的servlet映射到myJsp.
jsp文件之后的[JSP文件]属性编辑器.
图2-8[JSP文件]属性编辑器3.
再次单击[确定],关闭[JSP文件]属性编辑器并返回属性表单.
4.
仍在属性表单中,右键单击[Servlet映射]属性并单击省略号(.
.
.
)按钮.
[Servlet映射]属性编辑器打开.
5.
单击[增加]按钮.
[增加Servlet映射]对话框打开.
6.
在[增加Servlet映射]对话框中,将URL模式映射到新servlet名称中.
a.
在[Servlet名称]字段中,输入已映射到JSP文件的servlet名称.
b.
在[URL模式]字段中,输入要映射到servlet名称,最后是JSP文件的URL模式.
第2章方案:Web模块47c.
单击[确定].
[增加Servlet映射]对话框关闭.
图2-9显示了[Servlet映射]属性编辑器,其中具有映射到servlet名称ItemDetailPage的URL模式ItemDetail.
Servlet名称ItemDetailPage已被映射到myJsp.
jspJSP文件中.
图2-9[Servlet映射]属性编辑器d.
再次单击[确定],关闭[Servlet映射]属性编辑器.
映射完之后,使用以下URL就可以执行由myJSP.
jsp文件定义的JSP页面:http://hostname:port/web-context/ItemDetail设置环境条目引用环境条目分为两个部分:JNDI查找.
使用环境条目的web组件通过JNDI名称工具来查找条目的值.
在web模块部署描述符中的引用声明.
引用声明向应用程序服务器声明该引用,部署描述符还包含环境条目的值.
48构建J2EE应用程序2003年10月环境条目引用的JNDI查找使用环境条目值的web组件需要如编码范例2-4所示代码的查找代码.
编码范例2-4环境条目的查找语句代码中的注释解释每行的用途.
try{//获取初始上下文--打开与JNDI命名的通讯:Contextic=newInitialContext();//请求名为"CacheSize"环境条目的查找:IntegercacheSize=(Integer)ic.
lookup(òjava:comp/env/NumberOfRecordsCachedò);}catch(Exceptione){System.
out.
println(e.
toString());e.
printStackTrace();return;}第2章方案:Web模块49环境条目的引用声明要设置环境条目的引用声明:1.
右键单击web节点并选择[属性]→[引用]标签→[环境条目]→省略号(.
.
.
)按钮.
[环境条目]属性编辑器打开.
2.
单击[增加]按钮.
[增加环境条目]对话框打开.
3.
声明该环境条目引用.
a.
在[名称]字段中,输入用于lookup语句的引用名称.
b.
在[类型]字段中,选择该环境条目的数据类型.
c.
在[值]字段中,输入环境条目的初始值.
图2-10显示了[增加环境条目]对话框,该对话框具有与编码范例2-4中的lookup语句相匹配的值.
图2-10[增加环境条目]对话框4.
单击[确定]来关闭对话框并处理您的环境条目定义.
50构建J2EE应用程序2003年10月51第3章方案:EJB模块图3-1显示了EJB模块和该模块参与的交互操作.
该模块是J2EE应用程序的一部分,图中的交互操作是J2EE应用程序中EJB模块的典型操作.
EJB模块与客户端模块交互(该交互操作在图中通过标为1的箭头表示),此外EJB模块也与外部资源交互,在本例中为关系型数据库管理系统(该交互操作通过标为3的箭头表示).
该EJB模块类似于大多数EJB模块,包含多个企业bean,并且这些企业bean彼此进行交互(这些交互操作通过标为2的箭头表示).
图3-1CatalogDataEJB模块最终用户Web浏览器52构建J2EE应用程序2003年10月本模块中的交互操作本方案描述了图3-1中所示的EJB模块和交互操作的用法之一.
在本方案中,EJB模块是支持一个零售web站点的J2EE应用程序的后端.
该EJB模块包含与目录数据库交互的一组企业bean.
作为应用程序前端的web模块调用本EJB模块的方法,获取向用户显示的数据.
在J2EE应用程序中,EJB模块的典型任务是处理方法调用并与数据库交互.
应用程序中web模块的功能是作为CatalogDataEJB模块的客户端.
顾客使用由web模块生成的web页面来请求他们要查看的数据,而web模块负责调用CatalogData模块来获取数据,然后格式化数据并向顾客显示该数据.
EJB模块负责从数据库获取请求的数据并将该数据传递到客户端模块.
所以EJB模块必须能够处理数据的请求并返回正确数据.
本方案中的EJB模块仅包含了三个企业bean且仅提供了两个业务方法.
这些业务方法只能处理两种请求.
尽管很简单,但是这些组件和交互操作显示了EJB模块如何提供客户端模块和数据库之间所需的交互操作.
在本方案中涵盖的特定交互操作概述如下:1.
客户端模块通过调用CatalogDataEJB模块的方法来请求某些数据.
在这个简单的方案中,客户端能够请求目录中所有项的列表,或请求某一项的详细信息.
2.
目录数据EJB模块通过生成数据库查询来处理请求,该数据库查询将获取请求的数据.
3.
目录数据EJB模块执行查询并将数据返回到客户端模块,然后客户端模块格式化数据并向用户显示该数据.
在客户端模块和CatalogDataEJB模块之间的交互操作决定了选择实现该操作的J2EE技术和CatalogDataEJB模块的内部体系结构.
您应该考虑以下几点:在客户端模块和CatalogData模块之间的交互操作是同步的.
询问查看目录的联机顾客等待应用程序显示该目录.
可以使用JavaRMI来实现该交互操作以提供同步的交互操作.
这意味着客户端模块将通过调用CatalogDataEJB模块的方法来请求目录数据.
EJB模块的内部设计由客户端模块和CatalogDataEJB模块之间的交互操作的面向会话的特性决定.
联机顾客可以查看整个目录,并且可以请求某一项的详细资料.
当多个顾客同时查看目录时,EJB模块必须将请求匹配到用户会话并将正确数据返回到每个会话.
该模块使用单一有态会话企业bean来满足这种要求,会话bean则管理通过客户端模块提交的所有请求.
它通过调用生成数据库查询的实体bean的方法来处理请求.
这是EJB模块的通用体系结构.
(关于用会话bean对会话建模的更多信息,请参阅《构建EnterpriseJavaBeans组件》.
)为了生成数据库查询,J2EE平台提供了一种称作实体企业bean的企业bean.
实体bean对数据库表建模,并且具有执行查询的方法.
在本方案中,目录数据存储在两个表中,并且目录数据模块具有两个实体bean,每个实体bean对一个表建模.
实体bean处理CatalogDataEJB模块与数据库交互操作的连接、查询语言和其它方面.
第3章方案:EJB模块53本模块的编程表3-1概述了用于创建上节所述并在图3-1中图示的CatalogDataEJB模块的编程方法.
后续的几节说明了如何执行这些编程任务中的大部分任务.
在接口中的方法签名指定了每个交互操作的输入和输出.
关于过程的几节说明了如何将这些输入和输出连接到其它组件、其它模块和目录数据库.
使用Java代码创建企业bean不包括在内,增加业务方法和实现业务方法的说明.
(要了解这些任务的信息,请参阅联机帮助或《构建EnterpriseJavaBeans组件》.
)表3-1本方案所需的编程方法应用程序元素所需的编程方法应用程序服务器无.
EJB模块创建具有远程接口的会话企业bean(CatalogManagerBean).
远程接口适合于通过其它模块远程调用的方法.
将业务方法增加到将目录数据返回到调用方的会话bean.
这些业务方法之一返回目录中的所有项,而其它业务方法返回由客户端指定的任何项的详细资料.
创建两个实体企业bean(ItemBean和ItemDetailBean)来表示包含目录数据的两个数据库表.
然后创建这些实体企业bean的本地接口.
本地接口适合于由同一模块中其它企业bean调用的方法,将方法增加到返回目录中所有项的ItemBean.
ItemDetailBean具有自动生成的findByPrimayKey方法,该方法返回特定项的详细资料.
最后会话bean调用这些方法来获取目录数据.
创建两个详细资料类,一个用于项目数据,一个用于ItemDetail数据.
CatalogDataEJB模块将这些类的实例返回到调用方.
创建CatalogDataEJB模块,该模块在资源管理器中通过EJB模块节点表示.
下一步将三个企业bean增加到该模块,使用CatalogDataEJB模块的属性表单来指定目录数据的数据源.
J2EE应用程序要查看如何将EJB模块增加到J2EE应用程序,请参阅第4章.
54构建J2EE应用程序2003年10月创建会话企业bean的远程接口CatalogDataEJB模块的设计通过生成对有态会话bean方法的远程调用来调用客户端模块以获取目录数据.
要使远程调用成为可能,则会话bean必须具有远程接口,可以在使用[会话Bean]向导创建会话bean时生成远程接口.
编码范例3-1显示了有态会话bean的已完成起始接口和远程接口.
这些接口定义了CatalogDataEJB模块和客户端模块之间的两个交互操作.
客户端通过调用getAllItems方法能够获取目录中所有项的列表,客户端也可以通过调用getOneItemDetail方法来指定某一项并获取该项的详细信息.
大多数实际的购物应用程序提供比这更多的功能.
这些实际的应用程序在接口中具有两个以上的业务方法.
当EJB模块将引用返回到实体bean实例时,该应用程序服务器跟踪客户端模块对实体bean实例所做的任何更改,并自动生成数据库更新.
将远程引用传递到客户端会消耗网络资源,并且只有客户端能更新数据时才能传递该引用.
在本方案中,客户端仅显示数据,不需要使用该功能.
CatalogData模块返回普通Java类的实例.
这些称为详细资料类的类具有与实体bean相同的字段.
CatalogData模块从实体bean实例将数据复制到详细资料类实例,并将详细资料类实例返回到客户端用于显示.
关于与实体企业bean一起使用详细资料类的更多信息,请参阅《构建EnterpriseJavaBeans组件》.
关于客户端模块使用远程接口来调用CatalogData模块的方法的更多信息,请参阅第36页的"Servlet方法的编程".
getAllItems和getOneItemDetail方法使用对实体bean方法的调用来实现.
实体bean生成合适的查询并将请求的数据作为实体bean实例返回.
要查看getAllItems方法的实现,请参阅编码范例3-3.
编码范例3-1会话bean的起始和远程接口publicinterfaceCatalogManagerBeanHomeextendsjavax.
ejb.
EJBHome{publicCatalogBeans.
CatalogManagerBeancreate()throwsjavax.
ejb.
CreateException,java.
rmi.
RemoteException;}publicinterfaceCatalogManagerBeanextendsjavax.
ejb.
EJBObject{publicjava.
util.
VectorgetAllItems()throwsjava.
rmi.
RemoteException;publicCatalogBeans.
idDetailgetOneItemDetail(java.
lang.
Stringsku)throwsjava.
rmi.
RemoteException;}第3章方案:EJB模块55创建实体企业bean的本地接口要获取客户端请求的数据,CatalogManagerBean需调用两个实体bean的方法.
因为这些调用都位于模块中,所以实体bean不需要消耗资源的远程接口.
相反,可以生成实体bean的本地接口.
本地接口比远程接口更快速、更有效.
只要不需要远程接口,您就应该使用本地接口.
使用[实体Bean]向导创建实体bean时会生成本地接口.
编码范例3-2显示了Item实体bean的已完成本地接口.
ItemDetailbean的各个接口都是相似的.
CatalogManagerBean调用findAll方法来获取目录中所有项的列表.
注–如果计划用IDE的测试应用程序功能来测试独立的企业bean,那么您需要同时生成远程和本地接口.
测试应用程序功能将生成操作企业bean的方法的web模块,并且该web模块客户端需要远程接口.
在会话企业bean中使用本地接口客户端模块通过调用CatalogManagerBean业务方法之一来请求目录数据.
这些是编码范例3-1中显示的CatalogManagerBean接口中声明的方法,业务方法的实现要调用实体bean方法.
要进行这些对实体bean的调用,CatalogManagerBean需要对创建的实体bean的本地接口的本地EJB引用.
您必须编程这些本地EJB引用中的两个独立部分.
JNDI查找代码.
两个会话bean业务方法都包括代码,该代码使用JNDI命名工具来获取对实体bean的LocalHome的引用.
引用的声明.
它由运行环境使用,通过查找代码来标识引用的特定bean.
编码范例3-2ItemBean企业bean的本地起始和本地接口publicinterfaceLocalItemBeanHomeextendsjavax.
ejb.
EJBLocalHome{publicCatalogBeans.
LocalItemBeanfindByPrimaryKey(java.
lang.
IntegeraKey)throwsjavax.
ejb.
FinderException;publicjava.
util.
CollectionfindAll()throwsjavax.
ejb.
FinderException;}publicinterfaceLocalItemBeanextendsjavax.
ejb.
EJBLocalObject{publicCatalogBeans.
iDetailgetIDetail();}56构建J2EE应用程序2003年10月本地EJB引用的JNDI查找代码编码范例3-3显示了会话beangetAllItems方法的实现.
CatalogDataEJB模块的客户端调用本方法来获取联机目录中所有项的列表.
该方法实现说明了CatalogManagerBean如何通过与实体bean交互来获取目录数据.
在本代码中有三个步骤:1.
CatalogManagerBean使用JNDI查找来获取对ItemBean本地起始接口的本地引用.
2.
CatalogManagerBean调用ItemBean.
findAll方法.
3.
CatalogManagerBean将目录数据从实体bean实例复制到详细资料类实例,然后将详细资料类实例增加到向量,最后将向量返回到客户端.
在编码范例3-3中的注释标识了这些步骤编码范例3-3CatalogManagerBean的getAllItems方法publicjava.
util.
VectorgetAllItems(){java.
util.
VectoritemsVector=newjava.
util.
Vector();try{if(this.
itemHome==null){try{//使用JNDI查找来获取对实体的引用//BeanLocalHome.
InitialContextiC=newInitialContext();Objectobjref=iC.
lookup("java:comp/env/ejb/ItemBean");itemHome=(LocalItemBeanHome)objref;}catch(Exceptione){System.
out.
println("lookupproblem"+e);}}//使用本地引用来调用findAll();java.
util.
CollectionitemsColl=itemHome.
findAll();if(itemsColl==null){itemsVector=null;}else{//将数据复制到详细资料类实例.
java.
util.
Iteratoriter=itemsColl.
iterator();while(iter.
hasNext()){iDetaildetail;detail=((CatalogBeans.
LocalItemBean)iter.
next()).
getIDetail();itemsVector.
addElement(detail);}}}第3章方案:EJB模块57在lookup语句中指定的字符串是引用的名称,不是引用的企业bean的名称.
为了便于记住所指的是哪个企业bean,企业bean名称经常作为引用名称使用.
对企业bean引用名称的实际映射由引用声明完成(包含在下一步中).
本地EJB引用的引用声明写好JNDI查找代码后,您需要设置本地EJB引用声明.
本地EJB引用声明将在lookup语句中使用的引用名称映射到实际企业bean名称.
引用的企业bean必须与调用的bean在同一模块中.
要设置本地EJB引用声明:1.
右键单击调用的bean的逻辑节点并选择[属性]→[引用]标签→[EJB本地引用]属性→省略号(.
.
.
)按钮→[增加]按钮.
[增加EJB本地引用]对话框打开.
2.
在对话框中定义引用.
a.
在[引用名称]字段,键入在lookup语句中使用的引用名称.
图3-2显示用于编码范例3-3中的引用名称.
b.
将引用名称映射到企业bean.
单击[引用EJB名称]字段旁的[浏览]按钮.
这样将打开选择匹配企业bean的浏览器.
图3-2显示该字段选择了ItemBean.
catch(Exceptione){System.
out.
println(e);}returnitemsVector;}编码范例3-3CatalogManagerBean的getAllItems方法(后续)58构建J2EE应用程序2003年10月图3-2[增加EJB引用]对话框组装EJB模块创建企业bean之后,再创建CatalogDataEJB模块并增加企业bean.
此外,通过选择属性值来配置EJB模块,该属性值从应用程序服务器请求特定的运行环境服务.
不同应用程序服务器产品需要不同的部署信息,并且EJB模块属性包括某些特定服务器属性.
本方案使用SunONE应用程序服务器的某些特定服务器属性.
创建EJB模块在IDE中有两种创建EJB模块的方法,两个过程都在您所指定的位置创建EJB模块节点.
EJB模块节点表示了模块的部署描述符.
增加到模块的企业bean显示为模块节点的子节点,但是IDE不将企业bean的源文件复制到保存模块节点的目录.
当决定放置EJB模块的位置时,请记住这一点.
如果要把模块的所有源码保存在单一文件系统中,则要考虑将EJB模块节点放置在该文件系统的顶层.
如果模块的源码位于不同的文件系统中,例如属于不同开发人员的文件系统,则要考虑创建仅包含模块和J2EE应用程序的一组目录.
将这些目录与包含源码的目录分隔开.
第3章方案:EJB模块59要创建以企业bean节点开头的EJB模块:1.
右键单击企业bean节点并选择[创建新的EJB模块].
[新建EJB模块]对话框打开.
2.
命名模块并在文件系统中选择该模块的位置.
a.
在[名称]字段,输入新模块的名称.
在本方案中,EJB模块命名为CatalogData.
b.
在新的EJB模块字段的[选择软件包位置],选择要创建新模块的文件系统、目录或软件包.
c.
单击[确定].
表示新模块的节点在选定的文件系统、目录或节点下创建.
在步骤1中右键单击的企业bean自动被包括在新模块中.
可以将更多企业bean增加到模块.
请参阅第60页的"将企业bean和其它资源增加到模块".
要从文件系统、软件包或目录节点创建EJB模块:1.
右键单击任何资源管理器窗口节点,然后选择[新建]→[所有模板].
[新建]向导的[选择模板]页打开.
2.
选择[EJB模块]模板.
a.
在[选择一个模板]字段,展开J2EE节点并选择EJB模块节点.
b.
单击[下一步][新建对象名称]页面打开.
3.
定义新的EJB模块.
a.
在[名称]字段,输入模块的名称.
在本方案中,模块命名为CatalogData.
b.
单击[完成].
IDE创建该模块并与步骤1中选定的文件系统、软件包或目录下的EJB模块一起表示在资源管理器中.
这两个过程都在选择的位置中创建EJB模块节点.
请记住,IDE在本目录中存储关于模块的部署描述符信息,但是不将模块中组件的源码复制到本目录中.
60构建J2EE应用程序2003年10月将企业bean和其它资源增加到模块创建模块之后,就可以将企业bean增加到该模块.
要将企业bean增加到EJB模块:1.
右键单击模块节点并选择[增加EJB].
这将打开[将EJB增加到EJB模块]对话框.
2.
选择一个或多个企业bean.
a.
在[选择要增加到此EJB模块的EJB]字段,选择您要增加到该模块的企业bean.
b.
单击[确定].
IDE将选定的企业bean增加到模块.
在资源管理器中,IDE在模块节点下增加表示选定bean的节点.
将企业bean增加到模块时,IDE管理企业bean在其它种类资源(Java类、图像文件等等)上的任何相关性.
IDE自动将这些资源增加到模块定义.
关于其少数异常情况,请参阅第65页的"标识额外文件".
指定实体企业bean的数据源在本方案中,CatalogDataEJB模块访问数据库来获取目录数据.
J2EE应用程序使用由应用程序服务器提供的连接池和其它服务,通过J2EE应用程序服务器访问数据库.
必须将该数据库设置为具有JNDI名称的应用程序服务器资源.
将数据库定义为应用程序服务器资源来将数据库JNDI名称映射到实际数据库URL中.
访问数据库的J2EE应用程序必须由包含数据库JNDI名称的资源引用来配置.
设置资源引用的方法取决于您正在使用的实体bean的类型:如果您正在使用容器管理的实体bean,则应用程序服务器决定如何标识数据库.
对于包括SunONE应用程序服务器在内的大多数应用程序服务器,您使用模块的特定服务器属性通过JNDI名称来标识数据源.
如果正在使用bean管理的实体bean,则必须编写JNDI查找代码并设置将查找名称映射到JNDI名称的匹配资源引用声明.
注–在开发期间,您可以在IDE中打开到数据库的实时连接并使用[实体bean]向导来创建建模数据库表的实体bean.
这种连接在构建EnterpriseJavaBeans组件中说明.
本节说明了如何指定在运行环境中使用的数据库.
第3章方案:EJB模块61使用容器管理实体bean的特定服务器标签对于容器管理实体bean,使用EJB模块的CMP资源属性通过JNDI名称来指定数据源,IDE会自动创建资源引用.
CMP资源属性包含缺省Pointbase数据库的JNDI名称.
要配置容器管理实体bean以使用数据库:1.
右键单击EJB模块节点并选择[属性]→[SunONEAS]标签→[CMP资源]→省略号(.
.
.
)按钮.
[CMP资源]属性编辑器打开.
2.
输入标识EJB模块的数据库及其实体bean的值.
图3-3显示带有值的[CMP资源]属性编辑器,该值使CatalogDataEJB模块可以访问命名为sample的Pointbase数据库.
图3-3EJB模块CMP资源属性编辑器注–IDE的大多数安装情况均包括SunONE应用程序服务器和PointBase数据库服务器.
安装IDE时将名为sample的PointBase数据库设置为应用程序服务器资源,JNDI名称为jdo/PointbasePM.
在本方案中,CatalogDataEJB模块配置为使用sample数据库.
该过程的目的是与SunONE应用程序服务器和已安装的PointBase数据库一起使用IDE.
如果正在使用其它数据库产品或其它应用程序服务器产品,则必须修改该过程.
如果正在与SunONE应用程序服务器和非PointBase的数据库产品一起使用IDE,则需要使用应用程序服务器的管理工具来将应用程序服务器的数据库定义为具有JNDI名称的JDBC数据源.
然后,您可以与数据源JNDI名称一起使用该过程来配置EJB模块.
62构建J2EE应用程序2003年10月如果正在使用的应用程序服务器不是SunONE应用程序服务器,则数据库必须设置为应用程序服务器的数据源资源并给出JNDI名称.
这些过程取决于应用程序服务器产品.
用JNDI名称设置数据库后,您可以使用JNDI名称来配置EJB模块.
在[EJB模块]属性表单,使用正在使用的应用程序服务器产品的特定服务器标签.
属性名称可以与[CMP资源]不同.
如果要在已管理的测试环境或生产环境中部署应用程序,那么系统管理将可能负责将数据库设置为应用程序服务器资源并分配JNDI名称.
在这种情况下,您只需从系统管理获取数据源的JNDI名称.
显式创建bean管理实体bean的资源工厂引用如果EJB模块包含使用bean管理持久性的实体bean而不是容器管理持久性的实体bean,则该实体bean已经包括准备并执行数据库查询的JDBC和JTA代码.
这一部分包含在构建EnterpriseJavaBeans组件中.
这些代码必须包括获取对数据源的资源工厂引用的JNDI查找,该查找使用数据源的JNDI名称来获取引用.
如同其它种类的J2EE引用,本类引用具有两部分:JNDI查找.
每个实体bean都包括使用JNDI查找语句来获取对已命名资源的引用的代码.
引用的声明.
该声明将用于查找语句中的引用名称映射到数据源的JNDI名称.
用显式查找指定的任何数据源必须是具有已分配JNDI名称的应用程序服务器的已命名资源.
该应用程序服务器具有将JNDI名称映射到实际数据库URL的信息.
资源工厂引用的JNDI查找代码编码范例3-4显示了用于BMP实体企业bean来查找数据源的代码:编码范例3-4数据库的JNDI查找try{//获取初始上下文--打开与JNDI命名的通讯:Contextic=newInitialContext();//请求资源的查找--在本示例中为JDBC数据源:javax.
sql.
DataSourcehrDB=(javax.
sql.
DataSource)ic.
lookup(òjava:comp/env/jdbc/Local_HR_DBò);}catch(Exceptione){System.
out.
println(e.
toString());e.
printStackTrace();return;}第3章方案:EJB模块63资源引用的引用声明除了编写查找语句,还必须设置数据源资源的引用声明.
要设置数据源引用的引用声明:1.
右键单击企业bean的逻辑节点并选择[属性]→[引用]标签→[资源引用]→省略号(.
.
.
)按钮→[增加]按钮.
[增加资源引用]对话框打开.
2.
提供标识数据源的信息.
a.
在[名称]字段中,输入用于lookup语句中的引用名称.
图3-4显示用于编码范例3-4中的引用名称.
图3-4[增加资源引用]对话框64构建J2EE应用程序2003年10月b.
单击[SunONE应用程序服务器]标签.
c.
将引用名称映射到数据源.
图3-5显示[JNDI名称]字段,值为jdbc/jdbc-pointbase.
这是包括在大多数IDE安装中的PointBase数据库的JNDI名称的缺省名称.
图3-5[增加资源引用]对话框,特定服务器标签该过程的目的是与SunONE应用程序服务器和已安装的PointBase数据库一起使用IDE.
如果正在使用其它数据库产品或其它应用程序服务器产品,则必须修改该过程.
请按以下方法修改步骤:如果正在与SunONE应用程序服务器和非PointBase的数据库产品一起使用IDE,则需要使用应用程序服务器的管理工具来将应用程序服务器的数据库定义为具有JNDI名称的JDBC数据源.
然后,您可以与数据源JNDI名称一起使用该过程来配置EJB模块.
如果正在使用的应用程序服务器不是SunONE应用程序服务器,那么使用的数据库必须用应用程序服务器设置为具有JNDI名称的数据源.
这些过程取决于应用程序服务器产品.
用JNDI名称设置数据库后,您可以使用JNDI名称来配置EJB模块.
在[增加资源引用]对话框中,使用正在使用的应用程序服务器产品的特定服务器标签.
第3章方案:EJB模块65其它模块组装任务上述几节涵盖了组装CatalogDataEJB模块所需的组装任务.
本节描述了在CatalogData方案中没有包含的某些EJB模块组装任务.
EJB模块可能需要您执行这些其它组装任务中的某些任务.
本节包含了可以执行的多个web模块组装任务.
对于每个模块,您需要决定组装任务所需的内容.
关于模块可能提出的问题包括:是否模块中所有引用都已经链接您的模块可能包含对其它模块中组件的某些引用.
将模块组装到J2EE应用程序后才能链接这些引用.
是否已设置模块的通用安全角色是否已将在模块的企业bean中的任何安全角色引用都链接到这些通用安全角色是否已将方法权限映射到这些通用安全角色关于这些问题的更多信息,请参阅第7章.
是否已定义容器管理的事务关于该问题的更多信息,请参阅第6章.
在CatalogDataEJB模块方案中没有包含的某些EJB模块任务在后面的几节中描述.
标识额外文件在大多数情况下,IDE识别EJB模块中的企业bean的相关性,并包括EJBJAR文件中所有需要的文件,该JAR文件在部署时生成.
但是,IDE不能识别某些相关性.
这些不能识别的相关性包括:模块中使用帮助文件而不直接进行调用的企业bean模块中动态访问类并仅作为字符串而不作为类声明来使用类名称的企业bean在这些情况和相似的情况下,IDE在它创建的归档文件中不能识别企业bean的相关性且不能包括帮助文件或类文件.
您需要标识这些文件以便将它们包括进归档中并且在运行环境中可用.
要标识额外文件:1.
右键单击EJB模块节点并选择[属性]→[额外文件]→省略号(.
.
.
)按钮.
[额外文件]属性编辑器打开.
2.
选择应该被部署或归档为本模块的一部分的额外文件.
a.
在[源]字段,选择属于模块中的额外文件.
b.
单击[增加]按钮来将选定的文件增加到额外文件列表.
3.
单击[确定]来关闭编辑器并处理您的选择.
66构建J2EE应用程序2003年10月排除重复JAR文件在某些情况下,您要防止IDE使用它所识别的某些文件相关性.
例如,模块中的企业bean具有最常使用的JAR文件的相关性,而您知道该文件将出现在运行环境中.
可以通过将该JAR文件标识为重复的JAR文件,防止IDE增加常用JAR文件的不必要的副本.
要排除重复JAR文件:1.
右键单击模块节点并选择[属性]→[要排除的库Jar]→省略号(.
.
.
)按钮.
[要排除的库Jar]属性编辑器打开.
它显示了已安装JAR文件的列表.
2.
选择应该排除的JAR文件并单击[增加]按钮来将它们移动到要排除的库JAR的列表.
3.
单击[确定]来关闭属性编辑器并处理您的选择.
67第4章方案:Web模块和EJB模块图4-1显示组装在J2EE应用程序中的web模块和EJB模块.
出现在图中的大多数交互操作包含在第2章和第3章中.
例如,在用户的web浏览器和web模块之间的HTTP请求和响应包含在第2章中.
模块间新的交互操作在图中通过标为1的箭头表示.
图4-1CatalogAppJ2EE应用程序68构建J2EE应用程序2003年10月本应用程序中的交互操作本方案描述了图4-1中所示的J2EE应用程序和交互操作的用法之一.
本方案继续第2章和第3章中所述的联机购物应用程序.
HTTP与用户交互所需的编程已经在web模块中完成,与数据库交互所需的编程已经在EJB模块中完成.
本方案解释如何将两个模块组合为执行端到端交互操作的J2EE应用程序.
在需要组装工作的模块之间有一个交互操作.
该交互操作是从web模块到EJB模块的远程方法调用.
本交互操作所需的大多数代码已经位于web模块或EJB模块中.
已位于模块中的代码概述如下:Web模块包含JNDI查找代码和EJB引用声明.
关于该代码的更多信息,请参阅第38页的"EJB引用的引用声明".
EJB模块包含支持远程方法调用的远程接口.
关于该代码的更多信息,请参阅第54页的"创建会话企业bean的远程接口".
本章中的过程说明如何将两个模块组装到J2EE应用程序中,以及如何在模块间配置交互操作.
组装应用程序后,您可以部署并执行应用程序.
第4章方案:Web模块和EJB模块69本应用程序的编程表4-1概述了创建和组装本方案中所述的J2EE应用程序需要的编程.
以下几节说明这些编程任务.
创建J2EE应用程序在IDE中有两种创建J2EE应用程序的方法,两个过程都在您所指定的位置中创建应用程序节点.
J2EE应用程序节点表示应用程序的部署描述符.
增加到应用程序的模块作为应用程序的子节点显示,但是IDE不将这些模块的源文件复制到保存应用程序节点的目录.
决定放置J2EE应用程序节点的位置时要记住这一点.
如果要将应用程序的所有源码保存到单一文件系统中,则要考虑将应用程序放置在该文件系统的顶层.
如果应用程序的源码位于不同的文件系统中,例如属于不同开发人员的文件系统,则要考虑创建仅包含J2EE应用程序和模块的一组目录.
将这些目录与包含源码的文件系统分隔开.
表4-1本方案所需的编程方法应用程序元素所需的编程方法应用程序服务器无.
Web模块请参阅第2章.
EJB模块请参阅第3章.
J2EE应用程序创建CatalogAppJ2EE应用程序.
该操作将在SunONEStudio5资源管理器中创建J2EE应用程序节点,然后将web模块和EJB模块增加到应用程序.
指定web模块的web上下文.
确保web模块的EJB引用正确链接到EJB模块中的企业bean.
70构建J2EE应用程序2003年10月要从模块节点创建J2EE应用程序:1.
右键单击EJB模块节点并选择[新建应用程序].
[新建应用程序]对话框打开.
2.
命名J2EE应用程序并在文件系统中为它选择位置.
a.
在[名称]字段中,输入新的应用程序名.
在本方案中,新的J2EE应用程序命名为CatalogApp.
b.
在[为新建的应用程序选择软件包的位置]字段中,选择要创建新应用程序的文件系统、目录或软件包.
c.
单击[确定].
表示新应用程序的节点在选定的文件系统、目录或节点下创建.
在步骤1中右键单击的模块自动包括在新的应用程序中.
可以将更多模块增加到应用程序.
关于这些过程的信息,请参阅第71页的"将模块增加到J2EE应用程序".
要从文件系统、软件包或目录节点创建EJB模块:1.
右键单击任何资源管理器窗口节点并选择[新建]→[所有模板].
[新建]向导的[选择模板]页打开.
2.
选择[J2EE应用程序]模板.
a.
在[选择模板]字段中,展开J2EE节点并选择应用程序节点.
b.
单击[下一步][新建对象名称]页面打开.
3.
定义新的J2EE应用程序.
a.
在[名称]字段中,输入新的应用程序名.
在本方案中,应用程序命名为CatalogApp.
b.
单击[完成].
IDE创建该应用程序并与步骤1中选定的文件系统、软件包或目录下的J2EE应用程序节点一起表示在资源管理器中.
这两个过程都在选择的位置中创建应用程序节点.
请记住,IDE在本目录中存储关于应用程序的部署描述符信息,但是不将应用程序模块中组件的源码复制到本目录中.
第4章方案:Web模块和EJB模块71将模块增加到J2EE应用程序创建J2EE应用程序之后,就可以向其增加模块.
要将模块增加到应用程序:1.
右键单击应用程序并选择[增加模块].
[将模块增加到应用程序]对话框打开.
2.
选择一个或多个模块.
a.
在[选择要增加到此应用程序的模块]字段,选择您要增加到应用程序的模块.
要增加web模块,请选择模块的WEB-INF节点.
要增加EJB模块,请选择模块节点.
b.
单击[确定].
IDE将选定的模块增加到J2EE应用程序.
在资源管理器中,IDE在应用程序节点下增加表示选定模块的节点.
将模块增加到J2EE应用程序后,IDE记录模块对其它种类资源(Java类、图像文件等等)的任何相关性并自动将那些资源包括进应用程序中.
设置web模块的web上下文将J2EE应用程序部署到J2EE应用程序服务器后,URL映射到web模块中的web资源,该映射是通过将URL模式附加到URL路径来完成的.
对于SunONE应用程序服务器,URL路径一般具有以下形式:http://hostname:port/web-context/URL-pattern该路径中的元素按以下方式决定:hostname是正在运行应用程序服务器的机器名,port是为该服务器实例的HTTP请求指定的端口号.
端口号在安装应用程序服务器时分配.
Web上下文是本过程中指定的字符串.
Web上下文限定模块中所有的web资源.
URL模式是标识特定servlet或JSP页面的字符串.
在web模块属性表单上分配URL模式.
将web模块组装到J2EE应用程序中前,可以分配URL模式.
关于该过程的信息,请参阅第41页的"将URL映射到Servlet"换句话说,在web模块属性表单中分配的URL模式与本过程中分配的web上下文相关.
要设置web上下文:1.
右键单击包括的web模块节点(这是J2EE应用程序下的web模块节点)并选择[属性].
2.
单击[Web上下文]属性并输入您要使用的字符串.
72构建J2EE应用程序2003年10月图4-2显示本方案中描述的CatalogWebModule的属性表单.
Web上下文属性设为catalog.
图4-2CatalogWebModule的属性表单Web上下文属性设为catalog时,在CatalogAppJ2EE应用程序中web资源的URL将具有以下通用格式:http://hostname:port/catalog/URL-pattern如果不提供web上下文,则它缺省为空白.
如果让CatalogAppJ2EE应用程序的web上下文缺省为空白,则web资源的URL将具有以下通用格式:http://hostname:port/URL-pattern链接EJB引用CatalogWebModule包含JNDI查找代码和EJB引用声明.
CatalogWebModule代码和部署描述符指定类型CatalogManagerBeanHome和CatalogManagerBean的接口.
关于如何设置查找代码和引用声明的信息,请参阅第38页的"EJB引用的引用声明".
CatalogDataEJB模块包含类型CatalogManagerBeanHome和CatalogManagerBean的远程接口,也包含实现该接口名为CatalogManagerBeanBean的bean类.
关于创建接口的信息,请参阅第54页的"创建会话企业bean的远程接口".
执行CatalogAppJ2EE应用程序前,您必须将web模块中的EJB引用链接到EJB模块中的企业bean.
第4章方案:Web模块和EJB模块73在某些情况下,创建应用程序前在web模块的属性表单上链接引用.
CatalogWebModule中的引用不在web模块属性表单中链接.
在本方案中,在CatalogApp属性表单上链接引用.
要在应用程序节点属性表单上链接EJB引用:1.
右键单击应用程序节点并选择[属性]→[EJB引用]→省略号(.
.
.
)按钮.
[EJB引用]属性编辑器打开.
2.
检查EJB引用的状态.
该编辑器说明所有引用已经在应用程序中声明.
引用通过模块和引用名称来标识.
图4-3显示了CatalogAppJ2EE应用程序的[EJB引用]属性编辑器.
有一个在CatalogWebModule中声明的EJB引用.
该引用命名为ejb/CatalogManagerBean,且不解决该引用.
图4-3取消链接的EJB引用如果不解决引用,则[值]字段为空并且[错误状态]字段显示表示错误的图标.
74构建J2EE应用程序2003年10月3.
链接任何未解决的引用.
要链接该引用,请单击[覆盖值]字段.
该字段在实现引用中指定的接口的应用程序中显示了企业bean的列表,选择这些企业bean之一.
图4-4显示了与图4-3相同的EJB引用,但是引用已与覆盖链接.
应用程序执行时,在CatalogWebModule中编码的方法调用将调用在[覆盖值]字段中指定的企业bean.
在图4-4中,[覆盖值]字段指定了CatalogDataEJB模块中名为CatalogBeans.
CatalogManagerBean的企业bean.
图4-4通过覆盖链接的EJB引用解决引用后,[覆盖值]字段显示已链接企业bean的名称,并且[错误状态]字段为空.
第4章方案:Web模块和EJB模块75附加组装任务上述几节包含了组装CatalogAppJ2EE应用程序所需的组装任务.
本节包含CatalogApp方案中不需要的其它J2EE应用程序组装任务.
J2EE应用程序可能需要这些其它组装任务中的某些任务.
本节包含了可以执行的一个应用程序组装任务.
覆盖环境条目如果应用程序包含环境条目,则您可能需要覆盖在模块属性表单上设置的值.
在应用程序的[环境条目]属性编辑器上覆盖该值.
要覆盖环境条目值:1.
右键单击应用程序节点并选择[属性]→[环境条目]→省略号(.
.
.
)按钮.
[环境条目]属性编辑器打开,该编辑器说明了已在应用程序中声明的所有环境条目.
环境条目通过引用名称和模块来标识.
2.
研究应用程序中的环境条目.
图4-5显示了CatalogApp应用程序的[环境条目]属性编辑器.
属性编辑器显示了web模块中声明的环境条目.
(要了解如何在web模块中声明环境条目,请参阅第47页的"设置环境条目引用".
)[值]字段显示100,它是在web模块的属性表单上设置的初始值.
图4-5J2EE应用程序[环境条目]属性编辑器76构建J2EE应用程序2003年10月3.
当初始值不适合于组装的应用程序时,请覆盖这些值.
a.
要覆盖环境条目,请单击[覆盖值]字段和省略号(.
.
.
)按钮.
[覆盖值]对话框打开.
b.
在[值]字段中,输入覆盖值.
单击[确定]关闭此对话框,然后返回属性编辑器.
图4-6显示了覆盖字段中有一个值的[环境条目]属性编辑器.
图4-6覆盖环境条目值如果在开发环境中具有web模块的源文件,则可以在web模块属性表单上更改该环境条目值.
但是,如果web模块有机会用于多个应用程序,则最好在应用程序属性表单上覆盖该值.
如果其它开发人员在其它应用程序中重新使用web模块并在web模块属性表单上更改环境条目的值,那么您重新部署时将更改此应用程序中的值.
查看并编辑部署描述符一般而言,您应该通过使用模块和应用程序属性表单来控制部署描述符的内容.
通过设置这些属性,您可以控制部署描述符的内容.
IDE允许您查看模块和应用程序的实际XML部署描述符.
第4章方案:Web模块和EJB模块77查看模块部署描述符您可以查看包括web模块和EJB模块的J2EE应用程序的部署描述符.
要查看部署描述符:右键单击包括EJB模块节点(EJB模块节点位于J2EE应用程序节点下)或包括web模块的J2EE应用程序节点,然后选择[查看部署描述符].
IDE在[源编辑器]中以只读模式打开部署描述符.
编辑模块部署描述符要编辑EJB模块的部署描述符:右键单击EJB模块节点并选择[部署描述符最终编辑].
IDE在[源编辑器]中打开部署描述符.
要编辑web模块的部署描述符:右键单击web模块的web节点然后选择[编辑].
IDE在[源编辑器]中打开部署描述符.
78构建J2EE应用程序2003年10月79第5章方案:Web模块和队列模式消息驱动Bean图5-1显示组装在J2EE应用程序中的web模块和EJB模块,模块之间的交互操作是异步消息传送.
Web模块将消息发送到队列,而EJB模块中消息驱动的企业bean从队列中读取消息.
将消息发送到队列在图中通过标为1的箭头表示,从队列读取消息通过标为2的箭头表示.
在模块中,消息驱动bean读取消息,然后通过调用其它企业bean的方法初始化过程.
图5-1具有队列模式消息驱动bean的J2EE应用程序最终用户Web浏览器J2EE购物应用程序CatalogWeb模块签出EJB模块会话企业bean实体企业bean80构建J2EE应用程序2003年10月本应用程序中的交互操作本方案描述了图5-1中所示的J2EE应用程序和交互操作的用法之一.
本方案继续说明零售web站点应用程序,不过讨论在不同EJB模块中实现的另一种交互操作.
在本方案中顾客会买单.
买单之前,顾客与在web模块中定义的web页面交互,选择商品并将商品放入购物车.
某些顾客的操作调用EJB模块的业务方法以便于选择数据.
应用程序同步处理这些操作顾客请求某些信息,然后继续下一步之前等待应用程序响应.
第2章、第3章和第4章说明了在J2EE应用程序中如何实现这种逻辑.
最后,顾客准备买单.
顾客查看购物车的内容,选择发货方式,确认总额并提供信用卡号.
顾客查看并确认订单,然后离开站点.
一段时间后,应用程序处理订单并通过电子邮件通知顾客.
本买单方案中包含的特定交互操作概述如下:1.
Web模块显示一个页面,该页面显示定购的商品、交货地址、发货方式和付款方式.
顾客确认订单并离开站点.
订单的详细资料保存在数据库中.
2.
顾客确认订单后,web模块将消息发送到消息队列.
该消息标识要处理的订单.
3.
该消息队列位于应用程序之外.
它由应用程序服务器维护.
4.
队列将消息传递到执行订单处理的EJB模块的消息驱动企业bean中.
该队列通过调用消息驱动bean的onMessage方法,将消息作为参数来传递.
5.
该消息驱动bean不包含处理订单的业务逻辑,它仅检查消息并初始化订单完成过程.
该消息驱动bean通过调用模块中其它企业bean的业务方法来初始化订单完成过程,这是使用消息驱动bean的典型方法.
6.
处理订单后,应用程序发送电子邮件来通知顾客.
本章中的过程说明了如何设置消息队列和队列连接工厂,如何配置发送模块和接收模块来使用队列.
第5章方案:Web模块和队列模式消息驱动Bean81为消息驱动通讯编程表5-1概述了本方案中描述的和在图5-1中所示的实现消息驱动交互操作所需的编程方法.
后续的几节说明了如何执行这些编程任务.
为完整应用程序编程还需要其它编程任务.
这些任务包括创建web组件和web模块,创建会话和实体企业bean以及创建EJB模块,这些任务包含在讨论这些问题的其它章节中.
本章主要讨论消息驱动交互操作.
设置应用程序服务器买单交互操作的设计调用web模块将消息发送到队列,调用EJB模块从队列读取消息然后处理消息中标识的订单.
本交互操作需要队列和队列连接工厂,队列和队列连接工厂是在IDE之外创建的应用程序服务器的资源.
如果您正在独立开发环境中工作,则需要自己管理队列和队列连接工厂.
如果您正在管理的测试环境或生产环境中工作,则系统管理将可能定义、配置并管理队列和队列连接工厂.
这种情况中,您只需获取队列和队列连接工厂的JNDI名称.
此外,阅读设置队列和队列连接工厂的下列说明将帮助您理解应用程序如何使用这些资源.
在完成本节中的过程前,您需要具有应用程序服务器和安装好的IDE应用程序服务器插件,还需要创建应用程序服务器实例.
应用程序服务器插件和服务器实例通过显示在资源管理器的运行环境标签中的节点表示.
关于应用程序服务器插件和应用程序服务器实例节点的更多信息,请参阅第119页的"服务器产品节点".
表5-1本应用程序所需的编程方法应用程序元素需要的设置应用程序服务器设置队列名CheckoutQueue和队列连接工厂名CheckoutQCF.
在IDE中使用应用程序服务器的管理工具进行设置.
Web模块创建发送消息的servletCheckoutServlet.
将代码增加到CheckoutServlet的processRequest方法:1.
使用JNDI查找来获取对CheckoutQueue和CheckoutQCF的引用.
2.
调用CheckoutQueue方法格式化并发送消息.
EJB模块创建消息驱动企业beanCheckoutMDB.
使用CheckoutMDB属性表单,将CheckoutMDB配置为CheckoutQueue的消息目标.
编码CheckoutMDB的onMessage方法.
82构建J2EE应用程序2003年10月设置队列本节解释如何设置SunONE应用程序服务器的消息队列.
其它应用程序服务器的过程也是相似的.
要将队列增加到SunONE应用程序服务器:1.
单击资源管理器的[运行环境]标签.
2.
展开SunONE应用程序服务器7节点.
3.
右键单击[未注册的JMS资源]节点,然后选择[增加新的JMS资源].
[新建]向导的[JMS资源]页面打开.
4.
定义队列:a.
在[JNDI名称]字段中,输入jms/CheckoutQueue.
b.
确保[资源类型]字段设为javax.
jms.
Queue.
c.
单击[下一步].
[新建]向导的[属性]页面打开.
5.
定义imqDestinationName属性.
a.
单击[增加].
第一行属性被激活.
b.
在[名称]字段中,选择imqDestinationName.
c.
在[值]字段中,输入Checkout.
Checkout是要创建的物理队列的名称.
J2EE应用程序将使用您分配的JNDI名称CheckoutQueue来访问名为Checkout的队列.
d.
单击[完成].
[您要继续注册吗]对话框打开.
6.
注册队列:a.
单击[注册].
[Java邮件会话注册]对话框打开.
b.
在[服务器实例]字段中,选择要注册队列的应用程序服务器实例.
选择将J2EE应用程序部署到的应用程序服务器.
c.
单击[注册].
[资源已注册成功]消息出现.
d.
单击[关闭].
第5章方案:Web模块和队列模式消息驱动Bean83设置QueueConnectionFactory本节解释如何设置SunONE应用程序服务器的队列连接工厂.
其它应用程序服务器的过程也是相似的.
要将队列连接工厂增加到SunONE应用程序服务器:1.
右键单击[未注册的JMS资源]节点,然后选择[增加新的JMS资源].
[新建]向导的[JMS资源]页面打开.
2.
定义队列连接工厂:a.
在[JNDI名称]字段中,输入jms/CheckoutQCF.
b.
确保[资源类型]字段设为javax.
jms.
QueueConnectionFactory.
c.
单击[完成].
[您要继续注册吗]对话框打开.
3.
注册队列连接工厂:a.
单击[注册].
[Java邮件会话注册]对话框打开.
b.
在[服务器实例]字段中,选择您要注册队列连接工厂所用的应用程序服务器实例.
选择创建队列时您所选定的应用程序服务器实例.
c.
单击[注册].
[资源已注册成功]消息出现.
d.
单击[关闭].
Web模块编程在本方案中,CheckoutServlet发送请求订单最终处理的消息.
该消息标识要处理的订单,CheckoutServlet调用队列连接工厂和队列的方法来发送消息.
CheckoutServlet需要到队列和队列连接工厂的引用来调用队列和队列连接工厂方法.
CheckoutServlet使用JNDI查找来从应用程序服务器环境获取队列和队列连接工厂引用.
类似于大多数J2EE引用查找,队列和队列连接工厂引用查找具有两个部分:JNDI查找代码.
Servlet包括使用JNDI命名工具来获取到队列或队列连接工厂的引用的代码.
引用的声明.
该声明将JNDI查找语句中的名称映射到队列或队列连接工厂的实际JNDI名称.
84构建J2EE应用程序2003年10月队列和队列连接工厂是应用程序服务器的命名资源.
应用程序组件使用JNDI名称来获取引用.
要了解如何将JNDI名称分配到队列和队列连接工厂,请参阅第81页的"设置应用程序服务器".
JNDI查找代码编码范例5-1显示了CheckoutServlet的processRequest方法,该方法执行JNDI查找.
获取队列和队列连接工厂后,processRequest调用队列和队列连接工厂的方法来创建和发送消息.
代码示例包含标识这些操作的注释.
编码范例5-1源于servlet,但是任何类型的J2EE组件都能使用相似的代码来发送消息.
在用作消息发送器的应用程序客户端或企业bean中可以重用本代码.
编码范例5-1CheckoutServlet的processRequest方法importjava.
io.
*;importjava.
net.
*;importjavax.
servlet.
*;importjavax.
servlet.
http.
*;importjavax.
jms.
*;importjavax.
naming.
*;//.
.
.
protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.
setContentType("text/html");PrintWriterout=response.
getWriter();//在此处输出页面//删除缺省方法正文并插入下列行:ContextjndiContext=null;javax.
jms.
TextMessagemsg=null;QueueConnectionFactoryqueueConnectionFactory=null;QueueConnectionqueueConnection=null;QueueSessionqueueSession=null;Queuequeue=null;QueueSenderqueueSender=null;TextMessagemessage=null;out.
println("");out.
println("");out.
println("Servlet");out.
println("");out.
println("");try{//连接到缺省命名服务--由应用程序服务器管理第5章方案:Web模块和队列模式消息驱动Bean85关于创建和发送消息的更多信息,请参阅《构建EnterpriseJavaBeans组件》.
jndiContext=newInitialContext();}catch(NamingExceptione){out.
println("CouldnotcreateJNDI"+"context:"+e.
toString());}try{//执行本方案中创建的缺省QueueConnectionFactory和队列//的JNDI查找.
queueConnectionFactory=(QueueConnectionFactory)jndiContext.
lookup("java:comp/env/jms/CheckoutQCF");queue=(Queue)jndiContext.
lookup("java:comp/env/jms/CheckoutQueue");}catch(NamingExceptione){out.
println("JNDIlookupfailed:"+e.
toString());}try{//使用引用来连接到队列并发送消息.
queueConnection=queueConnectionFactory.
createQueueConnection();queueSession=queueConnection.
createQueueSession(false,Session.
AUTO_ACKNOWLEDGE);queueSender=queueSession.
createSender(queue);message=queueSession.
createTextMessage();message.
setText("Order#33454344");queueSender.
send(message);}catch(JMSExceptione){out.
println("Exceptionoccurred:"+e.
toString());}finally{if(queueConnection!
=null){try{queueConnection.
close();}catch(JMSExceptione){}}//if语句结束点}//最后结束点//和要插入代码的结束点out.
close();}编码范例5-1CheckoutServlet的processRequest方法(后续)86构建J2EE应用程序2003年10月队列的引用声明引用声明出现在模块的部署描述符中.
引用声明将用于查找语句中的引用名映射到应用程序服务器环境中的JNDI名称.
要设置队列的引用声明:1.
右键单击web模块的web节点并选择[属性]→[引用]标签→[资源环境引用]→省略号(.
.
.
)按钮.
[资源环境引用]属性编辑器打开.
2.
单击[增加]按钮.
[增加资源环境引用]对话框打开.
3.
声明[资源环境引用].
a.
在[名称]字段中,输入显示在lookup语句中的引用名称.
图5-1显示[名称]字段中的值jms/CheckoutQueue.
这是用于编码范例5-1中的引用名称.
b.
在[类型]字段中,选择javax.
jms.
Queue.
图5-2增加CheckoutQueue的资源环境引用第5章方案:Web模块和队列模式消息驱动Bean874.
将引用名称映射到JNDI名称.
a.
单击[增加]对话框的[SunONE应用程序服务器]标签.
b.
在[JNDI名称]字段,输入队列的JNDI名称.
图5-3显示[JNDI名称]字段中的值jms/CheckoutQueue.
该值将[标准]标签上的引用名称映射到名为CheckoutQueue的队列.
要了解如何命名队列,请参阅第81页的"设置应用程序服务器".
图5-3提供队列引用的JNDI名称QueueConnectionFactory的引用声明要设置队列连接工厂的引用声明:1.
右键单击web模块的web节点并选择[属性]→[引用]标签→[资源引用]→省略号(.
.
.
)按钮.
[资源引用]属性编辑器打开.
2.
单击[增加]按钮.
[增加资源引用]对话框打开.
88构建J2EE应用程序2003年10月3.
声明资源引用.
a.
在[名称]字段中,输入显示在lookup语句中的引用名称.
图5-4在[名称]字段中显示值jms/CheckoutQueue.
这是用于编码范例5-1中的引用名称.
b.
在[类型]字段中,选择javax.
jms.
QueueConnectionFactory.
图5-4QueueConnectionFactory的资源引用第5章方案:Web模块和队列模式消息驱动Bean894.
将引用名称映射到JNDI名称.
a.
单击[增加]对话框的[SunONE应用程序服务器]标签.
b.
在[JNDI名称]字段,输入队列连接工厂的JNDI名称.
图5-5在[JNDI名称]字段中显示值jms/CheckoutQueue.
该值将[标准]标签上的引用名称映射到名为CheckoutQCF的队列连接工厂.
要了解如何命名队列连接工厂,请参阅第81页的"设置应用程序服务器".
关于其它授权类型的信息,请参阅《构建EnterpriseJavaBeans组件》中消息驱动bean所包含的部分.
图5-5QueueConnectionFactory引用的JNDI名称90构建J2EE应用程序2003年10月EJB模块编程在本买单方案中,处理顾客买单请求的业务逻辑位于CheckoutEJB模块中.
第83页的"Web模块编程"显示web模块如何查找队列引用和队列连接工厂引用并发送消息.
要完成本交互操作,EJB模块中的消息驱动bean需要从队列接收消息.
消息驱动bean不使用程序引用,也不需要JNDI查找代码.
可以使用消息驱动bean的属性表单来指定应使用的队列和队列连接工厂,在部署描述符中设置这些属性以设置标记.
设为配置消息驱动bean的属性在下面列出:[消息驱动目标]属性.
该属性指定了消息驱动bean使用的目标类型.
[Mdb连接工厂]属性.
该属性指定了队列连接工厂.
[JNDI名称]属性.
该属性指定了队列,是SunONE应用程序服务器的特定属性.
其它应用程序服务器将使用不同的属性来指定队列.
部署应用程序时,应用程序服务器自动使用在部署描述符中指定的队列连接工厂来打开从消息驱动bean到在部署描述符中指定的队列的连接.
配置[消息驱动目标]属性指定队列和队列连接工厂前,您需要将消息驱动bean配置为队列用户.
要将消息驱动bean配置为队列用户:1.
右键单击消息驱动bean的逻辑节点并选择[属性]→[消息驱动目标]→省略号(.
.
.
)按钮.
[消息驱动目标]属性编辑器打开.
2.
将消息驱动bean标识为队列用户.
a.
在[目标类型]字段中,选择队列.
图5-6消息驱动bean属性表单b.
单击[确定].
第5章方案:Web模块和队列模式消息驱动Bean91指定连接工厂要配置队列连接工厂的消息驱动bean:1.
右键单击消息驱动bean的逻辑节点并选择[属性]→[SunONEAS]标签→[Mdb连接工厂]→省略号(.
.
.
)按钮.
[Mdb连接工厂]属性编辑器打开.
2.
指定队列连接工厂:a.
在[Jndi名称]字段中,输入队列连接工厂的JNDI名称.
图5-7显示在[Jndi名称]字段中的值jms/CheckoutQCF.
jms/CheckoutQCF是在发送web模块中指定的队列连接工厂.
b.
如果需要用户名和口令,则在[名称]和[口令]字段中输入.
图5-7消息驱动bean的[连接工厂]属性编辑器c.
单击[确定].
92构建J2EE应用程序2003年10月指定队列要配置队列的消息驱动bean:1.
右键单击消息驱动bean的本地节点并选择[属性]→[SunONEAS]标签→[JNDI名称]→省略号(.
.
.
)按钮.
[JNDI名称]属性编辑器打开.
2.
指定队列.
在本方案中,使用jms/CheckoutQueue.
jms/CheckoutQueue是在发送web模块中指定的队列.
onMessage方法的编码应用程序服务器通过调用bean的onMessage方法将消息传递到消息驱动bean.
消息作为onMessage方法的参数传递.
编码范例5-2显示了onMessage方法.
您可以查看到作为参数传送的消息和增加消息处理代码的位置.
在本方案中,如同图5-1中所示,该消息驱动bean在同一EJB模块中立即调用会话bean的业务方法.
该会话bean控制订单的处理,这是典型的onMessage行为.
更多关于编写onMessage方法的信息,请参阅《构建EnterpriseJavaBeans组件》.
消息驱动bean使用EJB本地引用调用会话bean.
关于如何使用EJB本地引用实现方法调用的更多信息,请参阅第56页的"本地EJB引用的JNDI查找代码"和第57页的"本地EJB引用的引用声明".
组装J2EE应用程序图5-1显示组装在J2EE应用程序中发送消息的web模块和接收消息的EJB模块,如同本章所述对这些模块进行编程.
创建应用程序并将两个模块增加到该应用程序,两个模块已配置好来使用CheckoutQueue和CheckoutQCF.
对于消息驱动交互操作,不需要打开J2EE应用程序属性表单并执行任何附加组装工作.
关于创建应用程序和增加模块的信息,请参阅第69页的"创建J2EE应用程序".
编码范例5-2onMessage方法publicvoidonMessage(javax.
jms.
MessageaMessage){//在此处处理消息.
}93第6章事务本章主要介绍了使用EJB模块属性表单对容器管理事务进行编程.
关于bean管理事务,请参阅《构建EnterpriseJavaBeans组件》.
缺省事务边界事务边界是由事务相关的企业bean的[事务属性]属性来决定的.
当您使用IDE的EJB向导创建企业bean并选择容器管理事务时,向导创建的企业bean的[事务属性]属性将具有缺省值.
本节将介绍如何查看并解释缺省的事务属性设置.
要打开[事务设置]属性编辑器并检查缺省设置:右键单击EJB模块节点并选择[属性]→[事务设置]属性→省略号(.
.
.
)按钮.
[事务设置]属性编辑器打开.
94构建J2EE应用程序2003年10月图6-1显示了第3章中说明的CatalogDataEJB模块的[事务设置]属性编辑器.
图6-1中显示的值都是缺省的事务属性设置.
图6-1缺省的事务属性设置缺省的事务属性设置显示在[EJB或方法事务属性]字段中.
要理解此处显示的内容,请注意其中的下列特性:模块中的每一个企业bean都出现在其中.
每个企业bean都使用一个节点来表示.
每一个企业bean的名称后都跟有它的事务属性.
例如,图6-1中的第一个节点CatalogManagerBean后跟有单词[必需的].
[必需的]是[事务属性]属性的缺省设置.
在图6-1中,所有的企业bean都具有缺省设置.
代表企业bean的节点可以被展开,用于显示代表每个企业bean的方法的节点.
在图6-1中,所有的企业bean节点都已展开.
方法有它们自己的事务属性值,该值出现在方法名称的后面.
如果事务属性值为空,则方法将继承其所属的企业bean的事务属性值.
在图6-1中,所有的方法节点都没有显示事务属性值.
因此,所有这些方法都将继承值[必需的].
这就是方法的事务属性的缺省设置.
第6章事务95[必需的]是《Java2平台,EnterpriseEdition规范》中定义的事务属性值之一.
以下是具有[必需的]事务属性的方法的规则:如果在没有活动事务的情况下调用具有必需的属性的方法,应用程序服务器将开始一个新的事务.
如果当活动事务正在进行时调用具有[必需的]属性的方法,应用程序服务器将在活动事务内执行该方法.
这是企业bean方法的缺省行为.
重定义事务边界EJB模块中的业务事务通常跨越多个企业bean.
企业bean的业务逻辑的通用体系结构包括一个会话bean和多个实体bean.
客户端调用会话bean,然后会话bean调用实体bean的方法.
例如,客户端上存在两条相关的新数据库记录所对应的数据.
会话bean通过调用两个实体bean的create方法来创建数据库插入,这两项数据库插入操作必须处于同一个事务中.
图6-2中显示了这种类型的事务.
图6-2复杂事务1)客户端调用会话bean方法,容器启动事务.
EJB模块实体bean2)会话bean方法调用实体bean方法,事务保持打开状态.
会话bean方法调用另一实体bean方法,事务保持打开状态.
3)会话bean方法返回,容器提交事务.
实体bean会话bean96构建J2EE应用程序2003年10月当您将这些实体bean组装到EJB模块中时,需要应用程序服务器能够识别业务事务的边界.
您需要应用程序服务器能够包含客户端调用单个数据库事务后EJB模块需要执行的所有操作,此外还需要应用程序服务器能够执行以下操作:当客户端调用会话bean时,您需要应用程序服务器打开一个事务.
当会话bean调用实体bean时,您需要应用程序服务器能确保事务处于打开状态.
您需要当会话bean对于实体bean的最后一次调用返回时,应用程序关闭事务并结束客户端调用的会话bean.
如果应用程序服务器能够识别这些事务边界,EJB模块需要执行的所有任务将被一起提交或转返.
要配置事务边界,您需要打开[事务设置]属性编辑器并修改事务相关的企业bean的事务属性.
下列步骤显示了如何编辑事务属性设置.
此过程将图6-1中显示的缺省事务设置更改为图6-2中显示的事务边界所需的事务属性设置.
要更改事务属性:1.
右键单击EJB模块节点并选择[属性]→[事务设置]属性→省略号(.
.
.
)按钮.
[事务设置]属性编辑器打开.
2.
将会话bean方法的事务属性更改为RequiresNew.
您可以更改CatalogManagerBean方法的行为,这样对它的任何一个业务方法(getAllItems和getOneItemDetail)的调用都将开始一个新事务.
要实现这一目的,将事务属性更改为RequiresNew.
a.
单击会话bean方法以选择它.
b.
将[事务属性]字段的值更改为RequiresNew.
注意,新的事务属性值处于方法节点的后面.
3.
将实体bean方法的事务属性更改为Mandatory.
您需要更改实体bean方法的行为,使这些方法在会话bean方法打开的事务的边界内执行.
要实现这一目的,将事务属性更改为Mandatory.
这样应用程序服务器就知道了只有当事务正在进行时,才能执行这些方法.
a.
单击实体bean方法以选择它.
b.
将[事务属性]字段的值更改为Mandatory.
注意,新的事务属性值处于方法节点的后面.
第6章事务974.
单击[确定]用于关闭编辑器并保存所做的更改.
图6-3显示了[事务设置]属性编辑器中包含了新的事务属性设置.
图6-3更改后的事务设置现在事务边界就与业务事务相匹配了,下表描述属性编辑器中的可见更改:会话bean方法的事务属性被设置为RequiresNew,因为您需要容器在客户端调用这些方法中的任何一个时能够打开一个新的事务.
实体bean业务方法的事务属性被设置为Mandatory,这也就是说这些方法必须当事务正在进行时才能被调用.
需要让这些方法在会话bean打开事务之后被调用,并且希望这些方法在会话bean的事务的边界内执行.
注意,我们是在方法级别对事务属性进行的修改,现在方法节点在方法名称的后面显示了新的事务属性值.
对于您使用的每个EJB模块,必须分析模块的业务逻辑并确定逻辑所暗示的事务边界.
然后使用[事务属性]属性编辑器来实现那些事务边界.
可以设置企业bean或其中单个方法的事务属性用于指定相关事务的事务边界.
98构建J2EE应用程序2003年10月99第7章安全性应用程序的安全性是通过对程序的特性和功能的使用加以限制来实现的.
而对于程序的特性和功能的使用限制又是通过对于应用程序管理的数据的访问进行限制实现的.
J2EE应用程序的安全性通过应用程序资源和用户角色的共同作用来实现.
下面对这两个概念进行定义:资源是应用程序中的可见或可调用特性.
对于EJB模块,资源是在起始接口或远程接口声明的公共EJB方法.
对于web模块,资源指的是映射到JSP页面、servlet方法以及其它组件的URL模式.
角色是指与用户相关联的名称.
J2EE应用程序的安全性通过将资源映射到角色来实现.
当资源被调用时,调用方必须提供已拥有访问该资源权限的角色名称.
如果调用方不能提供授权角色,那么调用将被拒绝.
在J2EE应用程序中,在允许调用方执行资源之前,应用程序服务器将会对调用方的角色进行检验.
角色和资源的授权组合在部署描述符中声明.
应用程序服务器从部署描述符中读取并应用这些授权组合,这也被称为声明性安全性.
下表描述为了确保J2EE应用程序安全性而需要执行的任务:声明角色.
指定允许访问资源的角色.
例如,假设您正在开发使用人力资源数据的web模块.
该模块的说明将指出哪些web资源是所有的雇员都可以访问,雇员可以用它们来维护人员信息;而哪些web资源只有人力资源办事员角色、人力资源管理角色、审核角色才能访问的等等.
然后声明代表这些类型用户的安全角色,并将web模块中的资源映射到这些角色.
EJB模块的安全性与此类似.
模块的说明中将列出不同类型的用户,并告诉您哪些类型的用户被获准使用企业bean方法返回的数据.
然后需要声明代表这些组用户的安全角色,并将模块中的EJB方法映射到合适的角色.
一般而言,在模块的属性表单上设置J2EE的安全性.
需要为模块声明一组角色,然后将模块资源映射到模块中声明过的角色集合.
100构建J2EE应用程序2003年10月当模块被组装成应用程序并部署后,您需要将在模块中声明的角色映射到应用程序服务器环境中的实际用户名称和组名称.
在J2EE应用程序的属性表单中,将角色映射到用户和组.
当应用程序部署到环境(如拥有声明过的用户和组的生产环境)时,需要执行该映射.
后续的几节将说明如何使用IDE来为web模块(EJB模块)设置安全性,以及在将模块组装到J2EE应用程序以后如何合并不同类的安全声明.
Web模块的安全性Web模块有多个属性编辑器和对话框用于声明安全角色并将其映射到web资源.
本节涵盖了这两个任务中的属性编辑器和对话框:为web模块声明安全角色定义需要确保其安全性的web资源,并将它们映射到安全角色.
每一个任务都在相应的节中说明.
为web模块声明安全角色要为web模块声明安全角色:1.
右键单击web模块的web节点,选择[属性]→[安全性]标签→[安全角色]→省略号(.
.
.
)按钮.
[安全角色]属性编辑器打开.
2.
单击[增加]按钮.
[增加安全角色]对话框打开.
3.
定义新的安全角色.
a.
在[角色名称]字段中,为新的安全角色输入名称.
b.
在[描述]字段中,为该角色输入简短描述.
当您需要合并同一应用程序中组装的各个模块的安全角色时,安全角色的描述就显得尤为有效.
当您将安全角色映射到应用程序服务器环境中的用户和组时,该描述也是十分有用的.
第7章安全性101c.
单击[确定]用于关闭对话框.
图7-1显示声明Me和EveryoneElse这两个角色以后的[安全角色属性]编辑器.
图7-1为web模块声明的安全角色Me和EveryoneElse4.
再次单击[确定]关闭属性编辑器.
定义web资源并将其映射到安全角色要定义web资源并设置安全性:1.
右键单击web模块的web节点,选择[属性]→[安全性]标签→[安全限制]→省略号(.
.
.
)按钮.
[安全限制]属性编辑器打开.
2.
单击[增加]按钮.
[增加安全限制]对话框打开.
3.
单击[增加安全限制]对话框上的[增加]按钮.
[增加web资源集合]对话框打开.
102构建J2EE应用程序2003年10月4.
定义web资源.
a.
在[资源名称]字段中,为资源输入名称.
b.
在[URL模式]字段中,输入URL模式.
URL模式必须在模块中预定义.
图7-2显示了将URL模式/allItems定义为web资源时显示的字段值.
该URL模式已被映射到servletAllItemsServlet.
图7-2中的值设置了执行AllItemsServlet所需的web资源.
要查看URL模式/allItems是如何被映射到servletAllItemsServlet的,请参阅第41页的"将URL映射到Servlet"和第44页的"设置JSP页面".
图7-2定义名为allItems的web资源注意,您可以定义web资源,使其应用到全体与URL模式相关联的HTTP方法或其中的一部分.
第7章安全性103c.
单击[确定]关闭此对话框,然后返回[增加安全限制]对话框.
图7-3显示了设置名为AllItems和ItemDetail两项web资源以后的[增加安全限制]对话框.
图7-3[增加安全限制]对话框中的allItems资源5.
通过指定访问资源的限制来确保资源的安全性.
a.
单击资源以选中它.
b.
使用[增加安全限制]对话框中的字段来描述访问资源的限制.
104构建J2EE应用程序2003年10月c.
要使用安全角色作为限制,请单击[应用授权限制]复选框,然后选择[角色]字段中的一个或多个角色.
在图7-4中,allItems资源已被选定,同时EveryoneElse角色也被选定.
这些选项指定allItems资源必须由EveryoneElse角色来调用.
使用其他角色的调用方将遭到拒绝.
图7-4为名为allItems的web资源指定限制d.
单击[确定]保存指定的限制,然后返回[安全限制]属性编辑器.
6.
再次单击[确定]保存刚才的操作,然后返回属性表单.
第7章安全性105Web模块的可编程安全性如果模块中的任何web组件需要使用可编程安全性,您需要将方法代码中的安全角色引用映射到模块属性表单中声明的安全角色.
使用可编程安全性特性的web组件包含直接访问调用方的凭证的代码,并在应用程序服务器运行声明性安全性机制之前就对其进行验证.
编码范例7-1显示了方法代码中的少数几行,该代码使用了名为roleRefMe的安全角色引用.
编码范例7-1使用roleRefMe安全角色引用的方法代码roleRefMe这样的安全角色引用是实际引用名称的占位符.
在模块级声明角色以前就已完成了代码的编写,然而那时实际角色名称仍是未知的.
组装模块时将声明安全角色引用,并将其映射到已声明的安全角色.
要声明安全角色引用并将其映射到安全角色:1.
右键单击web模块的web节点,选择[属性]→[部署]标签→[Servlet]→省略号(.
.
.
)按钮.
[Servlet]属性编辑器打开.
2.
选择包含安全角色引用的servlet,单击[编辑]按钮.
[编辑Servlet]对话框打开.
3.
单击[安全角色引用]字段,然后单击[增加].
[增加安全角色引用]对话框打开.
4.
声明安全角色引用,并将其映射到角色.
a.
在[角色引用名称]字段中,输入方法代码中使用的角色引用名称.
b.
在[角色引用链接]字段中,输入即将与角色引用名称相链接的现有安全角色名称.
c.
单击[确定]关闭此对话框,然后返回[编辑Servlet]对话框.
.
.
.
context.
isCallerInRole(roleRefMe);.
.
.
106构建J2EE应用程序2003年10月图7-5显示了[编辑Servlet]对话框.
名为roleRefMe的安全角色引用被映射到名为Me的角色.
图7-5映射到角色Me的名为roleRefMe的安全角色引用当执行方法代码时,会将角色引用映射到角色Me并测试调用方的凭证.
安全角色必须在执行此类映射之前在模块属性中声明.
第7章安全性107EJB模块的安全性EJB模块有多个属性编辑器和对话框用于声明安全角色并将其映射到企业bean方法.
本节涵盖了这两个任务中的属性编辑器和对话框:为EJB模块声明安全角色将企业bean方法映射到安全角色每一个任务都在相应的节中说明.
声明EJB模块安全角色为EJB模块声明安全角色:1.
右键单击EJB模块节点并选择[属性]→[安全角色]→省略号(.
.
.
)按钮.
[安全角色]属性编辑器打开.
2.
单击[增加]按钮.
[增加安全角色]对话框打开.
3.
输入定义角色的值.
a.
在[名称]字段中,输入角色名称.
b.
在[描述]字段中,输入对于该角色的描述.
当您需要合并同一应用程序中组装的各个模块的安全角色时,安全角色的描述就显得尤为有效.
当您将安全角色映射到部署环境中的用户和组时,该描述也是十分有用的.
108构建J2EE应用程序2003年10月c.
单击[确定].
[增加]对话框关闭,并返回到[安全角色]属性编辑器.
图7-6显示声明Me和EveryoneElse这两个角色以后的[安全角色]属性编辑器.
图7-6EJB模块的[安全角色]属性编辑器将安全角色映射到方法权限在为模块声明了安全角色以后,可以使用这些角色来限制模块中的企业bean方法的访问.
注–要映射已包含的EJB节点的安全角色,它们作为EJB模块中的子节点,代表了模块中的企业bean.
第7章安全性109要将安全角色映射到方法权限:右键单击已包含的EJB节点并选择[属性]→[方法权限]→省略号(.
.
.
)按钮.
[方法权限]属性编辑器打开.
[方法权限]属性编辑器是一个表,其中的行是企业bean方法,列是模块中声明过的安全角色.
图7-7显示了CatalogManagerBean的属性编辑器.
在CatalogDataEJB模块中声明的两个安全角色EveryoneElse和Me分别以列的形式表示.
图7-7EJB[方法权限]属性编辑器110构建J2EE应用程序2003年10月可以有许多不同的方法来使用[方法权限]属性编辑器.
上端面板中的按钮允许全局应用权限.
您可以允许任何用户调用方法或禁止一切访问.
如果选择[为所有方法访问设置角色],将能获得更精确地控制.
您可以使用按钮下方的小表,从模块中已声明的角色中进行选择.
如果选定某一列,则表示相应的角色将被允许执行所有的企业bean方法.
在图7-7中EveryoneElse列被选定,这样,使用这一角色的用户可以执行任何的企业bean方法.
Me列未被选定,这样,具有Me角色的用户将无法执行所有的企业bean方法.
使用下方的表能够获取最精确的控制.
单击某行,这样就可以只定义一种方法的权限.
为某一方法设置权限与为编辑器中的其他方法设置权限是完全独立的.
例如,您可以单击第二行的getAllItems方法,并将[访问]字段设置为[所有用户].
这样任何角色都可以执行getAllItems方法.
然后您可以单击代表另一个方法的行,将其[访问]字段设置为[设置角色],并为选定的方法单独设置角色.
表下方的按钮为在表中进行编辑提供了多种快捷方式.
EJB模块的可编程安全性如果模块中的任何企业bean使用可编程安全性,您就需要将方法代码中的安全角色引用映射到EJB模块属性表单中声明的安全角色.
使用可编程安全性特性的企业bean包含直接访问调用方的凭证的代码,并在应用程序服务器运行声明性安全性机制之前就对其进行验证.
编码范例7-2显示了方法代码中的少数几行,该代码使用了名为everyOne的安全角色引用.
编码范例7-2使用everyOne安全角色引用的方法代码安全角色引用是实际引用名称的占位符.
在模块级声明角色以前就已完成了代码的编写,然而那时实际角色名称仍是未知的.
组装模块时将声明安全角色引用,并将其映射到已声明的安全角色.
要声明安全角色引用并将其映射到安全角色:1.
右键单击EJB逻辑节点,选择[属性]→[引用]标签→[安全角色引用]→省略号(.
.
.
)按钮.
[安全角色引用]属性编辑器打开.
2.
单击[增加]按钮.
[增加安全角色]对话框打开.
.
.
.
context.
isCallerInRole(roleRefMe);.
.
.
第7章安全性1113.
声明安全角色引用,并将其链接到安全角色:a.
在[名称]字段中,输入方法代码中使用的安全角色引用名称.
b.
在[安全角色链接]字段中,输入安全角色名称.
也可以选择将该字段保留为空白,这样引用处于已声明但未链接的状态.
c.
单击[确定].
[增加安全角色]对话框将关闭,并返回[安全角色引用]属性编辑器.
图7-8中显示的[安全角色引用]属性编辑器包含有编码范例7-2中使用的名为everyOne的安全角色引用.
这一角色尚未链接.
图7-8声明的安全角色引用everyOne在本方案中,在EJB模块的[安全角色]属性编辑器中链接everyOne安全角色引用.
当企业bean组装到EJB模块中时就要执行该映射.
112构建J2EE应用程序2003年10月要在EJB模块的[安全角色引用]属性编辑器中链接安全角色引用:1.
右键单击EJB模块节点并选择[属性]→[安全角色引用]→省略号(.
.
.
)按钮.
[安全角色引用]属性编辑器打开.
2.
评估模块中的引用.
EJB模块的[安全角色引用]属性编辑器显示了模块中的所有安全角色引用以及它们的链接状态.
在图7-9中,everyOne引用处于未链接的状态.
图7-9EJB模块属性编辑器中的everyOne安全角色引用3.
链接未链接的角色.
a.
单击引用以选定它.
b.
在[安全角色链接]字段中,选择合适的安全角色.
c.
单击[确定].
第7章安全性113图7-10显示了EJB模块的[安全角色引用]属性编辑器,名为everyOne的安全角色引用被映射到名为EveryoneElse的安全角色.
图7-10EJB模块的[安全角色引用]属性编辑器114构建J2EE应用程序2003年10月J2EE应用程序的安全性在组装J2EE应用程序时,需要决定该程序是否有安全性.
请注意下列情况:如果应用程序中有一个或多个模块没有定义安全角色,就需要在模块级别定义安全角色.
请参阅第100页的"Web模块的安全性"和第107页的"EJB模块的安全性".
如果模块有安全性,在不同的模块中可能含有类似的角色,但其名称不同.
如果有这样的情况存在,需要在J2EE应用程序的属性表单中将所有等价的角色映射到同一个角色.
要在J2EE应用程序级别映射安全角色:右键单击应用程序节点并选择[属性]→[安全角色]→省略号(.
.
.
)按钮.
这时将打开J2EE应用程序的[安全角色]属性编辑器.
图7-11中显示了此编辑器以及模块中定义的安全角色.
图7-11J2EE应用程序[安全角色]属性编辑器中的安全角色其中前两行显示的是模块中声明的安全角色.
每一个角色都通过其所在模块以及角色名称来标识.
每一个模块级安全角色都被映射到缺省的应用程序级角色.
应用程序级角色具有与模块级角色相同的名称.
应用程序级角色显示在[等价于]列中.
例如,编辑器中显示的第一个安全角色是CatalogData模块中的EveryoneElse.
该角色被映射到名为EveryoneElse的应用程序级角色.
图7-11中显示了安全角色映射的差异.
CatalogWebModule有一个名为myself的角色,而CatalogData模块有一个名为Me的角色.
这些角色是等价的,因而最好只使用一个应用程序级角色.
第7章安全性115在图7-12中,这种差异可以通过将角色myself重新映射到角色Me来解决.
图7-12名为myself的角色被映射到名为Me的角色模块级角色Me和myself现在被映射到同一个名为Me的应用程序级角色.
您也可以在应用程序级创建一个全新的角色,然后将多个模块级角色映射到它.
假设在应用程序的某模块中有一个名为sa的角色以及另一个名为sadmin的角色.
您想要通过建立一个名为sysadmin的应用程序级角色来解决这一命名上的差别.
要实现这一想法,可以单击[编辑应用程序角色]并声明一个名为sysadmin的新的应用程序级角色.
在完成sysadmin角色的声明以后,返回[安全角色]属性编辑器.
通过单击两个模块级角色的[等价于]列,可以对其执行重新映射操作.
这样将会显示应用程序级角色,选择sysadmin角色.
116构建J2EE应用程序2003年10月117第8章部署并执行J2EE模块和应用程序IDE部署和执行特性支持企业应用程序的重复开发.
您可以开发、组装、部署以及执行应用程序而不必离开IDE.
执行应用程序之后,您可以修改源代码或属性,重新部署并且再次执行该应用程序.
除非测试暴露出组装中存在的问题,否则在重新部署前不必重新组装该应用程序.
本章描述了从IDE内部中部署并且执行已组装的应用程序的基本知识.
服务器的可视化表示要将应用程序部署到应用程序服务器,您需要与应用程序服务器进行交互.
为了简化与应用程序服务器的交互,IDE将应用程序服务器表示为资源管理器窗口中的节点.
和其它资源管理器窗口节点一样,应用程序服务器节点也有属性表单和菜单命令.
您可以使用这些属性表单和菜单命令从IDE内部来部署并且执行应用程序.
此外取决于使用的应用程序服务器产品,您还可以管理应用程序服务器.
本节标识并且描述了服务器节点,此外也描述了使用这些节点所执行的基本任务.
118构建J2EE应用程序2003年10月服务器注册节点图8-1显示资源管理器的[运行环境]标签以及用来对服务器进行配置、部署及执行的节点.
顶层节点是[服务器注册]节点.
该节点将其它与服务器相关的节点分组,而自身没有任何命令或属性.
图8-1服务器注册节点图8-1中的[服务器注册]来自于MicrosoftWindows平台上的IDE安装.
该特定安装是用户使用管理或超级用户特权进行的独立安装.
系统管理员为没有管理特权的用户安装IDE时,节点显示的主机名和端口号是不一样的.
主机名和端口号在多用户安装中也不一样.
想要了解不同安装选项的完整描述,请参阅SunONEStudio5,StandardEditionGettingStartedGuide.
第8章部署并执行J2EE模块和应用程序119已安装的服务器节点已安装的服务器节点将服务器产品节点分组,它自身没有任何命令或属性.
在图8-1中已安装的服务器节点具有表示两个服务器产品的子节点,这两个产品包括在IDE、SunONE应用程序服务器及Tomcatweb服务器的大多数安装中.
服务器产品节点已安装服务器节点下面是表示特定web及应用程序服务器产品的节点.
每个服务器产品节点表示一个已安装的IDE服务器插件.
服务器产品节点具有上下文菜单和属性表单,每个服务器产品节点的能力由服务器产品和插件模块决定.
不同服务器产品的过程是不同的,但是通常情况下,要使用应用程序服务器,您需要配置合适的服务器节点来识别服务器产品特定的安装.
此外也可以使用服务器产品节点来创建服务器实例.
在图8-1中已安装的服务器节点具有表示两个插件的子节点,这两个产品包括在IDE、SunONE应用程序服务器及Tomcatweb服务器的大多数安装中.
下一节描述了SunONE应用程序服务器7节点及其子节点.
关于设置其它应用程序服务器产品和IDE一起工作的信息,请参阅SunONEStudio4,EnterpriseEditionforJavaGettingStartedGuide.
SunONE应用程序服务器节点本节标识并描述在资源管理器中表示SunONE应用程序服务器的节点.
SunONE应用程序服务器7节点SunONE应用程序7服务器节点用于管理应用程序服务器.
安装IDE以创建应用程序服务器域,同时创建管理应用程序服务器域的管理服务器实例.
在大多数情况下,您可以在已安装的应用程序服务器域及管理服务器中完成所有工作.
您可以在安装IDE所创建的应用程序服务器域中部署并执行应用程序.
您可以使用安装IDE所创建的管理服务器实例来管理该域.
在图8-1中显示的[服务器注册]包含了安装IDE所创建的应用程序服务器域及管理服务器.
管理服务器实例由标为localhost:4848的SunONE应用程序服务器7节点下的节点表示.
您可以打开管理服务器的属性表单来查看应用程序服务器域名.
如果需要并且有超级用户或管理特权,您可以使用SunONE应用程序服务器7节点来创建附加的应用程序服务器域和管理服务器.
120构建J2EE应用程序2003年10月管理服务器节点SunONE应用程序服务器7节点的下面是管理服务器节点.
在图8-1中,管理服务器节点标为localhost:4848.
管理服务器节点表示SunONE应用程序服务器管理服务器的实例.
每个管理服务器实例都管理应用程序服务器域.
使用SunONE应用程序服务器安装IDE并且管理SunONE应用程序服务器来创建应用程序服务器域和管理服务器实例.
所使用的安装类型决定了如何创建应用程序服务器域和服务器实例.
各种可能性将在下表中进行描述:如果使用超级用户或管理员特权来安装IDE,此安装将会创建初始服务器域及管理服务器实例.
图8-1显示了安装进程所创建的服务器域及管理服务器实例.
如果您有标准用户特权,那么系统管理员将会创建服务器域及管理服务器实例供您使用.
您可以使用管理服务器节点来管理域.
管理服务器节点显示的主机名是应用程序服务器运行所在的机器的名称.
图8-1显示了独立的、单用户安装并且应用程序服务器在本地主机上运行.
在多用户安装中,应用程序服务器可在其它机器上运行.
管理服务器显示的端口号是与管理服务器通讯的端口号.
创建应用程序服务器域及管理服务器实例时才设置此端口号.
图8-1显示了在MicrosoftWindows平台上单用户安装的缺省端口号.
使用管理服务器节点执行的某些任务是在管理服务器控制的服务器域中启动及停止服务器实例.
要启动管理服务器和服务器实例:1.
右键单击[管理服务器]节点然后选择[启动].
进度监视器窗口打开.
管理服务器启动时,进度管理器关闭.
IDE在管理服务器节点下显示服务器实例节点.
2.
右键单击服务器实例节点然后选择[状态].
[状态]对话框打开,其中的[状态]字段显示服务器实例的状态已停止.
3.
单击[启动服务器].
[状态]对话框显示消息以告诉您它正在启动应用程序服务器实例.
服务器实例启动时,[状态]字段显示为正在运行.
4.
单击[关闭].
服务器实例已可使用.
上下文菜单列出使用管理服务器节点执行的其它任务.
第8章部署并执行J2EE模块和应用程序121服务器实例节点在管理服务器节点以下是应用程序服务器实例节点.
在图8-1中,应用程序服务器实例节点标为server1(localhost:81).
应用程序服务器实例节点表示服务器实例.
部署模块或应用程序时,您将其部署到特定的服务器实例.
在部署并且执行之前必须有服务器实例节点,并且该节点所表示的实例必须正在运行.
图8-1显示了安装IDE所创建的服务器实例.
您也可以通过管理应用程序服务器域来创建服务器实例.
注册的资源节点服务器实例节点以下是表示命名资源的节点集,命名资源可以被服务器实例中运行的应用程序使用.
图8-1显示了由本书中方案使用并且创建的资源的节点:在标为[已注册的JDBC连接池]、[已注册的JDBCDataSource]及[已注册的持久性管理器]的节点以下是表示已安装的PointBase数据库(命名为sample)的节点.
这些资源在安装IDE时预配置.
在其中一个方案中,CatalogDataEJB模块配置为通过输入资源的名称来使用PointBasesample数据库.
关于配置CatalogDataEJB模块的过程,请参阅第60页的"指定实体企业bean的数据源".
在标为[已注册JMS资源]的节点以下是表示本手册方案中所创建的队列及队列连接工厂资源的节点.
关于创建及注册这些资源的过程,请参阅第81页的"设置应用程序服务器".
关于使用这些资源来配置应用程序的过程,请参阅第83页的"Web模块编程"及第90页的"EJB模块编程".
已部署的应用程序节点在已注册资源节点下面是表示部署到服务器实例的模块及应用程序的节点集.
图8-1显示了命名为CatalogApp的应用程序的节点.
本手册中的方案包含了CatalogApp的编程及部署.
关于部署CatalogApp的过程,请参阅第69页的"创建J2EE应用程序".
未注册的资源节点在已部署的应用程序节点下是表示未注册的服务器资源的节点集.
这些节点是管理服务器节点的子节点并且表示了服务器实例还没有注册的资源.
这些节点具有用来创建并且注册新资源的菜单命令.
本书中的方案使用[未注册的JMS资源]节点来创建队列及队列连接工厂.
关于创建资源的过程,请参阅第81页的"设置应用程序服务器".
122构建J2EE应用程序2003年10月缺省服务器节点这些节点表示目前被指定为缺省服务器实例的服务器实例.
部署应用程序时,除非在应用程序属性表单中另外指定,它将被部署到缺省的服务器实例.
在图8-1中,缺省节点显示J2EE应用程序的缺省服务器是SunONE应用程序服务器.
要使服务器实例成为缺省的服务器:右键单击服务器实例节点然后选择[成为缺省设置].
特定服务器属性您所使用的模块及应用程序具有属性表单,可以使用属性表单来标识模块及应用程序需要应用程序服务器提供的那些服务.
很多属性表单具有特定服务器标签.
特定服务器标签列出了为特定服务器产品定义的属性.
例如,图8-2显示了CatalogDataEJB模块的属性表单.
[SunONEAS]标签被选定.
此标签具有CMP资源属性,您可以使用该属性来为CatalogData模块中的CMP实体标识数据源.
注意,在图8-2(jdo/PointbasePM)中命名的数据源在图8-1中作为SunONE应用程序服务器实例的已注册持久性管理器出现.
图8-2EJB模块的SunONEAS标签第8章部署并执行J2EE模块和应用程序123使用服务器实例节点来部署并执行本节将简单介绍从IDE内部部署并且执行J2EE应用程序的过程.
要部署并且执行应用程序:1.
从组装的J2EE应用程序开始,查看组装完整性的应用程序.
2.
选择应用程序服务器实例.
该应用程序节点具有[应用程序服务器]属性.
[应用程序服务器]属性的初始化设置是缺省应用程序服务器.
如果继续该设置,IDE就将应用程序部署到目前指定为J2EE应用程序的缺省服务器的服务器实例.
您也可以为本属性打开属性编辑器并且按名称来选择服务器实例.
属性编辑器是一个浏览器对话框,使您能够查看服务器注册中的所有服务器实例并且选择其中之一.
3.
右键单击应用程序节点然后选择[执行]命令来部署并且执行应用程序.
这将启动部署进程,请在输出窗口中监视进程.
部署完成时,IDE将在应用程序服务器环境中执行应用程序.
您所看到的内容取决于应用程序,例如,如果应用程序包含web模块,那么应用程序服务器将启动web浏览器并且打开应用程序的欢迎页.
4.
您也可以使用独立步骤来部署并且执行应用程序.
右键单击应用程序然后选择[部署]命令.
部署完成时,您自己就可以执行应用程序.
例如,如果应用程序包含web模块,那么您就可以在IDE以外启动web浏览器并且打开应用程序的欢迎页.
124构建J2EE应用程序2003年10月125附录AIDE如何支持J2EE模块及应用程序的部署本附录将简要描述服务器插件.
服务器插件是IDE用来部署并且执行J2EE模块和应用程序的机制,该插件提供以下IDE功能:服务器产品节点以及它们的子节点特定服务器属性表单部署及执行菜单命令本附录主要说明部署及执行菜单命令,它描述了部署应用程序所需的处理并且解释插件如何执行该处理.
如果您了解部署工具的工作原理,那么您就可以有效地使用它.
使用部署工具的过程包含在本书的许多方案中.
部署进程部署是将模块或应用程序的可执行窗体发送到J2EE应用程序服务器的过程.
发送到服务器的可执行窗体作为包含构成模块或应用程序的源文件编译版本的归档,描述归档内容和组织的部署描述符与编译文件在一起.
归档文件安装在应用程序服务器管理的目录下.
执行模块或应用程序时,应用程序服务器在其控制的进程中执行应用程序已安装的副本,该进程提供所需的运行环境.
要想部署成功,应用程序源文件必须以与特定的应用程序服务器产品相兼容的方式进行编译.
部署描述符必须包括特定的应用程序服务器产品所需的所有信息.
这些要求通过为产品标识目标应用程序服务器、编译源文件以及为目标应用程序服务器生成特定的部署描述符来满足.
126构建J2EE应用程序2003年10月服务器插件概念由于要让IDE能够部署多种web及应用程序服务器,所以才有了服务器插件的概念.
插件是管理IDE与特定的服务器产品之间交互操作的IDE模块.
部署应用程序时,您需要选择它将要部署到的服务器.
IDE使用合适的插件来处理[部署]命令,这使得插件能够为服务器部署工具生成合适的命令并且在其传送到服务器的文件中包括合适的特定服务器部署描述符.
这一部分如图A-1所示.
图A-1服务器插件使得IDE能够与J2EE运行环境通讯插件为部署应用程序的应用程序开发人员提供:插件在IDE资源管理器窗口中的可视化表示.
每一个插件都由一个服务器产品节点表示.
关于服务器产品节点显示及使用的更多信息,请参阅第119页的"服务器产品节点".
运行服务器实例作为服务器产品节点的子节点的可视化表示.
您可以选择任何在资源管理器窗口中表示的服务器实例作为部署目标.
关于服务器实例节点显示及使用的更多信息,请参阅第121页的"服务器实例节点".
组件、模块及属性表单上的特定服务器标签这些标签显示了服务器产品所需的非标准属性并且提示开发人员服务器产品所需的值.
处理特定于选定服务器[部署]命令的机制.
该处理将在下一节中详细描述.
插件1服务器1插件2服务器2附录AIDE如何支持J2EE模块及应用程序的部署127使用插件的部署过程本节总结了部署并执行应用程序时插件所执行的处理.
1.
组装应用程序.
使用属性表单来提供服务器所需的J2EE标准部署描述符元素及非标准元素.
2.
组装完应用程序之后,指定目标服务器实例.
3.
选择IDE的[部署]命令开始部署过程.
4.
IDE标识为应用程序创建WAR或EAR文件所需的所有文件.
这其中包括在部署描述符中标识的J2EE组件以及那些文件所使用的Java类或静态资源.
IDE标识组件中所有的文件相关性.
5.
IDE标识应用程序正被部署到的服务器产品.
6.
插件为WAR或EAR文件验证文件.
7.
IDE为应用程序生成WAR或EAR文件.
这其中包括J2EE部署描述符、具有特定服务器部署标记的独立文件以及任何远程方法调用所需的桩模块或骨架类.
8.
插件将WAR或EAR文件传送到服务器.
插件可以自动清除同一应用程序的早期部署,或者试图解决与已经部署到服务器实例的应用程序发生的冲突,这些操作取决于服务器产品.
9.
服务器根据自己的标准来接管、读取部署描述符及特定服务器部署文件,并且部署WAR或EAR文件.
该过程完成时,IDE将自动启动web浏览器并且打开应用程序欢迎页.
如果选择分别进行部署与执行,那么您可以启动web浏览器以及某一应用程序web页.
部署除web模块及J2EE应用程序外的组件Web模块和J2EE应用程序是实际上唯一能够部署到服务器并且执行的项.
但是,您可能想要测试所开发的商业逻辑的较小单元.
SunONEStudio5IDE可以部署并执行商业逻辑的较小单元,做法是为想要测试的组件自动生成模块及应用程序.
它也可以为组件的某些类型生成测试客户端.
关于这些功能的更多信息,请参阅《构建Web组件》和《构建EnterpriseJavaBeans组件》.
128构建J2EE应用程序2003年10月129索引A安全角色对于EJB模块,107,110,112对于web模块,100映射到web资源,102映射到安全角色引用,106与EJB方法权限,108,110,111安全角色引用映射到安全角色,106用于业务逻辑,105安全性对于web模块中的web资源,100对于企业bean方法,109Bbean管理持久性所需的代码,62指定数据库,62本地EJB引用引用声明,57本地接口创建,55和已生成的测试客户端,55JNDI查找,55与远程接口相比,55本地引用JNDI查找,56标记库在web模块中的形式,26部署部署描述符的使用,27过程,28SunONEStudio机制,125部署描述符对于EJB模块,26,27对于web模块,26,27环境条目引用,47J2EE应用程序,27,69,70其目的,17其中的EJB引用,38是XML文件,18用于标识外部资源,23用于请求应用程序服务器服务,19,25由IDE生成,18,21,24,25,27由属性表单表示,27在部署过程中,18,27,28部署描述符中的XML,18C测试客户端需要远程接口,55重复开发,117错误页面为web模块设置,44130构建J2EE应用程序2003年10月D队列创建,82调用方法,84读取消息,90资源环境引用,83作为应用程序服务器资源,81队列连接工厂调用方法,84使用定制设置,83使用缺省设置,83资源环境引用,83作为应用程序服务器资源,81EEJB模块部署描述符,27创建,58将企业bean增加到其中,60节点,58模块节点与源代码的关系,26内部设计,52属性,58在文件系统中定位,58在资源管理器窗口中,26增加到J2EE应用程序,71EJB引用本地,56本地接口,55对于EJB模块,55远程接口,36在Web模块中,38在Web组件中,38在模块级链接,39在模块级未链接,39在应用程序级链接,72额外文件,65F方法权限使用安全角色,109服务器插件管理IDE与服务器之间的交互操作,126由服务器产品节点表示,119服务器产品节点配置,119与服务器插件的关系,119在资源管理器窗口中,119服务器注册在资源管理器窗口中,118H环境条目覆盖,75引用,47在模块属性表单上设置,47欢迎文件缺省名称,35欢迎页面作为web站点的主页,33会话通过会话企业bean管理,52JJ2EE应用程序部署,28,117,123部署描述符,27,69创建,69将模块增加到,71节点,25,69节点与源代码的关系,27可视化表示,25设置web上下文,71是分布式的,22使用外部资源,23属性,69由部署描述符定义,17由模块组成,17在文件系统中定位,69在资源管理器窗口中,27指定应用程序服务器,123执行,29,123组装,69Javadoc,在IDE中使用,14JNDI查找本地接口,55队列,84队列连接工厂,84索引131EJB本地引用,56环境条目引用,48示例,56用于EJB远程引用,36,38资源引用,62JNDI名称队列,81队列连接工厂,81分配到数据源,60,61,64数据源,61JSP页面URL,45在web模块中的形式,26执行,45节点表示已安装的应用程序服务器,119对于EJB模块,26,58对于web模块,25EJB模块中的企业bean,26J2EE应用程序,69逻辑,26Web组件,26应用程序服务器,117在EJB模块中的企业bean,58在J2EE应用程序中的模块,69M模块部署描述符,18节点,25由部署描述符定义,17由组件组成,17在J2EE应用程序中,25在其中交互,22Q企业bean引用在模块属性表单中链接,39在应用程序属性表单中链接,72R容器管理事务由事务属性进行定义,19,93,96在运行环境,21SServlet,41对企业bean进行远程调用,36更改缺省URL,43缺省URL,42缺省URL映射,42替换URL映射,42用URL执行,35由IDEservlet模板创建,36在web模块中的形式,26SunONE应用程序服务器创建服务器实例,120服务器产品节点,119缺省URL路径,41缺省实例,121与IDE一起安装,61上下文根属性,41,71实体企业bean用于访问数据源,52,54指定数据源,62事务容器管理,19事务边界缺省,93由[事务属性]属性定义,96由[事务属性]属性控制,93在部署描述符中,19重定义,95,96事务属性缺省值,94设置,93,96在部署描述符中,19事务属性的属性,19数据库bean管理持久性,62设置为数据源资源,61,64132构建J2EE应用程序2003年10月使用实体企业bean访问,54通过实体企业bean建模,52通过应用程序服务器访问,60与IDE一起安装的PointBase,61,64指定,60资源引用,61数据源定义为数据源资源的数据库,60指定,62属性标准,27EJB模块,58,93J2EE应用程序,69特定服务器,27,58,69,122映射到部署描述符标记,25属性编辑器,27属性表单表示部署描述符标记,27节点,25T特定服务器属性,27,58,69UURL更改servlet的URL,43欢迎页面,33JSP页面,45内嵌在HTML链接中,35Servlet的缺省URL,42数据库,60Web资源,41,71在HTML链接中,35URL模式编辑,42JSP页面,45内嵌在HTML链接中,35缺省值,42用于定义web资源,102在web资源的URL中,41,71在整个URL路径中,41作为web上下文的限定符,41Wweb服务器创建实例,120特定服务器属性,122在资源管理器窗口中,119Web模块部署描述符,27处理HTTP请求,32返回HTML输出,32目录结构,26设置web上下文,71设置错误页面,44使用EJB引用,36在资源管理器窗口中,26在资源管理器窗口中安装,25增加到J2EE应用程序,71作为J2EE应用程序的前端,32web上下文放置在URL路径中,41为J2EE应用程序设置,71为web模块设置,41,71在web资源的URL中,41,71web资源定义,102映射到安全角色,104web.
xml节点,25WEB-INF节点,25XXML标记通过IDE自动写入,21用于容器管理事务,19相关性EJB,65模块,71通过IDE识别,60,65详细资料类定义,54消息创建,84发送,84消息驱动企业bean配置为队列用户,90索引133Y已安装的服务器节点,119引用环境条目,47数据库的资源引用,60引用声明本地EJB引用,57远程EJB引用,38应用程序服务器创建实例,120从IDE内部进行管理,117访问数据库,60将数据库设置为服务器资源,60,61,64特定服务器属性,122提供的运行环境服务,19为应用程序指定,123由节点表示,117与环境条目,47与事务,93在IDE的服务器注册中,118在资源管理器窗口中,119用URL执行,41Z执行过程,29在IDE中,29主页,33资源引用EJB模块属性设置,63JNDI查找,62指定数据库,60134构建J2EE应用程序2003年10月

HostKvm($4.25/月),俄罗斯CN2带宽大升级,俄罗斯/香港高防限量5折优惠进行中

HostKvm是一家成立于2013年的国外VPS服务商,产品基于KVM架构,数据中心包括日本、新加坡、韩国、美国、俄罗斯、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。本月,商家旗下俄罗斯、新加坡、美国、香港等节点带宽进行了大幅度升级,俄罗斯机房国内电信/联通直连,CN2线路,150Mbps(原来30Mbps)带宽起,目前俄罗斯和香港高防节点5折骨折码继续优惠中...

华纳云CN2高防1810M带宽独享,三网直cn218元/月,2M带宽;独服/高防6折购

华纳云怎么样?华纳云是香港老牌的IDC服务商,成立于2015年,主要提供中国香港/美国节点的服务器及网络安全产品、比如,香港服务器、香港云服务器、香港高防服务器、香港高防IP、美国云服务器、机柜出租以及云虚拟主机等。以极速 BGP 冗余网络、CN2 GIA 回国专线以及多年技能经验,帮助全球数十万家企业实现业务转型攀升。华纳云针对618返场活动,华纳云推出一系列热销产品活动,香港云服务器低至3折,...

IonSwitch:$1.75/月KVM-1GB/10G SSD/1TB/爱达荷州

IonSwitch是一家2016年成立的国外VPS主机商,部落上一次分享的信息还停留在2019年,主机商提供基于KVM架构的VPS产品,数据中心之前在美国西雅图,目前是美国爱达荷州科德阿伦(美国西北部,西接华盛顿州和俄勒冈州),为新建的自营数据中心。商家针对新数据中心运行及4号独立日提供了一个5折优惠码,优惠后最低1GB内存套餐每月仅1.75美元起。下面列出部分套餐配置信息。CPU:1core内存...

查看源代码为你推荐
站酷zcool站酷zcool字体下载后怎么安装到PS中Baby被问婚变绯闻黄晓明baby一起出来带娃,想要打破离婚传闻?funnymudpee京东的显卡什么时候能降回正常价格啊,想买个1060西部妈妈网九芽妈妈网加盟费多少刘祚天DJ这个职业怎么样?psbc.com邮政储蓄卡如何激活百花百游迎得春来非自足,百花千卉共芬芳什么意思hao.rising.cn我一打开网页就是瑞星安全网站导航,怎么修改?铂金血痕身上血痕怎么回事莱姿蔓蕊姿蔓是什么样的牌子来的
edgecast pw域名 lighttpd gspeed 刀片服务器的优势 183是联通还是移动 699美元 息壤代理 卡巴斯基破解版 如何注册阿里云邮箱 国外ip加速器 drupal安装 lamp的音标 摩尔庄园注册 阿里dns 双十二促销 tracker服务器 winserver2008 cdn加速技术 在线tracert 更多