使用 Spring,JSF,EJB3 设计企业应用程序
在本文中,作者使用 Eclipse 开发了一个简单的应用,演示了使用 Spring 集成 Java EE 5 核心框架 - EJB 3.0 和 JSF 1.2 的过程。您将看到,Spring 使得访问和实现 EJB 更加方便。
Java EE 5.0 的核心框架是 EJB(Enterprise JavaBeans)3.0 和 JSF(JavaServerFaces)1.2 。 EJB 3.0 是一个基于 POJO(Plain Old Java Objects) 的服务端业务服务和数据库持久化的组件模型。 JSF 是一个基于 MVC(Model-View-Controller) 的 Web 应用框架。大多数的应用都将包含有业务逻辑的 EJB3 组件和用于 Web 应用前端显示的 JSF 组件。从表面上看,EJB3 和 JSF 互补,但是他们是根据各自的理念设计的独立的框架,这二者都无法独自解决所有的计算问题。例如,EJB3 使用注解(annotation)来配置服务,而 JSF 使用的是 XML 文件。 EJB3 和 JSF 组件在框架层面上是互不敏感,最好结合使用。但是 Java EE 5 规范并没有提供如何整合这两个组件模型的标准方法。要整合 EJB3 和 JSF,开发者必须手动地将业务组件(EJB) 与 Web 组件(JSF) 联结起来,以便能跨框架调用方法。
Spring 作为一个轻量级的容器,常被认为是 EJB 的替代品,对于很多应用情况,采用 Spring 作为容器,并借助它对事务和 ORM 等的支持,是一种比采用 EJB 容器以实现同样功能的另一个选择。但也不是使用了 Spring 就不能使用 EJB 了。实际上,Spring 使得访问和实现 EJB 更加方便。 Spring 分别提供了集成 JSF 和 EJB 的方法。本文将使用 Eclipse 开发一个示例来演示这个过程。


?
本文的示例实现了对产品信息的增删改查等基本操作。只用到了一个域模型:Product,下面是它的 UML 图:


?
本文的开发平台采用的是 Windows Vista 操作系统,因此以下的环境设置都是针 WindowsVista 操作系统的。
从 Java 站点 下载最新的 JDK,并安装至任意目录下。本文采用的是 jdk1.6.0_01 。 从
新建名称为 simple 的 EAR Application Project,这个工程包括 3 个工程,分别是 JPA Project、EJB Project、WEB Project,以下步骤将分别介绍这三个工程。 Target Runtime 为 JBoss v4.2,EAR version 为 5.0,Configuration 为 Default Configuration for JBoss v4.2 。如下图:

点击 Next 选择 Generate Deployment Descriptor,点击完成。


?
- 新建名称为 simpleJPA 的 JPA 工程,Configuration 为 Default Configuration for JBoss v4.2,选中 Add project to anEAR,如下图:

点击 Next,选择默认,点击完成。
编辑 JPA persistence.xml 文件,内容如下:?persistence-unit 节点可以有一个或多个,每个 persistence-unit 节点定义了持久化内容名称、使用的数据源及持久化产品专有属性。 name 属性定义了 persistence-unit 的名称,该属性是必需的,本例设置的名称为“
simpleJPA
”。在 JavaEE 环境中的默认的事务是 JTA,而在 JavaSE 环境中则为 RESOURCE_LOCAL 。使用 <jta-data-source> 指定数据源的 JNDI 名称。 Jboss 数据源的 JNDI 名称在局部命名空间,因此数据源名称前必须带有 java:/ 前缀,数据源名称大小写敏感。在本文中采用 JBoss 容器中默认的数据源,JNDI 为
java:/DefaultDS
,详情请查看:[Jboss 安装目录]/server/default/deployhsqldb-ds.xml
。<properties> 指定持久化产品的专有属性,各个应用服务器使用的持久化产品都不一样,如 Jboss 使用 Hibernate,weblogic 使用 Kodo(实际上是基于 OpenJPA 的封装),glassfish/sun application server/Oralce 使用 Toplink 。对于 Hibernate 而言,它的 hibernate.hbm2ddl.auto 属性指定实体 Bean 发布时是否同步数据库结构, 如果 hibernate.hbm2ddl.auto 的值设为 create-drop,实体 Bean 发布及卸载时将自动创建及删除相应数据库表(注意:Jboss 服务器启动或关闭时也会引发实体 Bean 的发布及卸载)。 TopLink 产品的 toplink.ddl-generation 属性也起到同样的作用。关于 Hibernate 的可用属性及默认值您可以在
[Jboss 安装目录]\server\default\deploy\ejb3.deployer\META-INF/persistence.properties
文件中找到。在开发阶段,Hibernate 的 hibernate.show_sql 和 hibernate.format_sql 属性特别有用,它们可以格式化显示 Hibernate 执行的 SQL 语句。新建名称为
org.zhouxing.simple.Product
的 Entity class, 根据示例介绍小节中的 UML 类图添加 Entity Fields,如下图:
id
为主键,在 EJB3.0 中,每个实体 Bean 必须具有一个主键,主键可以是基本类型,也可以是一个类。主键既作为实体 Bean 在内存中的标识符,也作为数据表中一行的标识符。它在实体 Bean 中是不可缺少的,并且必须是唯一的表名为
修改主键的生成方式为自增,给主键添加如下代码:product
。实体 Bean 的成员属性分别映射到product
表的对应字段。?
新建名称为 simpleEJB 的 EJB 工程,EJB Module version 为 3.0,Configuration 为 Default Configuration for JBoss v4.2,选中 Add project to anEAR,如下图:
点击 Next,取消选择 Create an EJB Clicent JAR,点击完成。
新建名称为 org.zhouxing.simple. ProductDAOBean 的 Session Bean,如下图:选择生成 Local 和 Remote 接口。
同时实现 Remote 与 Local 接口是一种比较好的做法。这样您既可以在远程访问 EJB,也可以在本地访问 EJB 。在本地接口中写出业务方法,远程接口继承本地接口的所有方法。代码如下:?
WEB Project 是本文的重点,在这小节中我们将用 JSF 通过 Spring 来调用 EJB,体验 Spring 的便利。
新建名称为 simpleWEB 的 Dynamic WEB Project,Dynamic WEB Project version 为 2.5,Configuration 为 JavaServer Faces v1.1 Project,选中 Add project to anEAR,如下图:
点击 Next,默认下一步,JSF Libraries 选择 Server Supplied JSF Implementation,修改 URL Mapping Patterns 为 *.jsf,如下图:
所有以 *.jsf 结尾的请求都有 JSF 处理。
配置 WEB Project 。拷贝 SPRING_HOME/dist/spring.jar 到 WebContent/WEB-INF/lib 目录。在 WebContent/WEB-INF 下新建 spring 配置文件 applicationContext.xml 。
一个 Spring 为框架的 Web 项目,通常以 web.xml 为入口,在 Web 应用启动时,读入 context-param 中批量的配置文件,初始化配置文件里所定义的 Bean,通过
编辑 web.xmlContextLoaderListener
在 web 应用程序的 servlet context 建立后立即执行建立 Spring 的ApplicationContext
。添加 ContextParam:
?Spring 通过 jndi-lookup 来访问 EJB,以后就可以在本地 EJB 组件,远程 EJB 或者 POJO 这些变体之间透明地切换实现方式,而不需要改变客户端的代码。
新建名称为 org.zhouxing.simple.ProductBean 的一个类作为 JSF 的 managed Bean 。 JSF 使用 JavaBean 来达到程序逻辑与视图分离的目的,在 JSF 中的 Bean 其角色是属于 Backing Bean,又称之为 Glue Bean,其作用是在真正的业务逻辑 Bean 及 UI 组件之间搭起桥梁,在 Backing Bean 中会呼叫业务逻辑 Bean 处理使用者的请求,或者是将业务处理结果放置其中,等待 UI 组件取出当中的值并显示结果给使用者。
主要有两个方法实现业务功能,代码如下:
?JSF 组件必须在 <f:view> 之间,<h:form> 会产生一个表单, <h: inputText> 来显示 product 对象的各个属性,<h:commandButton> 会产生一个提交按钮,调用 productBean 的 add 方法处理。<h:dataTable> 调用 productBean 的 getProducts 方法迭代所有 product 的信息。
?
现在该看看 simple 的运行效果了。可以导出 EAR 文件拷贝到 [Jboss 安装目录 ]\server\default 下,也可以用 Eclipse 的运行工具,下面介绍借助 Eclipse 运行应用程序。确保您的 simple 工程下的 META-INF/application.xml 文件内容包含以上开发的 3 个工程,代码如下:
?
?
右击 simple 工程选择 Run as > Run on Server 。 在 server type 选项中选择 JBoss > JBoss v4.2, 点击 Next,默认,点击 Next 完成。服务器将启动并部署应用程序。 打开 Web 浏览器,并访问 http://localhost:8080/simpleWEB/。
?
Spring 带来的解决方法是我们的代码更简洁更易扩展,不仅仅是 JSF 和 EJB,对 JDBC、Java mail、JCA 及一些开源框架都提供了很多便利。
?
?