admin 管理员组

文章数量: 1086019


2024年3月12日发(作者:用js向文本框输入文字)

2011年6月 

第3期 

兴义民族师范学院学报 

Journal of Xingyi Normal University for Nationalities 

June 201 1 

No.3 

JSF与EJB3整合技术研究 

秦礼章 

(贵州大学, 贵州贵阳 550025) 

摘要:通过依赖注入技术把无状态Session Bean注入托管Bean中,或者通过在托管Bean中配置 

EJB引用查找有状态Session Bean,使得JsF构建的Web组件能够访问EJB构建的业务逻辑组件,从而 

将JsF和EJB3.0这两个Java EE体系结构中的架构技术整合起来。 

关键字:JSF;EJB3.O;依赖注入;EJB引用 

文章编号:1 009--0673(201 1)03-_o080—05 中图分类号:TP31 1 文献标识码:B 

The Research of Combination Technology of JSF and EJB3 

Qin Li-zhang 

(Guizhou University,Guizhou Guiyang,550025,Chian) 

Abstract:According Dependable Injection Technology,the uncondiitonal Session Bean could be infused into Managed Bean. 

At the other hand,it could searches for the conditional Session Bean by configuring EJB in Managed Bean.Then,the Web compo- 

nents by JSF can access to the professional logical components by EJB.As a result,the JSF and EJB3.0,which belong to the Java EE 

technology,can combine together easily. 

Keywords:JSF;EJB3.0;Dependable;Ifusinon;EJB Quotation. 

引言 

模比较大且增长速度比较快、应用的伸缩性要求 

由于EJB2的复杂性和开发的难度,饱受开 

发人员的诟病,以致以Spring为核心的轻量级 

Java EE应用的出现,它使中小企业以较小的花 

费,更快的开发速度开发同样健壮的企业级应用。 

很高、以及应用可能需要使用除JSP页面之外的 

其它客户的企业级应用来说,选择以EJB3为核 

心的Java EE应用技术更为合适。 

开发一个企业级Web应用系统,系统架构的 

实现方式有很多的选择。基于JSF和EJB3.0的 

Java EE体系结构开发的Web应用系统,表示层 

使用JSF框架实现,业务逻辑层由若干EJB组件 

构成,这些可重用组件独立于任何用户界面逻辑, 

EJB3直接抛弃了EJB2中备受诟病的Entity 

Bean,改为使用JPA(Java Persistence API)规范作为 

持久层的解决方案,因此,EJB3的开发并不比以 

Spring为核心的轻量级Java EE应用复杂多少,但 

提供了比Spring容器更多的支持,比如EJB的池 

化管理、服务器节点的集群管理等。对于应用的规 

数据持久层使用JPA实现。应用依赖注入把EJB 

注入Web组件,或者通过配置EJB引用,把基于 

收稿日期:2011一O4—15 

作者简介:秦礼章(1978一_ ),男,贵州安龙人,贵州省大学在职研究生,兴义民族师范学院计科系 

教师,主要研究方向:JavaEE应用开发。 

80・ 

2011钲 秦礼章 JSF与EJB3整合技术研究 

据库原子操作来实现系统业务逻辑。 

第3期 

JSF的表示层和基于EJB3.0的业务逻辑层的整 

合起来。这两种技术的结合充分发挥了两者的优 

点,基于二者的Web应用层次清晰、性能优良、易 

于维护,具有很好的可扩展性和可移植性,非常适 

5)Entity层:Entity抽象了系统的对象模型, 

每个Entity映射到一个或多个数据表。 

三、JSF与EJB3.0技术 

合面向对象的设计和开发。 

二、Java EE应用架构 

1.JavaEE规范 

Java EE5 Java Platform Enterprise Edition5) 

是一个开发分布式企业级应用的规范,它提供了 

个多层次的分布式应用模型和一系列开发技术 

规范。JavaEE平台由一整套服务、应用程序接口 

(API)和协议构成,它对开发企业的多层应用提供 

了全面的功能支持。 

个多层的分布式应用模型意味着应用逻辑 

依据功能被划分成各种组件,并且可以在同一个 

服务器或不同的服务器上安装这些不同组件。 

Java EE组件是具有独立功能的软件单元,它们通 

过相关的类和文件组装成Java EE应用程序,并 

