大家好,又见面了,我是你们的朋友全栈君 1.前言 从今天开始,简单的学习一下有关EJB方面的知识.从自己看EJB有关方面的书籍来看,感觉跟市面上的Spring很像,后来才发现,整个Spring框架实际上是参考了 EJB的设计理念,由于学习过Spring,所以现在学习EJB的相关知识,并不是很吃力.接下来会在几篇博客中,简单的书写一下,自己的EJB的认识. 2.什么是EJB EJB全名为Enterprise Java Bean,是J2EE规范的重要核心.主要是针对于分布式的开发技术,到目前为止EJB已经走过了EJB1.0、Ejb2.0以及目前的EJB3.X的历程,从现在来看,EJB相对于以前的2.0、1.0 EJB主要是用来构建企业级的应用框架,而对于小规模的开发而言,市面上流行最广的莫过于Spring+Hibernate核心开发技术。 企业级应用有如下特点: 1、应用的规模较大、而且增长速度快速 2、应用的伸缩性要求很高 3、应用可能需要使用除JSP页面之外的其他客户端 3.EJB的分类 在EJB3.0中,EJB可以大概分为两类
EJB3最新的EJB标准。 Spring是一个框架。 Spring可以部分简化EJB本地和远程调用。EJB3分消息驱动Bean、有、无状态Bean和实体Bean。分别服务于应用层和持久层。 EJB和表现层没有任何关系。Model和它的关系只是Model可以去调用EJB罢了。 EJB3的持久层是一个新的标准JPA。 EJB属于应用层和持久层。Spring虽然有自己的Spring MVC,但是本质上来说,Spring属于中间层框架。 应用EJB的标准结构是: 表现层(Struts/JSF等)+应用层(EJB中的Session Bean)+持久层(实体Bean)。 Spring+EJB的: 表现层(Struts/JSF/Spring MVC)+应用层(Spring+EJB中的Session Bean)+持久层(实体Bean/ORM框架/JDBC)。
bean 类实现了javax.ejb.EntityBean接口,同javax.ejb.SessionBean接口一样,EntityBean 接口包含了EJB 容器调用bean实例的语法格式. EJB 配置描述器 (1)ejb-jar.xml <ejb-jar> (注释) <enterprise-beans> <session> <ejb-name>HelloWorld(ejbname RequiresNew 在调用相应的EJB之前,开始一个新的事务,当方法调用返回时,即提交这个事务. 6、ejb 引用 在ejb-jar.xml <ejb-ref> <description> an EJB reference to the Widget EJB(描述)</description> <ejb-ref-name>ejb/WidgetEJB</ejb-ref-name> > </ejb-ref> 在 weblogic-ejb-jar.xml <ejb-reference-description> <ejb-ref-name>ejb/WidgeEJB</ejb-ref-name
个人感觉很多是通过ejb来进行查找及调用的,所以,特意自己做了一个ejb在was上部署以及客户端连接的例子: [b][color=red]1、ejb方面[/color][/b] ejb采用ejb ) throws EJBException, RemoteException { // TODO Auto-generated method stub System.out.println(“ejb 到was中[/b][/color] 注意:在ejb的jndi项,填写ejb/hello,以便以后在client端进行引用。 [color=red][b]3、将导入的ejb导出[/b][/color] 注意:was比较恶心的地方在这里,因为我们在创建ejb的时候,没有生成stub等类,而was在发布我们的ejb时,自动给我们补齐 ,所以,我们从发布的ejb导出客户端需要的jar包。
EJB:企业级JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件。 EJB主要有三种Bean: Session Beans: 会在单个特定用户会话中存储数据。它可以是有状态或无状态的 。与实体bean相比它的资源较少。 应用服务器/ EJB容器提供了最像事务处理,日志记录,负载均衡,持久性机制,异常处理等系统级的服务。开发者只注重于应用程序的业务逻辑。 EJB容器管理EJB实例的生命周期因此开发者需要更不用担心何时创建/删除EJB对象。
EJB_DEMO项目类型为EJB Project,是需要部署到JBoss上的EJB应用。EJB_DEMO_CLIENT项目类型为普通的Java Project,是用来模仿调用EJB的远程客户端。 建立EJB项目—EJB_DEMO ---- New—EJB Project ? 客户端既然调用EJB,肯定需要它的接口,所以EJB_DEMO_CLIENT需要引用由FirstEjb.java所打的jar包,为了开发简便,也可以直接让EJB_DEMO_CLIENT引用EJB_DEMO 应用+EJB客户端就完成了。 在JBoss启动的情况下,运行一下客户端,是不是成功调用EJB并且输出信息了呢? ? ---- 【 转载请注明出处——胡玉洋《EJB——建立一个简单的EJB应用》】
2、EJB接口(远程接口或者本地接口)和EJB对象 远程接口继承javax.ejb.EJBObject接口; 本地接口继承javax.ejb.EJBLocalObject接口。 EJB对象就是实现了EJB接口的对象,由容器或容器供应商提供的工具自动生成。 三、客户端如何获得EJB对象的引用: EJB对象的引用通过Home对象来得到。 的步骤: 1、通过JNDI查找EJB对象的位置; 2、调用Home对象的create()方法创建EJB对象; 3、调用EJB对象的商务方法; 4、调用EJB对象的remove()方法。 说明:客户端调用EJB一般使用远程调用,因为WEB服务器和EJB服务器可能位于两台机器; EJB调用EJB一般使用本地调用,因为它们通常都位于同一个EJB容器内。 <ejb-ref-name>ejb/LocalUser</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <local-home
https://blog.csdn.net/huyuyang6688/article/details/50782729 之前一直用的EJB开发环境是他们搭建好的,直接拿来用,不过还是感觉老吃别人嚼好的不太好吃 EJB开发依赖的最基本的环境:JDK、Eclipse、JBoss,这里简单介绍一下最基本的环境的搭建。 这时就可以在Eclipse中添加JBoss实例啦(添加方法同Eclipse中添加Tomcat)~~ ---- 【 转载请注明出处——胡玉洋《EJB——EJB开发环境搭建(Eclipse集成JBoss)》
EJB 配置描述器 (1)ejb-jar.xml <ejb-jar> (注释) <enterprise-beans> <session> <ejb-name>HelloWorld(ejbname 如果调用者有一个事务,相应的EJB可以参与事务,否则,容器将在调用相应的EJB之前,开始一个事务. RequiresNew 在调用相应的EJB之前,开始一个新的事务,当方法调用返回时,即提交这个事务. 6、ejb 引用 在ejb-jar.xml <ejb-ref> <description> an EJB reference to the Widget EJB(描述)</description> <ejb-ref-name>ejb/WidgetEJB</ejb-ref-name> <ejb-ref-type weblogic-ejb-jar.xml <ejb-reference-description> <ejb-ref-name>ejb/WidgeEJB</ejb-ref-name> <jndi-name
} 2.HelloWord的实现 package com.ejb.impl; import javax.ejb.Remote; import javax.ejb.Stateless; import * 如果在本地用 EJB(确保客户端与 EJB 容器运行在同一个 JVM),采用 Local 接口访问 EJB 优于 Remote 接口, * 因为 Remote接口访问 EJB 需要经过远程方法调用 (RPCs)环节,而 Local 接口访问 EJB 直接从 JVM 中返回 EJB 的引用。 应用 如果没有 就是EJB没发不好 如果有的话 就要看客户端的环境设置 和代码 还有就是把jboss的包全部在重新导入一遍 第二天: EJB注解 @EJB EJB实现的接口 实例名称 如 @EJB HelloWord helloword 如果以个接口被2个或者2个以上的EJB实现 那么可以用 @EJB(beanName=”EJBName”) EJB实现的接口 实例的名字 但是
> EJB Client(客户端): (1) EJB不能够被客户端直接访问,客户端必须通过业务接口来调用EJB (2) EJB客户端分为两类: A、EJB客户端与EJB运行在同一个容器中 →本地业务接口 B、EJB客户端与EJB运行在不同的JVM中→远程业务接口 EJB 容器(EJB Container): (1) EJB容器是一个运行在JVM上的程序 (2) EJB容器为 在EJB组建中调用其他的EJB组件 2、EJB调用方式:标注 @EJB: 可以借助于JNDI,查找到其他EJB组件,也可以借助于业务接口,调用EJB实例中的业务方法,也可以直接引用其他的需要的EJB组件的业务接口 3、EJB调用方式:EJB Context查找 EJB Context<interface> EJB容器提供给EJB的一个对象,用来给EJB访问EJB容器调用的一个接口。 EJB Security EJB中的认证与授权: ① Web容器对客户端进行认证 ② Web容器将认证后的主体传递给EJB容器 ③ EJB容器按照主体来控制EJB的调用 Web主要作认证,EJB
我们先把EJB 打回原形给大家来慢慢分析。 2. 把EJB 掰开了揉碎了 我们把EJB 的概念好好的分析一下,看看能发现些什么蛛丝马迹。 4 .1 EJB 的最底层究竟是什么 我们揭开了EJB”八股”概念的真谛,那么,再来分析EJB 的底层实现技术,通过底层实 现技术来分析EJB 的工作方式。 4.2 EJB 的实现技术 EJB 是运行在独立服务器上的组件,客户端是通过网络对EJB 对象进行调用的。在Java 中,能够实现远程对象调用的技术是RMI,而EJB 技术基础正是RMI。 但不管怎么说,EJB 的基础仍然是RMI,所以,如果你想了解EJB 的原理,只要把RMI 的原理搞清楚就行了。你也就弄清楚了什么时候用EJB 什么时候不需要用EJB 了。 5. EJB 活学活用,J2EE 不是必须使用EJB 通过上面小节的讲解似乎好像EJB 和开发Web 应用的B/S 结构的系统关系并不大,其实 倒也不然。
EJB扩展组件 EJB的依赖注入,都是依赖于JNDI的。 在EJB组建中调用其他的EJB组件 可以借助于JNDI,查找到其他EJB组件,也可以借助于业务接口,调用EJB实例中的业务方法,也可以同国直接引用其他的需要的EJB组件的业务接口,但是需要使用标注。 默认是EJB的名字。 mappedName属性也是标识EJB的名字的是容器相关的,所以不要重置,降低可移植性。 description属性是EJB的描述内容。 以上3个属性是3个标签共有的属性。 EJB的依赖注入 @Resource标注能够引用到EJB组件环境中的资源。 属性如果在要引入的EJB组件在相同模块中也就是在同一个jar文件中,就需要自定beanName了 EJB拦截器 EJB拦截器,使用来截取客户的调用方法的,就像是过滤器,他只适用于SessionBean
SOA(面向服务的架构)和EJB的关系 服务,一组组件所提供的功能。 ) 4,编译文件 5,提供部属文件,EJB3.0中使用了注释不用写标准部署描述(ejb-jar.xml),系统调优用的厂商部署描述是需要写的。 6,打jar包,部署到服务器中 EJB3.0使用了JAVA SE 5.0 中的注释新特性,只要在方法上写EJB规范的注释,就可以不用来写标准的部署表述,ejb-jar.xml这个要放到jar文件的mate-inf </ejb-name> <business-remote>test.HelloRemote</business-remote> <ejb-class>test.HelloBean</ejb-class 在厂商的部署描述中可以配置EJB的实例池,可以一次创建多个EJB的实例。
为什么会突然要看看EJB这个老古董? 前段时间准备再看看Spring的东西,当然就免不了要看一下Spring作者那本导致Spring模型的大作。其中说到Spring是在批判EJB的背景下产生的。 所以,就得看看EJB这玩意儿到底搞了什么东西,粗略浏览了下目录,哗!EJB2太复杂了,算了,先从后面简化过了的EJB3看起吧,完了再反过来看看2是个什么样子。 EJB最有价值的东西是其服务理念,减轻了程序员编程负担,事务、安全等系统级需要考虑的东西由容器提供。 现在发现在EJB里面,各个组件之间的访问都是通过JNDI来搞得,目的只有一个“解耦合”。 RMI:EJB2里面一次客户端访问远程Session Bean会走两次RMI调用(一次是通过Home接口的工厂方法获取远程接口,一次是通过远程接口访问实际调用的业务方法),EJB3里面简化成了一次(Home
4、EJB EJB(Enterprise JavaBean): 我认为它是一组"功能"JavaBean的集合。上面说了JavaBean是实现了一种规范的Java对象。 这里说EJB是一组JavaBean,的意思是这一组JavaBean组合起来实现了某个企业组的业务逻辑。这里的一组JavaBean不是乱组合的,它们要满足能实现某项业务功能的搭配。 这穿着就是EJB,其它的就是一个JavaBean SSH与EJB区别 EJB是一种javabean的组合规范,SSH是3个框架jar包的组合。 EJB本身是JavaEE的规范由容器厂商负责实现,也就是使用EJB,需要使用JavaEE服务器。而用SSH,直接用Web服务器, SSH中要解决的目标和EJB是一致的。 EJB是大型的,SSH是轻量级的。
注意:在EJB中对Bean的定位是通过JNDI的名称来确定的 一:当EJB发布到JBOSS时,如果我们没有为它指定全局JNDI名称或修改其默认的EJB名称, JBOSS就会按照默认的命名规则为EJB生成全局 /local 远程接口:EJB-CLASS-NAME/remote 二:通过远程接口调用EJB的过程 首先客户端需要和EJB服务器建立Socket通信,在通信管道上他们需要来回发送IIOP协议消息 四:如何通过使用注解方式注入并使用其他的EJB和服务 注入和使用其他EJB的方式如下: @EJB EJB的接口 EJB的变量 通过注解”@EJB”可以注入并使用其他的EJB,如果有多个EJB的类实现了同一个接口 ,那么在使用”@EJB”的时候 需要明确指定是注入和使用哪一个EJB的Bean。 指定方式如下: @EJB(beanName=”EJB类的名称”) EJB的接口 EJB的变量 注入和使用其他服务的方式如下: @Resource 服务名称 服务变量 注意在指定数据源的使用需要配置
{ return customers; } 在实体中,两种类型的属性需要进行特殊标注,也就是Date和Calendar 需要使用@Temporal(Date),@Temporal(Calendar) EJB QL EJB3.0中的QL,可以使用order by和having字句,对得出的结果进行分组处理。 EJB3.0中的QL关联查询和hibernate的HQL的写法基本相同。 例: Query query = em.createQuery("select new com.foshanshop.ejb3.bean.SimplePerson(p.name,p.sex) from Person p order by p.personid desc"); EJB事务处理 事务解决了两大问题,原子操作,数据共享 原子操作,是由不可分操作组成的,使这些不可分的操作,一同操作成功或者一同失败
但EJB必须被布署在诸如Webspere、WebLogic 这样的容器中,EJB 客户从不直接访问真正的EJB 组件,而是通过其容器访问。 EJB 容器是EJB 组件的代理,EJB 组件由容器所创建和管理。客户通过容器来访问真正的EJB 组件。 2、EJB 的几种类型? 【基础】 答:remote 接口定义了业务方法,用于EJB 客户端调用业务方法;home 接口是EJB 工厂用于创建和移除查找EJB 实例。 4、客服端口调用EJB 对象的几个基本步骤? Server Provider)、EJB 容器提供者(EJB ContainerProvider)、系统管理员(System Administrator),这里面,EJB 容器是EJB之所以能够运行的核心 18、EJB 规范规定EJB 中禁止的操作有哪些?
WebService=WSDL+SOAP+UDDI(webservice的注册) Soap是由Soap的part和0个或多个附件组成,一般只有part,在part中有Envelope和Body EJB中使用 /schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://ejb schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://ejb .org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://ejb/ @Entity(name="Account"),实体类标注,其属性name是指定实体名,在EJB-QL中使用,默认是类的全名 @Id,指定实体的唯一标识属性,默认这个属性会合数据库中对应表的主键对应。