JSF与EJB3.0集成应用研究

时间:2022-06-28 05:46:43

JSF与EJB3.0集成应用研究

摘要:通过对jsfejb3.0技术的研究分析,提出了集成二者进行Web应用开发的几种方法,给出了实现集成的关键代码,最后分析了JSF与EJB3.0集成应用的优势及发展前景。

关键词:JSF1.2;EJB3.0;JNDI;Jboss Seam

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31670-02

Study on the Integration of JSF and EJB3.O

FU Ming-teng,LIU Dong-fei

(School of Computer Science and Technology,Wuhan 430070,China)

Abstract:According to the analyses about the technology of JSF and EJB3.0, this paper put forward the various methods of integrating JSF with EJB3.0 to develop a Web application. The codes of realization were given in paper. In the end the advantages and development prospects of integrating JSF with EJB3.0 were discussed.

Key words:JSF;EJB3.0;JNDI;Jboss Seam

1 引言

SUN公司最新推出了JSF1.2这个新的表现层框架和一套以注释为基础的EJB编程模型EJB3.0,并引入了新的Java Persistence标准,这是一套基于Java EE的基本架构。Web应用开发的关键是提供良好的数据持久化层、简捷快速的表示层构造以及对业务逻辑、页面导航的有效管理。以JSF+EJB3.0的集成模式开发Web应用系统,能很好的兼顾开发效率与维护成本,具有极高的实用价值,同时两者均为Web应用框架并且都遵循Servlet规范,也为二者的整合提供了基础。

2 JSF概述

JavaServer Faces(JSF)是一种用于构建Web应用程序的新标准Java框架。它提供了一种以组件为中心来开发Java Web用户界面的方法,从而简化了开发。通过JSF,可以在页面中轻松自如地使用Web组件、捕获用户行为所产生的事件、执行验证、建立页面导航等。

JSF通过将良好构建的模型-视图-控制器(MVC)设计模式集成到它的体系结构中,确保了应用程序具有更高的可维护性,JSF按照MVC架构可以分为3部分:View(视图)、Controller(控制器)和Model(模型)。

(1)View层

该层即用户使用界面,它是与用户交互的部分。开发者使用JSF内建或其他厂商提供的Render Kit来开发。

(2)Controller层

该层位于View层与Model层之间,控制着它们之间的交互过程。在JSF中java.faces.webapp.FacesServlet作为Controller,它配合faces-config.xml配置文件控制WEB应用程序的运作流程。

(3)Model层

该层是进行业务操作的部分,由它来实现业务逻辑。JSF中一般使用JavaBean,被称为后台(backing)或托管(managed)bean。

3 EJB3.0概述

为了减少EJB开发的复杂性,Sun公司于2006年5月推出了EJB3.0新规范,EJB3.0新规范中两个重要的变更分别是:使用了Java5中的程序注释工具和基于Hibernate的O/R映射模型。EJB3.0引入了DI(依赖注入)容器类与POJO持久类这些新功能。

在EJB3.0里,任何类型的企业级Bean只是一个加了适当注释的简单Java对象(POJO),这就减少了在创建EJB时所需的类、接口、部署描述符的数量,注释可以用于定义bean的业务接口、O/R映射信息、资源引用信息。EJB 3.0通过用纯旧式Java对象(POJO)取代抽象bean类,用纯旧式Java接口(POJI)取代组件与主接口(Component & Home),也不必实现业务接口,简化了EJB的开发过程。

在Java EE5中,开发了通用持久化规范Java Persistence API 1.0(JPA 1.0)代替以前规范中的Entity Bean。JPA是java持久化技术的一个集大成者,它吸取了Hibernate、JDO、TopLink等优秀技术和框架,将这几年发展成熟起来的基于POJO模型的O/R Mapping技术标准化,成为在java中通用的API。大大减轻了编程的复杂性。

4 JSF与EJB3.0的集成

虽然JSF与EJB3.0被作为标准搭载在JavaEE5里,但JavaEE5却没有给出一个结合JSF与EJB3.0的API。要同时在一个WEB应用中使用JSF和EJB3的话,开发者必须自己考虑一个实现方案。开发者可以用下面二种方法来实现JSF与EJB3.0的集成。

4.1 使用JSF的Backing Bean调用EJB组件

包含JSF标签的JSP页面是表示层,Faces Servlet提供了controller的功能,将JSF中的属于Bean角色的Backing Bean作为EJB与UI的接口,其作用是在真正的业务逻辑Bean及UI组件之间搭起桥梁。而另一面的EJB容器则成为MVC模式中的Model层,其中会话bean执行独立的、解除耦合的任务;实体bean已经升级为独立的持久层框架(即JPA1.0),应用O/R Mapping技术处理与数据库之间的业务,通过EntityManager对实体(Entity)进行持久化,查询,删除等操作。体系结构如图1所示:

图1 基于JSF和EJB3.0的WEB应用的体系结构

在本集成方案中,JSF与EJB3.0的交互,依靠JSF中的Backing Bean来调用EJB。可以用以下方法来实现:

(1)编写工具类

EJB使用JNDI(Java Naming and Directory Interface)名来定位存取某特定的对象;JNDI服务是EJB标准所规定的一项标准服务,所有EJB服务的提供商,必须为其EJB服务器实现JNDI服务。

客户端在调用EJB组件时都需要遵循如下步骤:

a.借助于JNDI,查找到EJB组件的本地或远程业务接口;

b.借助业务接口,调用EJB实例中的业务方法。

开发者可以利用业务委派模式编写一个工具类,它处理连接到 EJB 容器、获取所需资源。Backing Bean通过这个工具类调用EJB来实现业务逻辑,下面是这个工具类的关键代码:

import javax.naming.InitialContext;

import javax.naming.NamingException;

public class ServiceDelegate {

private static ServiceDelegate instance = new ServiceDelegate ();

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

public static ServiceDelegate getInstance() {

return instance;

}

/* 创建一个 ServiceDelegate 实例*/

public ServiceDelegate () {

try {

//借助JNDI,查找SessionBean

InitialContext ctx = new InitialContext();

[SessionBean业务接口] xxxService =([SessionBean业务接口]) ctx

.lookup("SessionBean业务接口的JNDI名称");

} catch (NamingException e) {

e.printStackTrace();

} catch (Exception ex) {

ex.printStackTrace();

}

……

/*此处省略调用EJB业务方法代码*/

……

}

(2)使用依赖注入机制

依赖注入就是由容器负责查找被依赖的对象并注入到依赖bean中,而bean本身不再需要进行JNDI或者context查询。EJB3里可以直接在EJB组件里申明类似@Stateless等注释(annotation)便可标明该EJB为无状态Session Bean,而客户端程序里也只需要在程序里申明类似@EJB的注释便可完成对EJB的调用,而省略了配置过程。其原理是这样的:EJB容器会在配置EJB时解析EJB组件里的注释,根据被申明的注释和默认配置把EJB登录到JNDI里。而客户端程序的运行环境(比如WEB容器)在运行时需要对SERVLET等进行解析,分析被注释的成员变量的类型或名称,根据这些信息得到JNDI名,调用lookup方法,得到对EJB对象的引用,然后使用DI和AOP技术自动完成对EJB的调用。

SUN公司的Java EE应用服务器GlassFish已经在 Web 层支持 Servlet 2.5 和 JSF 1.2 关于 Java EE 5 的依存关系注入申明,如果将JSF+EJB3应用程序部署在同一个GlassFish应用服务器中,在 Java EE 5 中,backing bean调用EJB组件时,您不必编写任何JNDI查找代码。仅使用 @EJB 声明来标识一个字段,服务器会在创建 managed bean 后注入一个 EJB。

4.2 利用JBoss Seam框架

由于JSF的定位是表示层框架,与应用层交互的唯一手段,只有Managed Beans。在Sun的蓝图里,应用层由EJB主持大局。应用层和表示层之间需要某种技术来粘合。Managed Beans有一定的粘合作用,但远远不能满足企业应用编程的需求。为了解决现有框架(包括 EJB 3.0,JSF 和 BPM)之间存在的这一问题,JBoss推出了JBoss Seam 框架,JBoss Seam提供了一致的,以注释为基础的整合EJB3.0和JSF1.2的方法。在JBoss Seam中,你只要为EJB3.0组件提供一个简单的注释,就可以在JSF中直接使用EJB3.0组件了。

在一般的开发模型中,JSF的Managed Bean与EJB3的Entity由于分属于2个不同的组件模型,所以他们的状态也不得不分别管理。比如,在JSF里用faces-config.xml定义Managed Bean,JSF框架根据faces-config.xml的定义对Managed Bean加以管理。在使用EJB3的情况,得把Managed Bean传送给EJB3框架,EJB3对自己的Entity的状态加以管理。而使用JBoss Seam的情况,JSF的Managed Bean则不再需要在faces-config.xml里定义,JBoss Seam本身提供了一种称为Seam组件的Bean(Java Bean),只要在普通的Java Bean里,对它加以标注(annotation),JBoss Seam便可将其自动映射(mapping)为JSF的Managed Bean和EJB3的Entity。

使用Jboss Seam 集成JSF和EJB3的方法如下:

(1)Jboss Seam与JSF集成

首先在web.xml中设置:

org.jboss.seam.servlet.SeamListener

设置 faces-config.xml:

org.jboss.seam.jsf.SeamPhaseListener

(2) Jboss Seam与EJB3的集成

设置ejb-jar.xml:

org.jboss.seam.ejb.SeamInterceptor

*

org.jboss.seam.ejb.SeamInterceptor

以上为所有的EJB Beans定义了SeamInterceptor回调。EJB3容器会在调用Session Bean之前先调用SeamInterceptor。这就使得Seam跟Session Bean有机结合起来了。

5 总结与展望

通过使用规范里UI组件、注释和POJO等新技术,采用JSF1.2与EJB3.0集成的方法减轻了开发人员进行底层开发的工作量,而且开发和设计过程层次分明、结构简单。

JSF和EJB3.0 是用于构建 Web 应用程序的强大技术。如果

能将两个框架统一起来,无疑它们会相得益彰:无态和有态 EJB 是用于 JSF 的极好的事件处理支持 Bean;JPA可以提供自动且透明的对象关系型数据库映射;可视的 JSF 组件可以将自己的状态绑定到实体 Bean 上。因此,它们是实现面向对象域模型的一个很好的解决方案。为了统一JSF managed beans和EJB 3.0这两种组件模型JBOSS向JCP提交Web Beans技术规范预览草案――JSR 299。该项目的目标是让EJB 3.0 组件能够同时作为JSF managed beans来使用,统一这两种组件模型,进而简化Java中的WEB应用编程模型。

参考文献:

[1] JCP Expert Group. JSR-244(java EE5.0)[S/OL].省略/en/jsr/detail?id=244.

[2] JCP Expert Group. JSR-252(JSF1.2)[S/OL].省略/en/jsr/detail?id=252.

[3] JCP Expert Group. JSR-220(EJB3.0)[S/OL].省略/en/jsr/detail?id=220.

[4] Jboss org Seam Reference Documentation[EB/OL].

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:探索结对编程 下一篇:DSP芯片的发展及选型