与其它组件交互。JavaEE组件运行环境称为容 

器,由应用服务器提供。 

2.Java EE的应用分层架构 

分层架构的设计目的就是实现应用组件的解 

耦,为应用提供较好的可扩展性和可维护性。 

1)表现层:由页面、PDF文档视图组件组成, 

负责收集用户请求,并显示处理结果。 

2)控制器层:由控制器组成,用于拦截用户请 

求,并调用业务逻辑组件的业务逻辑方法,处理用 

户请求,并根据处理结果转发到不同的表现层组 

件。 

3)业务逻辑层:由业务逻辑组件组成,用于实 

现系统的业务逻辑,通常使用Session Bean来实 

现。一个业务逻辑方法对应一次用户操作,一个业 

务逻辑方法应该是一个整体的,业务逻辑方法仅 

仅负责实现业务逻辑,不应该进行数据库访问,这 

样可以保证业务方法的实现与具体的持久层访问 

技术分离,当系统需要在不同的持久层技术之间 

切换时,系统的业务逻辑组件无须任何改变。 

4)EAO层:由EAO(Entity Access Object)组 

件组成,提供对实体的增加、查询、修改和删除等 

操作,这些操作对应于数据表的CRUD等原子操 

作,而业务逻辑组件通过调用EAO组件提供的数 

1.JSF 

JSF全称Java Server Faces,它是Java EE的 

MVC规范,提倡以页面组件的方式隐藏传统Web 

应用开发的HrITI’P细节,允许开发者以传统桌面 

编程方式来开发Web应用。JSF通过将托管Bean 

的属性、方法直接绑定到页面组件的value属性 

或者action属性,就可以非常方便的实现系统的 

MVC控制。JSF与Struts框架不同,Sturts框架依 

然是基于请求一响应模型的,只是提供了更简捷 

的封装,而JSF则采用面向对象的事件通信机制, 

Web编程中请求一响应模型完全被隐藏起来了。 

JSF通过将良好构建的模型一视图一控制器 

(MVC)设计模式集成到它的体系结构中,确保了 

应用程序具有更高的可维护性。JSF按照MVC架 

构可以分为3部分:View(视图)、Controller(控制 

器)和Model( ̄)。 

2.EJB3.0 

从J2EE规范面世的第一天,EJB(Enterprise 

Java Bean)就是J2EE规范的核心。在过去,EJB 

的复杂性让整个J2EE饱受争议,甚至出现了无 

须EJB的轻量级J2EE。后来,SUN发布了EJB3, 

它直接抛弃了EJB2中Entity Bean的设计。EJB3 

简化了Session Bean的开发,它不再需要Home接 

口,不再推荐使用XML文件作为部署描述文件, 

而改为使用Annotation来设置部署描述信息;同 

时,EJB3引进了全新的JPA规范作为持久化解决 

方案。而J2EE这个名称也改为Java EE。 

EJB提供了一种良好的组件封装,EJB容器 

负责处理如事务、访问控制等系统问题,而EJB 

开发者则集中精力去实现业务逻辑;对页面开发 

者而言,EJB的存在无须关心,EJB的实现无须关 

心,他们只要调用EJB的方法即可。 

EJB3包含两类:会话(Session)Bena和消息驱 

动Bean(MDB)。 

Session Bean代表一个可处理应用中业务逻 

辑的完整组件,主要包含了各种业务逻辑的实现 

代码。当Session Bena部署在EJB容器中之后,其 

8l・ 

2011钽 兴义民族师范学院学报 第3期 

它客户端就可获取该EJB组件,并调用它的方 

法。 

业务逻辑组件由Session Bean组件组成,Ses— 

sion Bean组件由两部分组成:一个或多个业务接 

口和这些接口EJB的Bean实现类。 

业务接口通常用@Remote(用于远程调用)和 

Message Driven Bean简称MDB,即消息驱动 

Bean,是由无状态Session Bean发展而来,是一个 

JMS消息的异步消费者。当JMS消息送达JMS服 

务器的消息目的,消息驱动Bean就会被触发,它 

就会读取消息,并进行针对性地处理。 

四、JSF与EJB3的整合技术 

对于一个基于B/S架构的Java EE应用而 

言,用户请求总是向MVC框架请求,而当控制器 

拦截到用户请求后,必须调用业务逻辑组件来处 

