11. 第 6 版 - 将 Web 层集成到三层 JSF/EJB 架构中
11.1. 应用程序架构
先前 Web 应用程序的架构如下:
![]() |
我们在第 7.1 节中,用 EJB 实现的 [业务、DAO、JPA] 层替换了模拟的 [业务] 层:
![]() |
11.2. Web 层的 NetBeans 项目
Web 2.0 版的 NetBeans 项目是通过复制之前的项目创建的:
![]() |
- [1]:复制新项目并将其粘贴到 [项目] 选项卡中,
- [2]:为其命名并设置文件夹,
- [3]:项目已创建,
新项目与旧项目名称相同。我们修改如下:
![]() |
- [4]: 重命名项目,
- [5]: 更改其名称以及 artifactID。
为了使该 Web 层适应新环境,我们需要进行一些调整:必须将模拟的 [business] 层替换为第 7.1 节中构建的服务器中的 [business, DAO, JPA] 层。为此,我们需要做两件事:
- 删除之前项目中存在的 [exception, business, jpa] 包。
- 为弥补这一删除,我们将第 7.1 节中构建的 EJB 服务器项目添加到 Web 项目的依赖项中。
![]() |
- 在 [1] 中,我们将一个依赖项添加到项目中,
- 在 [2] 中,我们为 [business] 层选择 Maven 项目。在 [3] 中,我们指定其类型,在 [4] 中指定其作用域。作用域设置为 `provided`,以表明它将由运行时环境提供给 Web 模块。稍后我们将看到,它将由一个企业应用程序提供,
- 在 [5] 中,已添加了该依赖项。
此时 [pom.xml] 文件如下所示:
private boolean viewInfosIsRendered;
现在我们可以移除 [business] 层中不再需要的包:
![]() |
我们还需要修改 [Form.java] Bean 中的代码:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
<type>ejb</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
第 7 行实例化了模拟的 [business] 层。现在它必须引用实际的 [business] 层。之前的代码变为如下所示:
public class Form {
public Form() {
}
// business layer
private IMetierLocal metier=new Metier();
// form fields
...
第 7 行:@EJB 注解指示将执行 Web 层的 Servlet 容器,将实现本地接口 IMetierLocal 的 EJB 注入第 8 行的业务字段中。
为什么使用本地接口 IMetierLocal 而不是 IMetierRemote 接口?因为 Web 层和 EJB 层运行在同一个 JVM 中:
![]() |
Servlet 容器中的类可以直接引用 EJB 容器中的 EJB 类。
就这样。我们的 Web 层已经准备就绪。之所以能如此简单地完成转换,是因为我们事先通过一个符合 IMetierLocal 接口的类来模拟 [业务] 层,而该接口是由实际的 [业务] 层所实现的。
11.3. 企业应用程序的 NetBeans 项目
企业应用程序允许将应用程序的[Web]层和EJB层同时部署在应用服务器上,分别位于Servlet容器和EJB容器中。
我们按以下步骤进行:
![]() |
- 在 [1] 中,我们创建一个新项目
- 在 [2] 中,选择 [Maven] 类别
- 在 [3] 中,选择 [企业应用程序] 类型
- 在 [4] 中,为项目命名
![]() |
- 在[5]中,我们选择了Java EE 6
- 在[6]中,一个企业项目最多可包含两种类型的模块:
- 一个 EJB 模块
- 一个 Web 模块
在创建企业项目时,您可以要求创建这两个模块,它们初始状态为空。企业项目仅用于部署其包含的模块。除此之外,它只是一个空壳。在此,我们希望部署:
- 一个现有的 Web 模块 [mv-pam-jsf2-alone]。因此,无需创建新的 Web 模块。
- 一个现有的 EJB 模块 [mv-pam-ejb-metier-dao-eclipselink]。同样,这里也不需要创建新的模块。
在 [6] 中,我们创建了一个不包含模块的企业项目。我们将稍后为其添加 Web 模块和 EJB 模块。
- 在 [7] 中,已创建了两个 Maven 项目。带有 .ear 后缀的是企业项目。另一个项目是前者的父 Maven 项目。我们在此不涉及该项目。
我们将 Web 模块和 EJB 模块添加到企业项目中:
![]() |
- 在 [1] 中,添加一个新依赖项,
- 在 [2] 中,添加 EJB 项目 [mv-pam-ejb-metier-dao-eclipselink]。请注意其 EJB 类型,
- 在 [3] 中,添加 Web 项目 [mv-pam-jsf2-ejb]。请注意其类型为 war。
此时 [pom.xml] 文件如下:
public class Form {
public Form() {
}
// business layer
@EJB
private IMetierLocal metier;
// form fields
在部署企业应用程序 [mv-pam-webapp-ear] 之前,请确保 MySQL 数据库 [dbpam_eclipselink] 已存在且已填充数据。完成此操作后,即可部署企业应用程序 [mv-pam-webapp-ear]:
![]() |
- 在 [1] 中,企业应用程序已部署
- 在 [2] 中,企业应用程序 [mv-pam-webapp-ear] 已成功部署。
在浏览器中,将显示以下页面:
![]() |
- 在 [1] 中,请求的 URL
- 在 [2] 中,员工列表已填充了来自 dbpam 数据库中 [Employees] 表的条目。
欢迎读者重现 Web 版本 1 中的测试。以下是一个执行示例:












