ejb3.0笔记和示例代码对应

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章基础知识学习3.1EnterpriceJavaBeans(EJB)的概念EnterpriceJavaBeans是一个用于分布式业务应用的标准服务端组件模型。采用EnterpriceJavaBeans架构编写的应用是可伸的、事务性的、多用户安全的。可以一次编写这些应用,然后部署在任何支持EnterpriceJavaBeans规范的服务器平台,如jboss、weblogic。EnterpriseJavaBean(EJB)定义了三种企业Bean,分别是会话Bean(SessionBean),实体Bean(EntityBean)和消息驱动Bean(MessageDrivenBean)。SessionBean:SessionBean用于实现业务逻辑,它分为有状态bean和无状态bean。每当客户端请求时,容器就会选择一个SessionBean来为客户端服务。SessionBean可以直接访问数据库,但更多时候,它会通过EntityBean实现数据访问。下图展示了SessionBean通过EntityBean往数据库插入一条记录。实体Bean:从名字上我们就能猜到,实体bean代表真实物体的数据,在JDBC+JavaBean编程中,通常把JDBC查询的结果信息存入JavaBean,然后供后面程序进行处理。在这里你可以把实体Bean看作是用来存放数据的JavaBean。但比普通JavaBean多了一个功能,实体bean除了担负起存放数据的角色,还要负责跟数据库表进行对象与关系映射(O/RMapping),下图就说明了这一映射:消息驱动Bean(MDB):是设计用来专门处理基于消息请求的组件。它能够收发异步JMS消息,并能够轻易地与其他EJB交互。它特别适合用于当一个业务执行的时间很长,而执行结果无需实时向用户反馈的这样一个场合。3.3如何进行EJB打包要发布EJB时必须把她打成*.jar文件,一个EJB打包后的目录结构如下:EJB应用根目录|--com(你的.class文件)|--META-INF|--MANIFEST.MF(如果使用工具打包,该文件由工具自动生成)第四章会话Bean(SessionBean)SessionBean用于实现业务逻辑,它分为有状态bean和无状态bean。每当客户端请求时,容器就会选择一个SessionBean来为客户端服务。SessionBean可以直接访问数据库,但更多时候,它会通过EntityBean实现数据访问。SessionBean作为业务处理对象出现在各种应用体系结构中,下面是本教程HelloWorld的应用结构:因为客户端需要通过JNDI查找EJB,那么JNDI是什么?JNDI(TheJavaNamingandDirectoryInterface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI提供的接口,能够通过名字定位用户、机器、网络、对象服务等。命名服务:就像DNS一样,通过命名服务器提供服务,大部分的J2EE服务器都含有命名服务器。目录服务:一种简化的RDBMS系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软ACTIVEDIRECTORY等。JNDI的好处:(1)包含大量命名和目录服务,可以使用相同API调用访问任何命名或目录服务。(2)可以同时连接多个命名和目录服务。(3)允许把名称同JAVA对象或资源关联起来,不必知道对象或资源的物理ID。(4)使用通用接口访问不同种类的目录服务(5)使得开发人员能够集中使用和实现一种类型的命名或目录服务客户API上。什么是上下文:由0或多个绑定构成。比如java/MySql,java为上下文(context),MySql为命名什么是子上下文(subConext),上下文下的上下文。比如MyJNDITree/ejb/helloBean,ejb为子上下文。JNDI编程过程因为JNDI是一组接口,所以我们只需根据接口规范编程就可以。要通过JNDI进行资源访问,我们必须设置初始化上下文的参数,主要是设置JNDI驱动的类名(java.naming.factory.initial)和提供命名服务的URL(java.naming.provider.url)。因为Jndi的实现产品有很多。所以java.naming.factory.initial的值因提供JNDI服务器的不同而不同,java.naming.provider.url的值包括提供命名服务的主机地址和端口号。下面是访问Jboss服务器的例子代码:Propertiesprops=newProperties();props.setProperty(java.naming.factory.initial,org.jnp.interfaces.NamingContextFactory);props.setProperty(java.naming.provider.url,localhost:1099);InitialContext=newInitialContext(props);HelloWorldhelloworld=(HelloWorld)ctx.lookup(HelloWorldBean/remote);JBOSS环境下JNDI树的命名约定:(1)java:copm这个上下文环境和其子上下文环境仅能被与之相关的特定应用组件访问和使用(2)java:子上下文环境和绑定的对象只能被Jboss服务器虚拟机内的应用访问(3)其他上下文环境只要实现序列化就可以被远程用户调用。4.1StatelessSessionBeans(无状态bean)开发无状态会话Bean主要用来实现单次使用的服务,该服务能被启用许多次,但是由于无状态会话Bean并不保留任何有关状态的信息,其效果是每次调用提供单独的使用。在很多情况下,无状态会话Bean提供可重用的单次使用服务。尽管无状态会话Bean并不为特定的客户维持会话状态,但会有一个以其成员变量形式表示的过度状态。当一个客户调用无状态会话Bean的方法时,Bean的成员变量的值只表示调用期间的一个过度状态。当该方法完成时,这个状态不再保留。除了在方法调用期间,所有的无状态会话Bean的实例都是相同的,允许EJB容器给任何一个客户赋予一个实例。许多应用服务器利用这个特点,共享无状态会话Bean以获得更好的性能。由于无状态会话Bean能够支持多个客户,并且通常在EJB容器中共享,可以为需要大量客户的应用提供更好的扩充能力。无状态会话Bean比有状态会话Bean更具优势的是其性能,在条件允许的情况下开发人员应该首先考虑使用无状态会话Bean。4.1.1开发只存在Remote接口的无状态SessionBean步骤如下:第一步:要定义一个会话Bean,首先需要定义一个包含他所有业务方法的接口。这个接口不需要任何注释,就像普通的java接口那样定义。调用EJB的客户端通过使用这个接口引用从EJB容器得到的会话Bean对象stub。接口的定义如下:HelloWorld.java//author:lihuomingpackagecom.foshanshop.ejb3;publicinterfaceHelloWorld{publicStringSayHello(Stringname);}第二步:实现上面的接口并加入两个注释@Stateless,@Remote,第一个注释定义这是一个无状态会话Bean,第二个注释指明这个无状态Bean的remote接口。在使用这两个注释时需要使用一些EJB的类包,这些类包都可以在jboss安装目录的client,/server/default/deploy/jboss-aop-jdk50.deployer,/server/default/deploy/ejb3.deployer,/lib/endorsed等文件夹下找到,或者在源代码的Lib文件夹下获得(下载地址:)。经过上面的步骤一个只存在Remote接口的无状态会话Bean就开发完成。无状态会话Bean是一个简单的POJO(纯粹的面向对象思想的java对象),EJB3.0容器自动地实例化及管理这个Bean。下面是HelloWorld会话Bean的实现代码:HelloWorldBean.java。实现类的命名规则是:接口+Bean,如:HelloWorldBeanpackagecom.foshanshop.ejb3.impl;importcom.foshanshop.ejb3.HelloWorld;importjavax.ejb.Remote;importjavax.ejb.Stateless;@Stateless@Remote({HelloWorld.class})publicclassHelloWorldBeanimplementsHelloWorld{publicStringSayHello(Stringname){returnname+说:你好!世界,这是我的第一个EJB3哦.;}}HelloWorld会话Bean开发完了,现在我们把她发布到Jboss中。在发布前需要把她打成Jar包打完包后,启动Jboss,把发布包拷贝到[jboss安装目录]\server\default\deploy\目录下。观察Jboss控制台输出,如果没有抛出例外并看到下面的输出界面,发布就算成功了。一旦发布成功,你就可以在jboss的管理平台查看她们的JNDI名,输入下面URL点击service=JNDIView,查看EJB的JNDI名称。(如下图)在出现的页面中,找到“ListofMBeanoperations:”栏。点击”Invoke”按钮,出现如下界面:在上图中可以看见HelloWorld会话Bean的JNDI(JavaNamingandDirectoryInterface)路径,JNDI路径名的组成规则是“上层名称/下层名称“,每层之间以”/”分隔。HelloWorld会话Bean的JNDI路径名是:HelloWorldBean/remote。HelloWorld会话Bean发布成功后,接下来介绍客户端如何访问她。当一个无状态会话Bean发布到EJB容器时,容器就会为她创建一个对象stub,并把她注册进容器的JNDI目录,客户端代码使用她的JNDI名从容器获得他的stub。通过这个stub,客户端可以调用她的业务方法。例子代码如下:Test.jsp%@pagecontentType=text/html;charset=GBK%%@pageimport=com.foshanshop.ejb3.HelloWorld,javax.naming.*,java.util.Properties%%Propertiesprops=newProperties();props.setProperty(java.naming.factory.initial,org.jnp.interfaces.NamingContextFactory);props.setProperty(java.naming.provider.url,localhost:1099);props.setProperty(java.naming.factory.url.pkgs,org.jboss.naming);InitialContextctx;try{ctx=newInitialContext(props);//如果客户端和jboss运行在同一个jvm,不需要传入propsHelloWorldhelloworld=(HelloWorld)ctx.lookup(HelloWorldBean/remote);out.println(helloworld.SayHello(佛山人));}catch

1 / 67
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功