理用户请求,控制器通过容器获取业务逻辑组件。 

以JSF构建的表现层组件在调用EJB构建的业 

务逻辑层组件的方法中,这里提供两种解决方案: 

依赖注人和EJB引用。 

1.依赖注人 

11理论概述 

依赖注入(Dependency Injection)和控制反转 

fInversion of Contro1)是同一个概念。具体含义是: 

当某个角色(可能是一个Java实例,调用者)需要 

另一个角色(另一个Java实例,被调用者)的协助 

时,在传统的程序设计过程中,通常由调用者来创 

建被调用者的实例。但在EJB里,创建被调用者 

的工作不再由调用者来完成,因此称为控制反转; 

创建被调用者实例的工作通常由EJB容器来完 

成,然后注入调用者。 

EJB3规范吸收了“依赖注入”的优势,应用服 

务器负责将业务逻辑组件注入MVC层的控制 

器,同时管理业务逻辑组件、EAO组件等之间的 

依赖关系。 

JSF作为前端MVC框架,其托管Bean(前端 

控制器)处于应用服务器的管理之下,因此,服务 

器很容易将业务逻辑组件注入到JsF的托管 

Bean中。系统的业务逻辑由EJB3中的Session 

Bean来完成,其中无状态Session Bean组件需要 

注入JSF的托管Bean中,使前端控制器可以调用 

业务逻辑组件中的方法。 

2)主要编码 

Java EE5规范为依赖注入提供了@EJB、@E— 

JBs、@Resource、@Resources等四个注解(Annota— 

tion)。 

82・ 

@Local(用于本地调用)来修饰,例如: 

@Local 

public interface NewsService 

{ 

int addNews(String title,String content); 

List<News>getAllNews0; 

) 

EJB业务接口的实现类使用@Stateless(用于 

无状态Session Bean)和@Stateful(用于有状态 

Session Bean)来修饰,@Stateless(或@Statefu1)中 

的name属性指定它的内部标识名,然后利用这 

个内部标识名将该Session Bean组件注入JSF的 

托管Bean中。例如上面接口的实现类如下: 

@Stateless name=”newsService”)//指定内部标 

识名 

public class NewsServiceBean 

implements newsService 

{ 

public String addNews(String title,String 

content) 

{ 

} 

public List<News>getAllNews0 

{ 

J 

} 

接下来通过Session Bean组件的内部标识名 

将该EJB组件注人JSF的托管Bean中,假设在一 

个JSF表单页中定义一个提交按钮,当该按钮被 

单击时,触发了addNewsBean的addNews方法, 

下面是addNews托管Bean的代码: 

public class AddNewsBean 

{ 

//通过依赖注入将EJB组件newsService注 

2011拄 秦礼章 JSF与EJB3整合技术研究 第3期 

人该托管Bean中 

@EJB(beanName=”newsService”1 

private NewsService.newsService; 

public Stirng addNews0 

{ 

,/调用EJB的方法来处理用户请求 

newsService.addNews(title,content); 

) 

在将newsService依赖注入托管Bean中后,需 

要在face—con_ifg.xml文件中配置该托管Bean,并 

为它配置相应的导航规则,该文件内容如下: 

<managed-bean> 

<managed-bean-name>addNews</man- 

aged-bena-name> 

<managed-bean-class>org.crazyit.controller. 

AddNewsBean</managed-bean-class> 

<managed-bean-scope>request</man- 

age—-bean—-scope> 

</managed-bean> 

<navigation-rule> 

<from-view-id>/addNews.jsp</from-view-id> 

<navigation-case> 

<from—.outcome>success</from—.outcome> 

<to-view-id>/succ.jsp</to-view—id> 

</navigation-case> 

</navigation-rule> 

在应用服务器把EJB注入到指定的Web组 

件中时,要把Web组件和EJB组件部署成一个整 

体,通常是将EJB打包成一个JAR包,然后将这 

个EJB—JAR包直接复制到Jboss服务器盯自动部 

署目录下。 

2.EJB引用 

由于托管组件可能具有多线程支持,那就意 

味着会有多个客户端共享这个托管组件,如果将 

有状态Session Bean注入托管组件中,就会导致 

多个客户端同时共享一个有状态Session Bean, 

因此会导致较大系统开销,这违背了Session Bean 

的适用原则。 

为了让JSF构建的Web组件访问有状态的 

Session Bean组件,Web组件应该在每次使用有状 

态Session Bean时,都主动查找一次——这样就 

可以保证Web组件每次使用新的有状态Session 

Beano 

般来说,Web组件访问有状态Session 

Bean很少通过EJB的全局JNDI进行查找,原因 

主要有两点: 

1)通过EJB的全局JNDI查找的系统开销 

大。 

2)对于有些应用服务器而言,local Session 

Bean没有全局JNDI。 

因此,大部分时候,Web组件访问有状态 

Session Bean组件都是通过查找EJB引用来获取 

的,这需要如下两个步骤: 

1)为需要调用的EJB配置EJB引用。 

2)在Web组件中通过查找EJB引用来获取 

EJB组件。 

对于有状态Session Bean而言,它将会自动 

维护与指定客户端之间的状态,因此程序不能将 

它注入到具有多线程的Web组件中,而且Web 

组件应该主动维护与该Session Bean之间的关 

系。这里采用类级别上的@EJB注解来配置EJB 

引用,下面是JSF托管Bean中配置和引用EJB的 

关键代码: 

@EJB(name=”usreService”,//配置EJB引用 

beanInterface=org.crazyit.service.UserService. 

class) 

public class LoginBean 

{ 

public String validO 

{ 

FaceContext fc=FaceContext.getCurrentIn- 

stanceO; 

ExtemalContext ec=fc.getExtemalContextO; 

HttpSession session=(HttpSession)ec.getSes- 

sion(ture); 

UserService US=(UserService)session.getAt- 

tirbute(“US”); 

if(us==nul1) (下转第89页) 

83・ 

201 1年 

性和效率等问题。 

陈泽黎建构突发公共卫生事件管理信息系统的研究 

参考文献: 

第3期 

总之,随着社会经济的发展,突发事件越来越 

多、越来越频繁。应对突发事件存在的主要问题正 

处于突发事件高发时期,我们面临着突发事件所 

带来的严峻考验。最关键性的因素是突发事件应 

急信息通报不及时、不充分,管理信息系统不完善 

等,是影响应对突发事件成效的,而建构突发公共 

卫生事件管理信息系统,无疑具有重要意义,是百 

姓所需、社会所需、刻不容缓、迫在眉睫。这对促进 

地方又好叉陕、更好更快发展提供了有力的技术 

借鉴和理论保证。 

[1]仲秋雁.管理信息系统【M].北京:清华大学 

出版社.2010. 

f21刘少英.软件开发的形式化工程方法:结 

构化+面向对象+形式化[M].北京:清华大学出 

版社.2008. 

【3姜法春.3]青岛市突发公共卫生事件综合应 

急指挥系统信息化建设探讨卟中国公共卫生管 

理.2006. 

[4]陶贤都.加强科技新闻在突发公共事件中 

的作用Ⅱ].吉首大学学报:社会科学版,2006. 

责任编辑:梅秀全 

(上接第83页) 

{ 

Bean,就可解决线程安全问题。 

五、总结 

Context ctx=new InitialContextO; 

//通过EJB引用查找EJB 

US= (UserService)ctx.1ookup(“java: 

comp/env/userService”); 

JSF和EJB3.0是构建企业级应用的强大技术, 

应用依赖注入和EJB引用将这两个框架统一起 

来,使它们相得益彰。无状态Session Bean和有状 

态Session Bean是用于JSF的极好的事件处理支 

session.setAttribute(“US”,us); 

} 

持Bean,是实现面向对象域模型的一个很好的解 

决方案。 

setlnfo(us.getLoginlnfo0);//调用EJB中的方 

法 

) 

托管Bean每次需要调用Session Bean的方法 

参考文献: 

f11李刚.经典Iava EE企业级应用实战.电子 

工业出版社.2010. 

时,总是先试图从HttpSession获取已有的Session 

Bean;如果HttpSession中不存在该Session Bean, 

该托管Bean会通过EJB引用查找全新的EJB,这 

[2]郝玉龙J2EE编程技术.清华大学出版社. 

2005. 

责任编辑:梅秀全 

样既可保证每次都获取一个新的有状态Session 

89・ 


本文标签: 组件 逻辑 业务 应用 系统